Watchtower: автообновление Docker-контейнеров
Watchtower следит за реестром образов и автоматически перезапускает контейнеры на свежих версиях. Разбираем, как включить его безопасно, не сломав прод.
Содержание
Зачем 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 \\\n --name watchtower \\\n --restart unless-stopped \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n containrrr/watchtower \\\n --interval 3600 --cleanup', 'Флаг --interval 3600 задаёт проверку раз в час, --cleanup удаляет старые образы после обновления, чтобы не забивать диск. Проверить, что демон жив:', 'docker logs -f watchtower']
Обновлять только нужное
['Следить за всем подряд опасно. Лучше — по метке. Запускаем Watchtower с флагом--label-enable, тогда он трогает только помеченные контейнеры:', 'docker run -d --name watchtower \\\n --restart unless-stopped \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n containrrr/watchtower --label-enable --interval 21600', 'А нужный контейнер помечаем при запуске:', 'docker run -d --name app \\\n --label com.centurylinklabs.watchtower.enable=true \\\n myrepo/app:stable', 'В docker-compose это выглядит аккуратнее:', 'services:\n app:\n image: myrepo/app:stable\n labels:\n - "com.centurylinklabs.watchtower.enable=true"']
Уведомления в Telegram
['Автообновление без обратной связи — это лотерея. Настроим уведомления, чтобы знать о каждом обновлении:', 'docker run -d --name watchtower \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -e WATCHTOWER_NOTIFICATIONS=shoutrrr \\\n -e WATCHTOWER_NOTIFICATION_URL="telegram://BOT_TOKEN@telegram?chats=CHAT_ID" \\\n containrrr/watchtower --interval 3600', 'Теперь после каждого апдейта прилетит сообщение: какой контейнер, с какой версии на какую. Если что-то пошло не так — вы узнаете первым, а не от пользователей.']
Режим мониторинга без обновлений
['Хотите видеть, что вышли новые версии, но обновлять вручную? Включите режим только-оповещение:', 'docker run -d --name watchtower \\\n -v /var/run/docker.sock:/var/run/docker.sock \\\n -e WATCHTOWER_MONITOR_ONLY=true \\\n 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Частые вопросы
Watchtower обновит контейнер с тегом latest?
Да, если в реестре появился новый образ с тем же тегом. Именно поэтому на проде лучше фиксировать конкретные версии, а latest оставить для тестовых сервисов.
Будет ли простой сервиса при обновлении?
Короткий — контейнер останавливается и пересоздаётся. На быстрых NVMe-дисках MAATRIX это обычно 1-3 секунды. Для zero-downtime нужен оркестратор вроде Swarm или k8s.
Как обновлять только один контейнер?
Запустите Watchtower с флагом --label-enable и пометьте нужный контейнер меткой com.centurylinklabs.watchtower.enable=true.