🐳 Как автоматически обновлять контейнеры Docker из реджестри образов |

🐳 Как автоматически обновлять контейнеры Docker из реджестри образов

Мануал

Docker – это инструмент, позволяющий легко запускать приложения в контейнерах.

Одним из основных преимуществ контейнеризации является простота управления обновлениями – все, что вам нужно сделать, это перезапустить новый контейнер, и есть инструменты, которые могут автоматизировать весь этот процесс.

Автоматическое развертывание контейнеров Docker

Docker – отличный выбор для конвейеров непрерывной интеграции/непрерывного развертывания (CI/CD), поскольку он помогает автоматизировать оба этапа процесса.

Docker-файлы сами по себе обеспечивают способ создания образа вашего приложения, и довольно просто настроить автоматическую сборку контейнеров из исходников на таких сервисах, как Github.

После сборки и размещения в “реджестри образов” его можно загрузить и запустить на любом сервере с Docker.

Это замечательно, но это все равно подразумевает выполнение команд на сервере каждый раз, когда вы хотите обновить его.

Если вы хотите, чтобы обновление было действительно автоматическим, то вас может заинтересовать инструмент под названием 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
см. также:

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий