
Однако управление обновлениями образов Docker на сервере может стать утомительным. Приходится вручную извлекать новые версии образов и перезапускать каждый контейнер каждый раз, когда выходит обновление.
Именно здесь на помощь приходит Watchtower! Watchtower — это решение на основе контейнеров, которое будет следить за запущенными Docker-контейнерами и отслеживать изменения в образах, с которых эти контейнеры были изначально запущены.
Если Watchtower обнаружит, что образ изменился, он автоматически перезапустит связанные с ним контейнеры, чтобы они получили новый образ и работали с последней версией.
В этом подробном руководстве мы расскажем, как установить Watchtower и настроить его для автоматического обновления контейнеров на Ubuntu 20.04/22.04.
Предварительные условия
Прежде чем приступить к настройке Watchtower, необходимо выполнить несколько предварительных действий:
- Сервер Ubuntu 20.04/22.04 с установленным Docker
- Вы можете следовать руководству по установке Docker для Ubuntu 20.04/22.04
- Docker настроен на автоматический запуск при загрузке (должно быть по умолчанию)
- Несколько контейнеров Docker, уже запущенных на сервере, которые вы хотите поддерживать в актуальном состоянии
После того как вы подготовили свой сервер Ubuntu с активным Docker и несколькими запущенными контейнерами, мы можем перейти к установке Watchtower.
Шаг 1 — Установка Watchtower
Watchtower распространяется в виде образа Docker, поэтому его установка проста и заключается в запуске контейнера из этого образа. Образ Watchtower размещен на Docker Hub.
Загрузите последний образ Watchtower:
$ docker pull containrrr/watchtower
Как только образ будет загружен, можно запускать контейнер Watchtower:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Давайте пройдемся по опциям, которые мы передаем в docker run
команде:
-d
— Запускает контейнер Watchtower в отсоединенном режиме--name watchtower
— Назвать контейнер «watchtower» для облегчения идентификации-v /var/run/docker.sock:/var/run/docker.sock
— Монтирует сокет Docker в контейнер Watchtower, чтобы он мог взаимодействовать с демоном Dockercontainrrr/watchtower
— Образ докера Watchtower для использования
Это создаст и запустит контейнер Watchtower в фоновом режиме, который будет готов к мониторингу других контейнеров.
Шаг 2 — Настройка параметров уведомлений Watchtower
По умолчанию Watchtower будет молча проверять обновления образов контейнеров в фоновом режиме, не уведомляя вас. Вы можете изменить это поведение, задав несколько переменных окружения при запуске Watchtower:
Уведомления об обновлении контейнеров
Чтобы получать уведомления об обновлении контейнеров в Watchtower, передайте в поле -e WATCHTOWER_NOTIFICATIONS=email
переменную окружения.
Существует несколько вариантов уведомлений:
- email — Будет отправлять уведомления по электронной почте. Требует дополнительной настройки.
- slack — Может отправлять уведомления в Slack. Требуется URL веб-хука и канал.
- msteams — Отправка уведомлений в MS Teams. Требуется URL-адрес веб-хука.
- gotify — Отправка уведомлений через Gotify. Требуется токен приложения и URL-адрес сервера.
Например:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock -e WATCHTOWER_NOTIFICATIONS=email containrrr/watchtower
Это позволит получать уведомления по электронной почте при обновлении контейнеров.
Уведомления о запуске/выходе сторожевой башни
Вы также можете получать уведомления о запуске или завершении работы контейнера Watchtower, передав ему команду -e WATCHTOWER_NOTIFICATIONS_LEVEL=start-exit
:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock -e WATCHTOWER_NOTIFICATIONS=email -e WATCHTOWER_NOTIFICATIONS_LEVEL=start-exit containrrr/watchtower
Это будет отправлять уведомления как об обновлении контейнеров, так и о запуске/остановке Watchtower.
Конфигурация служб уведомлений
Если вы включите уведомления, вам нужно будет предоставить конфигурацию для служб уведомлений.
Это делается путем передачи дополнительных переменных окружения или монтирования конфигурационных файлов YAML в контейнер.
Конфигурация электронной почты
Чтобы получать уведомления по электронной почте, вы должны предоставить:
WATCHTOWER_EMAIL_FROM
— Адрес, с которого будут отправляться электронные письма с уведомлениямиWATCHTOWER_EMAIL_TO
— Адрес для отправки уведомленийWATCHTOWER_EMAIL_SERVER
— Адрес SMTP-сервераWATCHTOWER_EMAIL_SERVER_PORT
— Порт SMTP-сервераWATCHTOWER_EMAIL_SERVER_USER
— Имя пользователя SMTPWATCHTOWER_EMAIL_SERVER_PASSWORD
— Пароль SMTP
Для Gmail это будет выглядеть примерно так:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=email \
-e [email protected] \
-e [email protected] \
-e WATCHTOWER_EMAIL_SERVER=smtp.gmail.com \
-e WATCHTOWER_EMAIL_SERVER_PORT=587 \
-e [email protected] \
-e WATCHTOWER_EMAIL_SERVER_PASSWORD=gmail_password \
containrrr/watchtower
Конфигурация Slack
Чтобы отправлять сообщения в Slack, вам необходимо:
WATCHTOWER_NOTIFICATIONS_SLACK_WEBHOOK_URL
— URL вашего вебхука SlackWATCHTOWER_NOTIFICATIONS_SLACK_CHANNEL
— Канал Slack, в который нужно отправить сообщение
Например:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=slack \
-e WATCHTOWER_NOTIFICATIONS_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx \
-e WATCHTOWER_NOTIFICATIONS_SLACK_CHANNEL="#channel-name" \
containrrr/watchtower
Конфигурация MS Teams
Для уведомлений MS Teams вам нужно только предоставить:
WATCHTOWER_NOTIFICATIONS_MSTEAMS_WEBHOOK_URL
— URL вашего веб-хука MS Teams
Например:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=msteams \
-e WATCHTOWER_NOTIFICATIONS_MSTEAMS_WEBHOOK_URL=https://webhook.teams.microsoft.com/xxx \
containrrr/watchtower
Использование файлов конфигурации
Вместо того чтобы передавать переменные окружения, вы можете определить конфигурации уведомлений в файлах YAML и подключить их к контейнеру Watchtower.
Это позволяет хранить конфигурации во внешнем пространстве и не передавать длинные строки команд.
Пути к файлам конфигурации:
/config/email.yaml
— Конфигурация электронной почты/config/slack.yaml
— Конфигурация Slack/config/msteams.yaml
— Конфигурация MS Teams
Просто смонтируйте свои пользовательские файлы YAML поверх пустых файлов по умолчанию.
Например, для уведомлений по электронной почте:
$ docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /path/to/email.yaml:/config/email.yaml \
containrrr/watchtower
Где ваш email.yaml
будет содержать:
email:
from: [email protected]
to: [email protected]
server: smtp.gmail.com
port: 587
user: [email protected]
password: gmail_password
Таким образом, конфигурации уведомлений остаются внешними и отделяются от самого контейнера Watchtower.
Шаг 3 — Контроль над тем, какие контейнеры обновляются
По умолчанию Watchtower будет отслеживать все контейнеры, работающие с демоном Docker, и обновлять все контейнеры, в которых обновляется образ.
Вы можете исключить контейнеры по имени или метке, чтобы Watchtower не обновлял их автоматически:
Исключить по имени контейнера
Передайте параметр --exclude
опцию с регекс-фильтром для имен:
$ docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --exclude "my-container-name|another-container"
Исключение по метке контейнера
Наклейте на контейнеры этикетки с com.centurylinklabs.watchtower.enable=false
для исключения:
$ docker run -d --label com.centurylinklabs.watchtower.enable=false nginx
Контейнеры с этой меткой будут игнорироваться Watchtower.
Включать только совпадающие контейнеры
Вы также можете включить контейнеры в белый список, чтобы только обновлять контейнеры, соответствующие шаблону, с помощью --include
:
$ docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --include "container-a|container-b"
Теперь «Сторожевая башня» будет автоматически обновлять только контейнеры с именами container-a
или container-b
, игнорируя все остальные.
Шаг 4 — Изменение интервалов опроса сторожевой башни
По умолчанию Watchtower проверяет наличие новых изображений каждые несколько минут. Вы можете изменить частоту опроса Watchtower на предмет новых изображений.
Проверять наличие новых изображений
Чтобы изменить частоту проверки Watchtower на наличие новых изображений, передайте команду --interval
со строкой продолжительности:
$ docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --interval 5m
Это заставит Watchtower проверять наличие новых изображений каждые 5 минут.
Перезапуск контейнеров
По умолчанию Watchtower будет ждать 10 минут после обновления образа перед перезапуском контейнеров. Вы можете изменить продолжительность ожидания Watchtower перед перезапуском с помощью команды --restart-delay
:
$ docker run -d --name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --restart-delay 2m
Это позволит установить задержку перезапуска на 2 минуты.
Шаг 5 — Автоматизация запуска сторожевой башни
Последний шаг — убедиться, что Watchtower автоматически запускается при запуске демона Docker. Это позволит запускать Watchtower каждый раз, когда вы перезагружаете сервер.
Вы можете создать простой файл systemd unit для запуска Watchtower при загрузке.
Создайте файл блока по адресу /etc/systemd/system/watchtower.service
с этим определением:
[Unit]
Description=Watchtower - Auto update Docker containers
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker start -a watchtower
ExecStop=/usr/bin/docker stop -t 2 watchtower
[Install]
WantedBy=multi-user.target
Это запустит созданный нами контейнер Watchtower при запуске демона Docker.
Перезагрузите systemd и включите запуск службы Watchtower при загрузке:
$ sudo systemctl daemon-reload
$ sudo systemctl enable watchtower
Теперь Watchtower будет автоматически запускаться при каждом перезапуске сервера.
Шаг 6 — Настройка Watchtower в Docker Compose
Вы также можете запустить Watchtower в составе стека Docker Compose.
Добавьте службу watchtower в файл docker-compose.yml следующим образом:
version: "3"
services:
app:
image: myapp
ports:
- "8080:80"
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 30
Это запустит Watchtower вместе с контейнерами приложений/сервисов, определенными в файле compose.
Watchtower будет следить за другими сервисами и автоматически обновлять образы по мере выхода новых версий.
[volumes
монтируют сокет Docker, чтобы Watchtower мог взаимодействовать с демоном Docker.
Сайт command
устанавливает интервал проверки в 30 секунд. Вы можете настроить этот интервал по своему усмотрению.
Теперь при запуске docker-compose up
, Watchtower будет обновлять ваши изображения из коробки!
Использование Docker Compose позволяет легко добавить мониторинг Watchtower в новые и существующие стеки. Просто добавьте службу Watchtower и смонтируйте том, чтобы начать автообновление новых или существующих образов.
Заключение
В этом руководстве мы рассмотрели, как установить и настроить Watchtower для автоматического обновления контейнеров Docker.
Основные выводы:
- Watchtower запускается как контейнер Docker для мониторинга других контейнеров
- Уведомления могут предупреждать вас о том, что Watchtower обновляет контейнеры
- Исключение контейнеров из автообновления по имени или метке
- Изменение частоты проверки Watchtower на наличие новых изображений
- Создание файла блока systemd для запуска Watchtower при загрузке
Запустив Watchtower, вам больше не придется вручную проверять обновления образов Docker или перезапускать контейнеры. Watchtower будет автоматически поддерживать контейнеры на последних версиях в фоновом режиме.
Это значительно упрощает управление обновлениями контейнеров по мере роста вашего стека. Попробуйте Watchtower, чтобы упростить поддержание контейнеров в актуальном состоянии!