Контейнеры удобны тем, что обновление образа не требует пересборки приложения. Но следить за десятком сервисов вручную утомительно: нужно сравнить теги, остановить контейнер, поднять новый и проверить логи. Watchtower автоматизирует эту рутину, опрашивая реестр и перезапуская контейнеры с новыми образами. Ниже — установка, выборочные обновления, откат и меры предосторожности.
Как работает Watchtower
Сервис подключается к Docker API, периодически проверяет digest образа в реестре и сравнивает его с локальным. Если появилась новая версия, Watchtower загружает её, останавливает контейнер и создаёт новый с теми же параметрами. Файл docker-compose.yml при этом не меняется, а тег остаётся прежним — обновляется только содержимое образа.
Важно понимать границы: Watchtower не выполняет миграции баз данных, не проверяет здоровье приложения и не откатывает изменения. Для stateful-сервисов вроде PostgreSQL, Nextcloud или GitLab автоматическое обновление без бэкапа — плохая идея. Ещё один нюанс — архитектура: образ для amd64 не заменит arm64-сборку, поэтому на Raspberry Pi и других ARM-платах проверяйте наличие нужного манифеста.
Установка через Docker Compose
Добавьте отдельный сервис в compose-файл. Сокет Docker монтируется внутрь контейнера, потому что иначе Watchtower не сможет управлять соседними контейнерами. Каталог с конфигурацией нужен для настроек и кэша.
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./watchtower:/config
environment:
- TZ=Europe/Moscow
- WATCHTOWER_CLEANUP=false
- WATCHTOWER_SCHEDULE=0 0 4 * * *
Оригинальный образ containrrr/watchtower долгое время находится в режиме поддержки, поэтому проверьте, какая сборка актуальна: сообщество ведёт форк nicholas-fedor/watchtower. Перед сменой образа прочитайте release notes и закрепите digest, чтобы обновление было предсказуемым.
docker compose up -d watchtower
docker compose logs -f watchtower
После старта убедитесь, что контейнер не перезапускается по кругу. Частая причина — опечатка в расписании или отсутствие доступа к сокету. Логи в интерактивном режиме показывают первые проверки и список найденных контейнеров.
Первый запуск и проверка
Не начинайте с боевого сервера. Запустите Watchtower в режиме мониторинга: он покажет, какие контейнеры обновились бы, но ничего не тронет. Затем проверьте логи и только после этого переходите к реальным действиям.
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once --monitor-only
docker compose logs watchtower --tail 100
Флаг —run-once выполняет один цикл и завершается, что удобно для cron или ручной проверки. В постоянном режиме интервал по умолчанию — сутки; расписание задаётся через cron из шести полей, где первое поле — секунды.
Выборочные обновления
Обновлять всё подряд опасно. Включите режим label-enable, чтобы Watchtower трогал только контейнеры с разрешающей меткой. Остальные сервисы останутся под ручным контролем.
- com.centurylinklabs.watchtower.enable=true — разрешить обновление.
- com.centurylinklabs.watchtower.enable=false — исключить сервис.
- com.centurylinklabs.watchtower.monitor-only=true — только уведомлять.
docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_LABEL_ENABLE=true \
containrrr/watchtower --interval 3600
Метки ставятся в compose-файле сервиса. Такой подход удобен для домашнего сервера: обновляются только простые stateless-контейнеры, а базы и файловые хранилища остаются на обслуживании по расписанию.
Расписание и уведомления
Ночное окно снижает риск, что обновление совпадёт с работой пользователей. Не ставьте обновление на час, когда начинается резервное копирование: два тяжёлых процесса будут мешать друг другу. Уведомления через Shoutrrr помогают узнать о проблеме, не заходя на сервер: Watchtower умеет отправлять сообщения в почту, мессенджеры и вебхуки, если задать URL получателя.
Секреты храните в env-файле с правами 600, а не в репозитории. Если уведомления не приходят, проверьте синтаксис URL и доступ контейнера в сеть. Для приватных реестров подключите конфигурацию Docker с учётными данными и убедитесь, что Watchtower читает её из правильного пути.
Публичный Docker Hub ограничивает число анонимных загрузок, поэтому при десятке контейнеров лучше авторизоваться или использовать собственное зеркало. Иначе обновление может упасть с ошибкой лимита, а сервис останется на старой версии.
Базы данных и состояние
Watchtower перезапускает контейнер, но не готовит приложение к новой схеме. Перед обновлением PostgreSQL, MariaDB, Nextcloud и аналогичных сервисов делайте дамп и проверяйте совместимость версий. Для compose-стека надёжнее ручная схема: сначала pull, затем up -d и проверка здоровья.
docker compose pull
docker compose up -d
docker compose ps
Если сервис не поднялся, вернитесь к предыдущему образу. Держите его локально: агрессивная очистка удаляет точку отката. Флаг —cleanup удобен, но включайте его только там, где откат не нужен.
Откат и версии
Перед обновлением зафиксируйте digest текущего образа. Если новая версия сломалась, разверните контейнер по старому digest или тегу. Тег latest не гарантирует предсказуемость: сегодня он указывает на одну сборку, завтра на другую.
docker image inspect nginx:latest --format '{{index .RepoDigests 0}}'
docker image ls --digests
Для критичных сервисов используйте точные версии и обновляйтесь осознанно. Watchtower тогда пригодится для вспомогательных контейнеров, а не для всего стека.
Безопасность
Доступ к docker.sock фактически равен root на хосте: через API можно запустить привилегированный контейнер и смонтировать файловую систему. Не публикуйте сокет в сеть и не давайте Watchtower лишних прав. В идеале ограничьте API через socket-proxy и отдельную сеть. Rootless-режим Docker снижает риск, но не отменяет необходимость доверять образу и реестру.
Обновление образов — это ещё и supply chain: доверяйте официальным реестрам, проверяйте подписи и не тяните случайные образы с похожими именами. Логи Watchtower не должны содержать токены и пароли.
Чек-лист
- Watchtower запущен в monitor-only и проверен на тесте.
- Обновляются только помеченные контейнеры.
- Для баз настроены дампы и окно обслуживания.
- Предыдущий digest сохранён для отката.
- Уведомления работают, секреты не в git.
- Доступ к Docker API ограничен.
Итог
Watchtower экономит время, но требует дисциплины: метки, расписание, бэкапы и понятный откат важнее самого факта автоматизации. Начните с мониторинга и нескольких безопасных сервисов, затем расширяйте список. Если контейнер хранит данные, сначала обеспечьте восстановление, а уже потом разрешайте автоматическое обновление.