Как обновить контейнеры Docker для применения обновлений образа — CloudSavvy IT

Иллюстрация с логотипом Docker

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

Получение новых изображений

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

Вот пример контейнера, использующего изображение nginx: latest:

# Pull new image docker pull nginx: latest # Удалить старый контейнер по имени docker rm example-nginx # Запустить новый контейнер docker run -d -p 80:80 —name example-nginx nginx: latest

В Docker отсутствует встроенный способ обнаружения обновлений образов и замены запущенных контейнеров. В результате получается запутанный процесс ручной замены. Это можно упростить, используя Docker Compose для запуска ваших контейнеров вместо простой команды docker run.

Замена контейнеров с помощью Docker Compose

Docker Compose позволяет создавать декларативные представления стеков контейнеров с помощью файла docker-compose.yml. Стек запускается командой docker-compose up с использованием конфигурации, содержащейся в файле. Это заменяет длинный список флагов, обычно присваиваемых запуску докера.

Docker Compose имеет встроенную команду извлечения, которая извлекает обновленные версии всех изображений в вашем стеке. Это все еще двухэтапная процедура, так как после этого вам придется снова вручную запустить docker-compose up.

# Вытяните все изображения в стеке docker-compose pull # Перезапустите стек # Если была извлечена новая версия изображения, контейнеры, # использующие старый тег, будут заменены новыми экземплярами. docker-compose up -d

Docker Compose предлагает более простой и запоминающийся опыт, когда вам не нужно вводить имена изображений или запоминать флаги, которые вы передали для запуска Docker. Две команды можно легко сократить до одного псевдонима оболочки:

псевдоним composePullUp = «docker-compose pull && docker-compose up -d»

При извлечении изображений вручную вам необходимо указать правильный тег. Docker Compose сделает это за вас и выберет теги, указанные в вашем docker-compose.yml.

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

Например, при извлечении новой версии node: 14 вы получите последний выпуск исправления для Node.js 14. Извлечение node: latest доставит самую последнюю версию Node.js, в настоящее время 16. Если старый контейнер использовал этот образ. , процесс извлечения и замены вызовет скачок основной версии для двоичного файла Node внутри контейнера.

Восстановление изображений

До сих пор мы видели, как обрабатывать контейнеры, созданные из образов, которые вы извлекаете непосредственно из Docker Hub или другого реестра. Изображения, которые вы создаете сами, необходимо перестраивать при изменении их базового изображения.

Сначала восстановите образ:

docker build —pull -t my-image: latest.

Затем замените свои контейнеры:

# Удалить старый контейнер по имени docker rm my-container # Запустить новый контейнер docker run -d —name my-container my-image: latest

Флаг —pull, присвоенный сборке docker, указывает Docker на получение базового образа, указанного в вашем Dockerfile. Без этого флага Docker будет повторно использовать существующую ссылку на тег, если образ уже присутствует в системе.

Пользователи Docker Compose могут достичь тех же результатов с помощью соответствующих команд docker-compose:

docker-compose build — потянуть docker-compose up -d

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

Программное обеспечение внутри контейнеров

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

Запуск apt-get update && apt get upgrade -y по расписанию (или аналогам вашего менеджера пакетов) является стандартной практикой при администрировании сервера Linux с голым железом. Эти команды обычно не запускаются в контейнере Docker, хотя они могут быть включены как часть файла Docker для получения самых последних исправлений безопасности во время сборки образа.

Периодическое извлечение базового образа и воссоздание контейнеров — предпочтительный способ их обновления. Это дает вам все исправления безопасности и сокращает срок службы отдельных контейнеров. Среда контейнеров не предназначена для изменения после создания экземпляра; Изменения файловой системы должны быть ограничены записью во временные пути и выделенные тома Docker, которые переживают контейнер.

Автоматизация обновлений контейнеров

Вы можете автоматизировать процесс проверки наличия обновленных тегов изображений и перезапуска контейнеров с помощью сторонних проектов. Сторожевая башня — популярный выбор, который отслеживает запущенные контейнеры и заменяет их при изменении их образа Docker Hub.

Сама Сторожевая башня развернута как контейнер:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock containrrr / watchtower

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

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

По умолчанию Watchtower работает только с Docker Hub. Вы можете использовать его с частные реестры изображений путем предоставления учетных данных в файле конфигурации.

Создайте файл JSON со следующим содержимым:

{«auths»: {«example.com»: {«auth»: «credentials»}}}

Замените example.com на путь к вашему реестру.

Затем сгенерируйте строку учетных данных из вашего имени пользователя и пароля в реестре:

echo -n ‘имя пользователя: пароль’ | base64

Вставьте полученную строку в кодировке Base64 в файл конфигурации, заменив текст заполнителя учетных данных.

Смонтируйте файл конфигурации в контейнер Сторожевой башни, чтобы разрешить доступ к вашему реестру:

docker run -d -v config.json: /config.json -v /var/run/docker.sock:/var/run/docker.sock containrrr / watchtower

Заключение

В Docker отсутствует какой-либо механизм для обнаружения и применения обновлений восходящего образа к вашим работающим контейнерам. Вы можете использовать команды Docker CLI последовательно, docker-compose как абстракцию более высокого уровня или сторонний инструмент, например Watchtower, для замены ваших контейнеров при выпуске новых версий образов.

В зависимости от ваших обстоятельств вы можете вообще не чувствовать необходимости обновлять контейнеры таким образом. Если ваша команда использует конвейеры CI для создания образа Docker при каждой фиксации, возможно, вы уже производите и развертываете обновленные образы несколько раз в день. В этом случае убедитесь, что вы используете флаг —pull при сборке докеров, чтобы исправления исходной версии были включены в ваши образы.

Похожие записи

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

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