Docker – это инструмент, позволяющий легко запускать приложения в контейнерах.
Одним из основных преимуществ контейнеризации является простота управления обновлениями – все, что вам нужно сделать, это перезапустить новый контейнер, и есть инструменты, которые могут автоматизировать весь этот процесс.
Автоматическое развертывание контейнеров Docker
Docker – отличный выбор для конвейеров непрерывной интеграции/непрерывного развертывания (CI/CD), поскольку он помогает автоматизировать оба этапа процесса.
Docker-файлы сами по себе обеспечивают способ создания образа вашего приложения, и довольно просто настроить автоматическую сборку контейнеров из исходников на таких сервисах, как Github.
После сборки и размещения в “реджестри образов” его можно загрузить и запустить на любом сервере с Docker.
- ☸️ Установка Harbor – реджестри образов в Kubernetes / OpenShift с помощью Helm
- 🐳 Настройка локального реджестри для Docker контейнеров с помощью Podman & Let’s Encrypt SSL
Это замечательно, но это все равно подразумевает выполнение команд на сервере каждый раз, когда вы хотите обновить его.
Если вы хотите, чтобы обновление было действительно автоматическим, то вас может заинтересовать инструмент под названием Watchtower.
Watchtower – это утилита, которая запускается на вашем хосте Docker и периодически проверяет наличие обновлений для контейнеров.
Если она обнаружит новую версию образа из реестра контейнеров, то автоматически уничтожит контейнер и немедленно перезапустит его.
Ранее уже рассматривали его:
🐳 Обновление патчей безопасности в контейнерах Docker
Это очень привлекательная функция, но прежде чем вы приступите к ее установке, важно обсудить ее недостатки.
Выполнение обновлений полностью автоматически означает, что у вас будет меньше контроля над временем и предварительным тестированием развертывания, поскольку всякий раз, когда коммит в вашем репозитории пройдет и вызовет сборку, запущенные контейнеры будут обновляться.
Если вы не являетесь владельцем запускаемого образа, он может обновиться неожиданно, если вы не исключите его из Watchtower.
Если вы не занимаетесь обновлением каждый день, вам может быть лучше использовать графический интерфейс Docker, например Portainer, который позволяет просматривать запущенные контейнеры на ваших серверах и нажимать кнопку для их автоматического обновления.
🐳 Как развернуть стек Portainer внутри кластера Docker Swarm
Это дает вам больше контроля над процессом и может помочь предотвратить неожиданные обновления.
Использование Watchtower
Watchtower упакован как контейнер Docker, поэтому его довольно легко установить – достаточно выполнить всего одну команду, чтобы он заработал:
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Система запускает контейнер Watchtower, а также создает бинд, монтирующий docker.sock с хоста, чтобы он мог взаимодействовать с Docker API.
По умолчанию он сканирует все запущенные контейнеры на наличие обновлений каждые 24 часа, что можно изменить с помощью флага –interval.
Вы также можете создать файл docker-compose.yml для запуска Watchtower в качестве сервиса:
version: "3" services: watchtower: image: containrrr/watchtower restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - /root/.docker/config.json:/config.json command: --interval 300
Вы можете исключить контейнеры из обновлений, но только путем установки метки на сканируемом контейнере.
Вам нужно будет либо установить этот флаг в командной строке во время запуска docker, либо указать его в процессе сборки контейнера с помощью директивы LABEL.
docker run -d --label=com.centurylinklabs.watchtower.enable=false nginx LABEL com.centurylinklabs.watchtower.enable="false"
Можно сделать и наоборот, передав флаг –label-enable при запуске Watchtower и установив для контейнеров значение “true”.
Запуск Watchtower в качестве службы Docker Compose
Более эффективный метод, особенно если вам нужно запустить Watchtower только для одного контейнера, – это упаковать его в существующий файл docker-compose.yml и создать scope для сканирования Watchtower.
В этом примере образу NGINX присвоен scope “nginx”, и Watchtower настроен на обновление контейнеров только с этой меткой scope.
version: '3' services: nginx: image: nginx labels: - "com.centurylinklabs.watchtower.scope=nginx" watchtower: image: containrrr/watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock command: --interval 300 --scope nginx labels: - "com.centurylinklabs.watchtower.scope=nginx"
Использование сторонних реджестри
По умолчанию Watchtower работает только с Docker Hub и любым другим публичным хабом.
Это исключает некоторые сервисы, такие как реджестри контейнеров Github, для получения образов из которого требуется имя пользователя и персональный токен доступа (PAT).
Вы можете добавить конфигурацию для частных реестров, создав файл config.json со следующим содержимым:
{ "auths": { "ghcr.io": { "auth": "credentials" } } }
Значение “credentials” должно быть установлено в base64 закодированную строку вашего имени пользователя:пароля или персонального токена доступа в случае Github.
echo -n 'username:password' | base64
Затем, когда вы запускаете Watchtower, передайте дополнительное монтирование для этого файла config.json.
docker run -d -v config.json:/config.json -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower