Что такое Docker?
Home Assistant, Zigbee2MQTT, Mosquitto, Frigate, Grafana, InfluxDB, AdGuard Home, Node-RED, Portainer — на одном сервере. Каждый со своими зависимостями, библиотеками, версиями Python. Без Docker это был бы ад: конфликты версий, сломанные обновления, зависимости, тянущие за собой половину репозитория. С Docker — каждый сервис живёт в своей изолированной коробке и понятия не имеет о соседях.
Docker — это платформа для запуска приложений в контейнерах. Контейнер — это изолированная среда, внутри которой приложение думает, что оно одно на целом компьютере. У него свои файлы, свои библиотеки, своя конфигурация. Но при этом контейнер разделяет ядро операционной системы с хост-машиной и другими контейнерами — в отличие от виртуальной машины, которая несёт внутри себя целую ОС.
Аналогия: виртуальная машина — это отдельная квартира с собственными стенами, полом, потолком, водопроводом и электрикой. Контейнер — это комната в коммунальной квартире: стены свои, но водопровод и электричество — общие. Гораздо легче, быстрее, экономнее по ресурсам.
Docker появился в 2013 году и за десять с лишним лет стал стандартом развёртывания серверных приложений — от стартапов до крупнейших компаний мира. Для домашних серверов и умных домов он подходит не хуже, чем для корпоративных.
Каждый контейнер — отдельное окружение. Mosquitto не знает, что рядом работает Grafana. Zigbee2MQTT не конфликтует с Home Assistant из-за разных версий Node.js. Обновление одного сервиса не ломает другой. Если контейнер сломался — остальные продолжают работать.
Это особенно ценно, когда на одном сервере крутятся десять разных приложений. Без изоляции — обновили Python для одного, сломали другой. С Docker — каждый несёт свой Python внутри контейнера.
Конфигурация Docker описывается в файле docker-compose.yml. Этот файл — полная инструкция по развёртыванию: какие контейнеры запускать, с какими параметрами, какие порты открывать, какие директории монтировать. Скопировали файл на другой сервер, запустили docker compose up — всё поднялось. Точно так же, как на старом сервере. Никаких «а у меня на том компьютере работало, а на этом — нет».
Переезд на новый сервер с Docker — часы, а не дни. Скопировали docker-compose.yml, скопировали директории с данными, запустили — работает.
Установить Frigate вручную — это десяток зависимостей, компиляция, настройка прав, решение конфликтов. Установить Frigate в Docker — одна команда или пять строк в docker-compose.yml. Кто-то уже собрал образ со всеми зависимостями, протестировал и опубликовал. Вы просто скачиваете и запускаете.
Обновили контейнер — что-то пошло не так. С Docker откат — это смена тега образа на предыдущую версию и перезапуск. Тридцать секунд. Без Docker — откатывать вручную, искать, какие файлы изменились, молиться. С Docker — данные лежат в примонтированных директориях, сам контейнер — одноразовый. Удалил, пересоздал из старого образа — всё вернулось.
Docker-контейнеры не мусорят в хостовой ОС. Все библиотеки, файлы конфигурации, временные файлы — внутри контейнера. Удалили контейнер — ничего не осталось (кроме данных, которые вы явно сохранили в примонтированных директориях). Хост-система остаётся чистой.
Образ — это шаблон, из которого создаётся контейнер. Неизменяемый набор файлов: операционная система (обычно минимальная, на базе Alpine или Debian), приложение, его зависимости и конфигурация по умолчанию.
Образы хранятся в реестрах (registries). Самый популярный — Docker Hub. Для домашних сервисов часто используется GitHub Container Registry (ghcr.io). Образ скачивается один раз и хранится локально. При обновлении скачивается только изменившийся слой.
Пример: eclipse-mosquitto:2.0 — образ Mosquitto версии 2.0 из Docker Hub. ghcr.io/blakeblackshear/frigate:stable — образ Frigate из GitHub Container Registry, стабильная версия.
Контейнер — это работающий экземпляр образа. Образ — чертёж. Контейнер — построенный по чертежу дом, в котором кто-то живёт. Из одного образа можно запустить несколько контейнеров (хотя в домашнем использовании это редко нужно).
Контейнер можно остановить, запустить, перезапустить, удалить. При удалении теряются только данные внутри контейнера — всё, что лежит в примонтированных директориях (volumes), сохраняется.
Контейнер — эфемерный. Удалил — данные пропали. Чтобы сохранить данные между пересозданиями контейнера, используют тома и привязки директорий.
Bind mount — директория на хост-системе, которая «проецируется» внутрь контейнера. Пример: директория /opt/homeassistant/config на хосте монтируется как /config внутри контейнера Home Assistant. Контейнер пишет конфигурацию в /config — на самом деле она сохраняется на хосте в /opt/homeassistant/config. Удалили контейнер, создали новый — конфигурация на месте.
Docker volume — именованный том, управляемый Docker. Менее прозрачный, чем bind mount (файлы хранятся в служебной директории Docker), но удобный для некоторых сценариев.
Для домашнего сервера bind mount обычно удобнее: файлы лежат в понятном месте, их легко резервировать и редактировать.
Docker создаёт виртуальные сети для контейнеров. По умолчанию каждый контейнер получает IP-адрес во внутренней сети Docker и может обращаться к другим контейнерам по имени.
В docker-compose.yml все контейнеры, описанные в одном файле, автоматически попадают в общую сеть и видят друг друга по имени сервиса. Zigbee2MQTT обращается к Mosquitto не по IP-адресу, а просто по имени mosquitto — Docker DNS резолвит это имя в IP контейнера.
Для доступа извне (из домашней сети) контейнер «пробрасывает» порты на хост: ports: "8123:8123" означает «порт 8123 на хосте → порт 8123 в контейнере». Обращаетесь к http://IP-сервера:8123 — попадаете в Home Assistant внутри контейнера.
Иногда контейнеру нужен доступ к локальной сети так, как если бы он был отдельным устройством (для mDNS, для обнаружения устройств). В этом случае используют network_mode: host — контейнер разделяет сетевой стек с хостом. Home Assistant часто рекомендуют запускать именно так.
Docker Compose — это инструмент для описания и запуска многоконтейнерных приложений. Вместо ручного запуска каждого контейнера командой docker run ... — описываете всё в одном YAML-файле и запускаете одной командой docker compose up -d.
Пример docker-compose.yml для минимального умного дома:
yamlservices:
mosquitto:
image: eclipse-mosquitto:2
restart: unless-stopped
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
zigbee2mqtt:
image: koenkk/zigbee2mqtt
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./zigbee2mqtt/data:/app/data
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
restart: unless-stopped
network_mode: host
volumes:
- ./homeassistant/config:/config
privileged: true
Три сервиса, один файл, одна команда. docker compose up -d — и через минуту у вас Mosquitto, Zigbee2MQTT и Home Assistant. docker compose down — всё остановилось. docker compose pull && docker compose up -d — все три обновились до последних версий.
Home Assistant. Основной контроллер умного дома. Часто запускается в network_mode: host для обнаружения устройств по mDNS. Конфигурация, автоматизации, дашборды — всё в примонтированной директории /config.
Mosquitto. MQTT-брокер. Лёгкий, запускается за секунду. Конфигурация и файл паролей — в примонтированной директории.
Zigbee2MQTT. Мост между Zigbee-координатором и MQTT. Требует проброса USB-устройства (координатора) внутрь контейнера через devices.
Frigate. NVR с ИИ-детекцией. Требует проброса GPU или Coral TPU. Для NVIDIA — runtime: nvidia. Для Coral USB — devices: /dev/bus/usb. Потребляет больше ресурсов, чем остальные.
Grafana + InfluxDB. Визуализация и хранение данных. Два контейнера, которые общаются между собой по внутренней Docker-сети. Данные InfluxDB — в примонтированном томе, чтобы не потерять историю при обновлении.
AdGuard Home. DNS-фильтрация. Пробрасывает порт 53 (DNS) и порт 3000 (веб-интерфейс). В network_mode: host — если нужно слушать на конкретных интерфейсах.
Nginx Proxy Manager. Обратный прокси. Пробрасывает порты 80 и 443. Все остальные контейнеры за ним — без проброса портов наружу.
Home Assistant можно установить несколькими способами. Два наиболее популярных для домашнего использования.
Home Assistant OS (HAOS). Целая операционная система, оптимизированная для HA. Устанавливается на Raspberry Pi или x86-ПК как единственная ОС. Внутри — свой Docker (под управлением Supervisor), аддоны (Mosquitto, Zigbee2MQTT, Frigate — ставятся из магазина в один клик). Проще всего. Не требует знания Docker.
Home Assistant Container. Docker-контейнер с Home Assistant, который вы запускаете на собственном Linux-сервере рядом с другими контейнерами. Вся остальная инфраструктура (Mosquitto, Zigbee2MQTT, Grafana) — отдельные контейнеры, настраиваемые вручную через docker-compose.yml. Гибче, но требует знания Docker.
Если вы готовы потратить вечер на изучение Docker — вариант «Container» даёт больше контроля. Если хотите «поставил и забыл» — HAOS проще и поддерживается «из коробки».
Третий путь — Home Assistant Supervised: Docker под управлением Supervisor, но на произвольной ОС. Даёт аддоны как в HAOS, но на вашем Linux. Официально поддерживается только на Debian — и при этом требует соблюдения строгих условий.
bashdocker compose up -d # запустить все контейнеры в фоне
docker compose down # остановить и удалить контейнеры
docker compose pull # скачать обновлённые образы
docker compose logs -f # смотреть логи в реальном времени
docker compose restart mqtt # перезапустить конкретный сервис
Этого набора команд хватает для повседневного управления.
Веб-интерфейс для управления Docker. Показывает все контейнеры, их состояние, потребление ресурсов, логи. Позволяет останавливать, перезапускать, удалять контейнеры через браузер. Для тех, кто предпочитает GUI командной строке.
Сам Portainer — тоже Docker-контейнер. Рекурсия.
Автоматическое обновление контейнеров. Watchtower периодически проверяет, появились ли новые версии образов, скачивает их и пересоздаёт контейнеры. Удобно, но опасно: автоматическое обновление может сломать работающую систему. Для критичных сервисов (Home Assistant, Zigbee2MQTT) лучше обновлять вручную, проверив changelog. Diun — альтернатива, которая только уведомляет о доступных обновлениях, но не обновляет автоматически. Безопаснее.
С Docker резервное копирование сводится к двум вещам: файл docker-compose.yml и директории с данными (volumes / bind mounts).
Скопировали docker-compose.yml и все примонтированные директории — у вас полный бэкап всей инфраструктуры. Перенесли на другой сервер, запустили docker compose up -d — всё восстановилось.
Автоматизировать можно через cron + rsync, Borg Backup, Restic или любой другой инструмент резервного копирования. Главное — регулярность и хранение копий на отдельном носителе (NAS, внешний диск, облако).
Порог входа. Docker — это не «установил и забыл». Нужно понимать концепции образов, контейнеров, томов, сетей. Для человека без опыта администрирования Linux — кривая обучения ощутима. Но одного вечера с документацией обычно хватает для базовых навыков.
Потребление ресурсов. Docker добавляет минимальный оверхед по сравнению с «голыми» приложениями. Но каждый контейнер несёт внутри себя свои библиотеки — суммарный объём может быть значительным (гигабайты дискового пространства на десяток контейнеров). На Raspberry Pi с SD-картой — место может стать проблемой. SSD решает.
Проброс оборудования. USB-устройства (Zigbee-координатор, Coral TPU), GPU, Bluetooth-адаптеры — всё это нужно явно пробросить в контейнер. Иногда это тривиально (devices), иногда — требует дополнительной настройки (udev rules, драйверы на хосте).
Не для всего. Сетевое оборудование (OpenWrt на роутере), firmware устройств (Tasmota, ESPHome) — это не Docker. Docker — для серверных приложений на Linux-хосте.
Docker — это стандарт развёртывания сервисов умного дома. Не единственный способ, но самый практичный. Изоляция, воспроизводимость, простота обновления и отката — всё это превращает хаос из десятка разнородных приложений в управляемую, предсказуемую инфраструктуру.
Один docker-compose.yml описывает весь ваш умный дом: от MQTT-брокера до видеорегистратора с ИИ. Один файл, который можно хранить в Git, версионировать, копировать на новый сервер. Это не просто удобство — это дисциплина, которая спасает часы при неизбежном переезде, восстановлении или расширении системы.
Если вы ещё не используете Docker — попробуйте. Начните с Mosquitto и Zigbee2MQTT. Два контейнера, десять строк в docker-compose.yml, пять минут до работающей системы. А дальше — затянет.
Статья подготовлена на основе документации Docker, Docker Compose и материалов сообщества Home Assistant. Все упомянутые торговые марки принадлежат их правообладателям. Материал носит информационный характер и не является рекламой.