Автоматическое обновление контейнеров Docker с помощью Watchtower на Ubuntu

Использование Docker дает множество преимуществ, например, позволяет упаковывать приложения в стандартизированные блоки для разработки программного обеспечения. Это упрощает развертывание и масштабирование приложений.

Однако управление обновлениями образов 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, чтобы он мог взаимодействовать с демоном Docker
  • containrrr/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 — Имя пользователя SMTP
  • WATCHTOWER_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 вашего вебхука Slack
  • WATCHTOWER_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, чтобы упростить поддержание контейнеров в актуальном состоянии!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *