Почти любую домашнюю программу для сервера сегодня ставят через Docker: фотоархив Immich, медиасервер Jellyfin, блокировщик рекламы AdGuard Home. В инструкциях к ним стоит пара строк про docker compose up -d, и дальше всё работает. Но если Docker вы ещё ни разу не запускали, эти строки выглядят как заклинание.
Проще всего представить Docker как транспортный контейнер. Раньше груз возили россыпью, и в каждом порту его перекладывали по-своему. Потом придумали стандартный железный ящик: что внутри, неважно, кран и корабль работают с ним одинаково. Docker делает то же с программами. Разработчик упаковывает программу вместе со всем, что ей нужно, а вы запускаете этот «ящик» одной командой. Ничего не надо доустанавливать, и программа не мешает соседям.
Ниже пошагово: установка, первая проверка, настоящий полезный сервис (мониторинг сайтов Uptime Kuma) и команды, которые понадобятся каждый день. Всё проверено на тестовом компьютере, выводы команд настоящие.
Коротко
- Docker запускает программы в изолированных «контейнерах». Программа ставится одной командой и удаляется без следов.
- Установка на Ubuntu или Debian занимает пару минут: официальный скрипт или пакеты из репозитория системы.
- Compose-файл описывает сервис целиком: какой образ, какой порт, где хранить данные. Запуск:
docker compose up -d. - Данные держите в папке рядом с compose-файлом. Бэкап сервиса - это копия этой папки.
- Первый сервис из статьи, Uptime Kuma, скачался и запустился у меня примерно за полторы минуты.
Зачем это дома
Если у вас есть домашний сервер или просто компьютер, который работает круглосуточно, Docker превращает его в «магазин приложений»:
- Immich - замена Google Фото: автозагрузка с телефонов, поиск по лицам и по смыслу.
- Jellyfin - свой «Кинопоиск» для фильмов и сериалов с диска, смотреть можно на телевизоре и телефоне.
- AdGuard Home - блокировка рекламы и трекеров сразу на всех устройствах в доме.
- Uptime Kuma - следит, работают ли ваши сайты и сервисы, и пишет в Telegram, если что-то упало.
- Open WebUI - веб-интерфейс для своей нейросети, подробно в статье Ollama и Open WebUI.
Главные плюсы Docker для дома:
- Одна инструкция на все системы. Образ одинаково работает на Ubuntu, Debian и даже в Windows.
- Ничего не ломается при установке. Программе нужна особая версия Python или базы данных? Она лежит внутри контейнера и не конфликтует с системой.
- Удаление без мусора. Удалили контейнер и образ - программы больше нет, в системе ничего не осталось.
- Обновление двумя командами вместо ручной переустановки.
Словарик: пять слов, без которых никак
| Термин | Что это | Аналогия |
|---|---|---|
| Образ (image) | Упакованная программа со всеми зависимостями. Скачивается из интернета, сам по себе не работает | Установочный диск или коробка с мебелью из магазина |
| Контейнер (container) | Запущенный экземпляр образа. Из одного образа можно запустить несколько контейнеров | Собранный шкаф, который уже стоит в комнате |
| Том (volume) | Место, где контейнер хранит данные. Переживает удаление и обновление контейнера | Ящик в шкафу, который можно вынуть и переставить в новый шкаф |
| Порт | «Дверь», через которую к контейнеру обращаются по сети. 3001:3001 значит: порт 3001 компьютера ведёт в порт 3001 контейнера |
Номер квартиры в доме с общим адресом |
| Compose-файл | Текстовый файл compose.yaml с описанием сервиса: образ, порты, папки с данными |
Инструкция по сборке, по которой шкаф собирается сам |
Важная мысль: контейнер одноразовый. При обновлении его удаляют и создают заново из нового образа. Всё ценное должно лежать в томе, иначе пропадёт вместе со старым контейнером.
Шаг 1. Установить Docker
Ubuntu и Debian
Это основной путь: на Linux Docker работает «родным» образом, без прослоек. Есть два способа, выберите один.
Способ 1. Официальный скрипт Docker. Ставит самую свежую версию прямо с сайта Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.shСкрипт сам определит систему, подключит репозиторий Docker и поставит всё нужное, включая Compose. Разработчики предупреждают, что скрипт предназначен для быстрой установки, а не для рабочих серверов компаний. Для домашнего сервера он подходит. Посмотреть, что скрипт будет делать, не выполняя команды, можно так: sudo sh get-docker.sh --dry-run.
Способ 2. Пакеты из репозитория Ubuntu. Версия чуть старее, зато обновляется вместе с системой. Именно так Docker стоит на моём тестовом компьютере:
sudo apt update
sudo apt install -y docker.io docker-compose-v2В Debian вместо docker-compose-v2 может понадобиться пакет docker-compose - зависит от версии системы. Если сомневаетесь, используйте способ 1: он одинаково работает в Ubuntu и Debian.
Разрешить запуск без sudo
По умолчанию Docker слушается только администратора, и каждую команду пришлось бы начинать с sudo. Добавьте себя в группу docker:
sudo usermod -aG docker $USERЗатем выйдите из системы и зайдите снова (или перезагрузитесь), чтобы группа применилась.
Проверьте, что Docker запускается вместе с системой (скрипт и пакеты обычно включают это сами):
sudo systemctl enable --now dockerИ посмотрите версии:
docker --version
docker compose versionDocker version 29.1.3, build 29.1.3-0ubuntu3~24.04.2
Docker Compose version 2.40.3+ds1-0ubuntu1~24.04.1Обратите внимание: docker compose пишется через пробел. Старая отдельная программа docker-compose через дефис устарела, и в свежих инструкциях её уже не используют. Если где-то в старой статье видите docker-compose up, просто пишите docker compose up.
Windows
На Windows есть два пути.
- Docker Desktop. Обычная программа с установщиком и окном, где видны контейнеры. Нужна Windows 10 22H2 или Windows 11 и включённая виртуализация. Для личного использования бесплатна. Платная подписка нужна компаниям от 250 сотрудников или с выручкой от 10 млн долларов в год.
- Ubuntu в WSL. Ставите Ubuntu из Microsoft Store (или командой
wsl --install -d Ubuntu-24.04), а внутри неё Docker так же, как описано выше. Так сделан мой тестовый стенд для этой статьи.
Для экспериментов Windows подходит. Но для сервера, который работает круглосуточно, лучше отдельный компьютер с Linux: это надёжнее и экономнее. Из чего его собрать, разобрано в статье Домашний сервер: зачем он нужен и из чего его собрать.
Шаг 2. Проверить: hello-world
Запустите тестовый контейнер:
docker run hello-worldDocker не найдёт образ на компьютере, скачает его из каталога Docker Hub, запустит и покажет приветствие:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.Фраза «your installation appears to be working correctly» означает, что всё установлено правильно: Docker скачал образ, создал из него контейнер, тот вывел текст и завершился. Образ весит меньше 30 КБ.
Шаг 3. Первый полезный сервис: Uptime Kuma
Uptime Kuma - это мониторинг: раз в минуту он проверяет ваши сайты, роутер, сервер или любой адрес и сообщает, если что-то перестало отвечать. Уведомления умеет слать в Telegram, на почту и ещё в десятки мест. Программа бесплатная, с открытым кодом, и хорошо подходит для первого знакомства с Docker: один контейнер, одна папка с данными.
Создать папку и compose-файл
Каждому сервису удобно выделять свою папку. В ней будут лежать и описание сервиса, и его данные:
mkdir -p ~/docker/uptime-kuma
cd ~/docker/uptime-kuma
nano compose.yamlВставьте в файл:
services:
uptime-kuma:
# Образ: программа и версия. Тег 2 значит «последняя версия 2.x»,
# так при обновлении не будет неожиданного перехода на версию 3
image: louislam/uptime-kuma:2
# Имя контейнера, чтобы его было легко узнать в списке
container_name: uptime-kuma
# Перезапускать контейнер после сбоя и после перезагрузки компьютера,
# если только вы сами его не остановили
restart: unless-stopped
# Порт компьютера : порт внутри контейнера.
# Открывать в браузере: http://адрес-сервера:3001
ports:
- "3001:3001"
# Папка data рядом с этим файлом станет папкой /app/data внутри контейнера.
# Здесь хранятся настройки, база и история проверок
volumes:
- ./data:/app/dataСохраните файл: Ctrl+O, Enter, Ctrl+X.
Отступы в YAML важны: только пробелы, никаких табуляций, вложенные строки сдвинуты на два пробела. Если Docker ругается на файл, первым делом проверьте отступы.
Запустить
docker compose up -dup создаёт и запускает всё, что описано в файле. -d означает «в фоне»: команда вернёт вам терминал, а сервис продолжит работать.
При первом запуске Docker скачивает образ. У меня это заняло 1 минуту 12 секунд. Образ Uptime Kuma сжатым весит около 600 МБ, а после распаковки Docker показывает 2,49 ГБ занятого места. Для сравнения: весь Immich занимает около 5 ГБ.
uptime-kuma Pulled
Network uptime-kuma_default Created
Container uptime-kuma Created
Container uptime-kuma StartedПроверьте, что контейнер работает:
docker compose psNAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
uptime-kuma louislam/uptime-kuma:2 "/usr/bin/dumb-init …" uptime-kuma 27 seconds ago Up 25 seconds (healthy) 0.0.0.0:3001->3001/tcp, [::]:3001->3001/tcpГлавное здесь - столбец STATUS: Up значит «работает», (healthy) значит, что контейнер сам проверил себя и доволен. Сразу после старта там может быть (health: starting), подождите полминуты.
Что происходит внутри, показывает журнал:
docker compose logs --tail 20uptime-kuma | Welcome to Uptime Kuma
uptime-kuma | Your Node.js version: 22.22.3
uptime-kuma | 2026-09-18T15:33:14Z [SERVER] INFO: Uptime Kuma Version: 2.5.5
uptime-kuma | 2026-09-18T15:33:15Z [SERVER] INFO: Server Type: HTTP
uptime-kuma | 2026-09-18T15:33:15Z [SERVER] INFO: Data Dir: ./data/
uptime-kuma | 2026-09-18T15:33:15Z [SETUP-DATABASE] INFO: Starting Setup Database
uptime-kuma | 2026-09-18T15:33:15Z [SETUP-DATABASE] INFO: Listening on:
uptime-kuma | 2026-09-18T15:33:15Z [SETUP-DATABASE] INFO: - http://localhost:3001Время в журналах Docker по умолчанию в UTC, поэтому оно на 3 часа меньше московского. Это нормально.
А сколько контейнер берёт ресурсов:
docker stats --no-streamCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0da40ecc69f8 uptime-kuma 0.01% 109.8MiB / 15.32GiB 0.70% 2.27kB / 1.18kB 0B / 0B 12Около 110 МБ памяти и почти ноль процессора. Такой сервис не заметит даже старый ноутбук.
Открыть в браузере
Откройте http://localhost:3001, если браузер на том же компьютере, или http://IP-сервера:3001 с другого устройства в домашней сети. Узнать IP сервера можно командой hostname -I (нужен первый адрес из списка).
Первый экран спросит, какую базу данных использовать. Выберите встроенную SQLite: для дома её хватает с запасом, а отдельную базу MariaDB имеет смысл брать только на сотни проверок. Через несколько секунд Uptime Kuma перейдёт к созданию учётной записи: придумайте логин и надёжный пароль. Интерфейс можно переключить на русский в настройках.
Первая проверка сайта
- Нажмите «Добавить» (Add New Monitor).
- Тип монитора: HTTP(s).
- Понятное имя: например, «Мой сайт».
- URL: адрес сайта целиком, с
https://. - Интервал проверки: по умолчанию 60 секунд, для дома этого достаточно.
- Сохраните.
Через минуту появится зелёная полоска и время отклика. Дальше можно добавить уведомления: в настройках выберите Telegram, укажите токен своего бота и ID чата, и при падении сайта придёт сообщение.
Что ещё удобно мониторить дома: сам роутер (тип Ping, адрес вроде 192.168.1.1), свои сервисы на сервере и внешний сайт вроде ya.ru, чтобы видеть, когда пропадал интернет.
Шаг 4. Команды на каждый день
Все команды docker compose выполняются в папке сервиса, там, где лежит compose.yaml. Если вы в другой папке, сначала перейдите: cd ~/docker/uptime-kuma.
| Что сделать | Команда | Что происходит |
|---|---|---|
| Запустить (или применить изменения в compose.yaml) | docker compose up -d |
Создаёт и запускает контейнер |
| Остановить | docker compose stop |
Контейнер остановлен, но не удалён |
| Снова запустить после stop | docker compose start |
Запускает остановленный контейнер |
| Перезапустить | docker compose restart |
Остановить и запустить |
| Посмотреть состояние | docker compose ps |
Работает ли, сколько времени |
| Журнал | docker compose logs --tail 50 |
Последние 50 строк. С ключом -f журнал идёт в реальном времени, выход Ctrl+C |
| Обновить | docker compose pull && docker compose up -d |
Скачать новый образ и пересоздать контейнер |
| Удалить контейнер | docker compose down |
Контейнер удалён, папка data осталась |
| Все контейнеры на компьютере | docker ps |
Список работающих контейнеров всех сервисов |
| Сколько занято места | docker system df |
Место под образы, контейнеры и тома |
Как выглядит обновление
docker compose pull && docker compose up -dЕсли новой версии нет, Docker просто сверит образ и ничего не тронет:
uptime-kuma Pulling
uptime-kuma Pulled
Container uptime-kuma RunningЕсли новая версия есть, строк будет больше: Docker скачает изменения, остановит старый контейнер и создаст новый. Настройки и история сохранятся, потому что они лежат в папке data, а не внутри контейнера.
Старые версии образов после обновления остаются на диске. Удалить неиспользуемые образы можно командой docker image prune: она спросит подтверждение и удалит только образы без тегов, которые не использует ни один контейнер.
Где лежат данные и как делать бэкап
В нашем compose-файле строка ./data:/app/data означает: всё, что программа пишет в /app/data, на самом деле лежит в папке ~/docker/uptime-kuma/data. Её можно открыть, скопировать, перенести на другой компьютер.
Отсюда простое правило: бэкап сервиса = папка сервиса целиком, вместе с compose.yaml и data. Чтобы восстановить сервис на новом компьютере, достаточно поставить Docker, скопировать папку и выполнить docker compose up -d.
Для надёжной копии остановите сервис, чтобы база не менялась во время копирования:
cd ~/docker/uptime-kuma
docker compose stop
sudo tar czf ~/uptime-kuma-$(date +%F).tar.gz .
docker compose startПолучится архив вида uptime-kuma-2026-09-18.tar.gz. Его и отправляйте на внешний диск или в облако. sudo нужен потому, что часть файлов в data создаёт процесс внутри контейнера от имени root, и обычный пользователь не может их прочитать.
Типичные ошибки
permission denied на docker.sock
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sockВас нет в группе docker, или вы добавились, но не перезашли в систему. Выполните sudo usermod -aG docker $USER, выйдите из системы и зайдите снова. Проверить, что группа применилась, можно командой groups: в списке должно быть слово docker.
Порт уже занят
Bind for 0.0.0.0:3001 failed: port is already allocatedПорт 3001 уже использует другая программа или другой контейнер. Поменяйте левое число в compose-файле, например "3002:3001", и выполните docker compose up -d. Правое число трогать не нужно: это порт внутри контейнера. Открывать сервис теперь надо по адресу http://адрес-сервера:3002. Посмотреть, кто занял порт: sudo ss -ltnp | grep 3001.
Контейнер постоянно перезапускается
В docker compose ps статус прыгает: Restarting (1) 5 seconds ago. Контейнер падает при старте, а restart: unless-stopped снова и снова его поднимает. Причина всегда написана в журнале:
docker compose logs --tail 50Чаще всего это ошибка в compose-файле или .env (опечатка в пароле, неверный путь к папке), нехватка памяти или нет прав на папку с данными.
Закончилось место на диске
Образы и старые версии постепенно копятся. Посмотрите, что занимает место:
docker system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 6 2 7.566GB 2.487GB (32%)
Containers 2 1 262.1kB 4.096kB (1%)
Local Volumes 1 0 2.879GB 2.879GB (100%)
Build Cache 0 0 0B 0BСтолбец RECLAIMABLE показывает, сколько можно освободить. Начните с docker image prune: он удаляет только «осиротевшие» образы.
Не скачивается образ: i/o timeout
failed to resolve reference "docker.io/louislam/uptime-kuma:2": ... dial tcp ...:443: i/o timeoutDocker не смог связаться с Docker Hub. Сначала просто повторите команду: на тестовом стенде такая ошибка случалась, а через минуту образ скачивался. Если ошибка повторяется постоянно, пропишите зеркало реестра. Например, Google держит бесплатную копию популярных образов Docker Hub на mirror.gcr.io. Создайте файл настроек:
sudo nano /etc/docker/daemon.json{
"registry-mirrors": ["https://mirror.gcr.io"]
}И перезапустите Docker:
sudo systemctl restart dockerКоманду docker compose pull менять не нужно: Docker сам попробует зеркало, а если образа там нет, пойдёт на Docker Hub. Проверить, что зеркало подхватилось: docker info, раздел «Registry Mirrors». Свои зеркала Docker Hub есть и у российских облачных провайдеров, например у Timeweb Cloud (https://dockerhub.timeweb.cloud).
Что ставить дальше
Когда Uptime Kuma заработала, вы умеете всё, что нужно для остальных сервисов: у каждого есть готовый compose-файл в официальной инструкции.
- Immich - фото и видео со всех телефонов семьи. Самый популярный сервис для домашнего сервера, но и самый требовательный: около 5 ГБ образов и от 6 ГБ оперативной памяти.
- Jellyfin - медиасервер для фильмов и сериалов.
- AdGuard Home - блокировка рекламы для всей домашней сети.
- Open WebUI - веб-интерфейс для нейросети на своём компьютере. Пошагово в статье Ollama и Open WebUI.
Если железа под сервер ещё нет, начните со статьи Домашний сервер: зачем он нужен и из чего его собрать.
Частые вопросы
Docker бесплатный?
Сам Docker Engine на Linux бесплатный и с открытым кодом. Docker Desktop для Windows и macOS бесплатен для личного использования, учёбы и небольших компаний (до 250 сотрудников и до 10 млн долларов выручки в год).
Чем Docker отличается от виртуальной машины?
Виртуальная машина эмулирует целый компьютер со своей операционной системой, поэтому тяжёлая. Контейнер использует ядро основной системы и запускает только саму программу. Он стартует за секунды и берёт памяти ровно столько, сколько нужно программе: Uptime Kuma, например, около 110 МБ.
Что будет с контейнерами после перезагрузки компьютера?
Если в compose-файле стоит restart: unless-stopped, а сам Docker включён в автозагрузку (sudo systemctl enable docker), контейнеры запустятся сами. Исключение - те, что вы остановили вручную командой docker compose stop.
Нужно ли знать Linux, чтобы пользоваться Docker?
Хватит базовых вещей: переходить по папкам (cd), редактировать файл (nano) и копировать команды из инструкций. Всё остальное делается командами из таблицы выше.
Можно ли запускать несколько сервисов на одном компьютере?
Да, для этого Docker и нужен. Каждому сервису своя папка со своим compose.yaml, главное, чтобы у них не совпадали левые номера портов.

Комментарии
Пока никто не написал. Будьте первым.