Watchtower: автообновление Docker-контейнеров
Watchtower следит за реестром образов и автоматически перезапускает контейнеры на свежих версиях. Разбираем, как включить его безопасно, не сломав прод.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Зачем Watchtower
Ручное обновление контейнеров — рутина: зайти по SSH, дёрнуть docker pull, пересоздать контейнер, проверить логи. Для одного сервиса терпимо, для десяти — уже головная боль. Watchtower делает это сам: периодически опрашивает реестр, находит новый образ с тем же тегом и пересоздаёт контейнер с прежними параметрами.
Особенно удобно на компактном VPS, где крутится связка из нескольких контейнеров (реверс-прокси, приложение, база, бот). На тарифах MAATRIX с AMD EPYC + NVMe pull и пересоздание проходят за секунды, так что окно недоступности сервиса минимально.
- Плюс: security-патчи прилетают без вашего участия.
- Минус: обновление на latest иногда ломает совместимость — поэтому ниже настроим уведомления и выборочность.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для DockerБыстрый старт
Watchtower сам поставляется как контейнер. Самый простой запуск — следить за всеми контейнерами на хосте:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--interval 3600 --cleanup
Флаг --interval 3600 задаёт проверку раз в час, --cleanup удаляет старые образы после обновления, чтобы не забивать диск. Проверить, что демон жив:
docker logs -f watchtower
Обновлять только нужное
Следить за всем подряд опасно. Лучше — по метке. Запускаем Watchtower с флагом --label-enable, тогда он трогает только помеченные контейнеры:
docker run -d --name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --label-enable --interval 21600
А нужный контейнер помечаем при запуске:
docker run -d --name app \
--label com.centurylinklabs.watchtower.enable=true \
myrepo/app:stable
В docker-compose это выглядит аккуратнее:
services:
app:
image: myrepo/app:stable
labels:
- "com.centurylinklabs.watchtower.enable=true"
Уведомления в Telegram
Автообновление без обратной связи — это лотерея. Настроим уведомления, чтобы знать о каждом обновлении:
docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=shoutrrr \
-e WATCHTOWER_NOTIFICATION_URL="telegram://BOT_TOKEN@telegram?chats=CHAT_ID" \
containrrr/watchtower --interval 3600
Теперь после каждого апдейта прилетит сообщение: какой контейнер, с какой версии на какую. Если что-то пошло не так — вы узнаете первым, а не от пользователей.
Режим мониторинга без обновлений
Хотите видеть, что вышли новые версии, но обновлять вручную? Включите режим только-оповещение:
docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_MONITOR_ONLY=true \
containrrr/watchtower --interval 86400
Watchtower будет раз в сутки сообщать о доступных апдейтах, но пересоздавать контейнеры не станет. Хороший компромисс для прод-сервисов: контроль остаётся за вами.
Частые ошибки
- Тег latest на проде. Обновление может притащить breaking change. Фиксируйте минорные теги (например
:1.24) и обновляйтесь осознанно. - Нет бэкапа перед апдейтом. На MAATRIX ежедневные бэкапы включены, но перед крупным обновлением сделайте снапшот вручную.
- Watchtower обновляет сам себя и рвёт цепочку. Держите его отдельно и не помечайте лишним.
- Приватный реестр без авторизации. Пробросьте
~/.docker/config.jsonвнутрь контейнера, иначе pull упадёт с 401.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для DockerОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Watchtower обновит контейнер с тегом latest?
Да, если в реестре появился новый образ с тем же тегом. Именно поэтому на проде лучше фиксировать конкретные версии, а latest оставить для тестовых сервисов.
Будет ли простой сервиса при обновлении?
Короткий — контейнер останавливается и пересоздаётся. На быстрых NVMe-дисках MAATRIX это обычно 1-3 секунды. Для zero-downtime нужен оркестратор вроде Swarm или k8s.
Как обновлять только один контейнер?
Запустите Watchtower с флагом --label-enable и пометьте нужный контейнер меткой com.centurylinklabs.watchtower.enable=true.