Обновление и автоматизация обновлений Docker контейнеров: простое руководство.

Поддержание инфраструктуры в  актуальном состоянии – залог надежности и стабильности системы.

Устаревшие версии ПО, достигнув конца жизненного цикла (EOL), перестают обновляться. Разработчики больше не чинят в нем баги и уязвимости.

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

Почему важно своевременно обновлять Docker контейнеры

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

Регулярное обновление помогает:

  • устранить уязвимости
  • улучшить производительность
  • получить новые возможности приложений

Автоматизация этого процесса — ключ к снижению ручной работы и минимизации ошибок.

Основные этапы обновления Docker контейнеров

Обновление Docker контейнера обычно включает следующие шаги:

1. Обновление образа (Image)

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

Для обновления нужно:

  • проверить наличие новой версии образа;
  • скачать новую версию образа с Docker Registry (например, Docker Hub);
  • убедиться, что обновленная версия работает корректно.

Например:

[root@waky ~]# docker pull nginx:latest
latest: Pulling from library/nginx
d7ecded7702a: Pull complete
266626526d42: Pull complete
320b0949be89: Pull complete
d921c57c6a81: Pull complete
9def903993e4: Pull complete
52bc359bcbd7: Pull complete
e2f8e296d9df: Pull complete
Digest: sha256:1beed3ca46acebe9d3fb62e9067f03d05d5bfa97a00f30938a0a3580563272ad
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@waky ~]#

2. Остановка и удаление старого контейнера

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

[root@waky ~]# docker stop nginx_container
nginx_container
[root@waky ~]# docker rm nginx_container
nginx_container
[root@waky ~]#

3. Запуск нового контейнера

Создайте и запустите контейнер на основе обновленного образа.

Например:

[root@waky ~]# docker run -d --name nginx_container -p 80:80 nginx:latest
525faa93809dc2c05b64b8ff6c7a7370a85cbadd4f62c4d3b103885bc81a1cea
[root@waky ~]#

Как автоматизировать обновление Docker контейнеров

Ручное обновление — это долго и подвержено ошибкам. Поэтому рекомендуется внедрять автоматизацию.

Использование скриптов

Создайте bash-скрипт, условно /usr/local/bin/container_update.sh, который будет автоматически выполнять все вышеизложенные шаги обновления. Содержимое файла:

#!/bin/bash

# Остановить и удалить старый контейнер
docker stop nginx_container
docker rm nginx_container

# Обновить образ
docker pull nginx:latest

# Запустить новый контейнер
docker run -d --name nginx_container -p 80:80 nginx:latest

Сделайте файл исполняемым и запланируйте запуск этого скрипта через cron или другой планировщик задач.

Использование Docker Compose

В одной из статей мы использовали docker-compose.yml файл похожего содержания:

services:
  alpine:
    image: alpine:latest
    command: sh -c "apk add --no-cache curl wget && sleep infinity"

  web:
    image: nginx:latest
    ports:
      - "8080:80"

Если контейнеры, заданные в этом файле уже работают, чтобы бы их обновить достаточно в той же директории выполнить:

[root@waky my-app]# docker compose pull
[+] Pulling 2/2
 ✔ alpine Pulled
2.6s
 ✔ web Pulled
2.6s
[root@waky my-app]# docker compose up -d
[+] Running 2/2
 ✔ Container my-app-alpine-1  Running
0.0s
 ✔ Container my-app-web-1     Running
0.0s
[root@waky my-app]# 

Это автоматически обновит контейнеры до новых версий.

Использование CI/CD инструментов

Инструменты автоматической сборки и деплоя, такие как Jenkins, GitLab CI, или GitHub Actions, позволяют автоматически обновлять контейнеры после внесения изменений в репозитории кода.

Каждый из таких инструментов является довольно комплексным и требует отдельной (и не одной) статьи. Однако было невозможно не упомянуть о наличии таких средств в контексте автоматизации работы с контейнерами.

Советы по безопасности и надежности при обновлении контейнеров

  • Тестируйте обновления на тестовых серверах перед внедрением в продакшн.
  • Используйте теги с конкретными версиями (например, nginx:1.21) вместо latest, чтобы избегать неожиданных изменений.
  • Создавайте резервные копии данных, если контейнер работает с важной информацией.
  • Внедряйте автоматическую проверку логов и состояния контейнеров после обновления.

Заключение

Обновление и автоматизация Docker контейнеров — важные процессы для поддержки безопасности, стабильности и эффективности ваших приложений.

Простые скрипты и Docker Compose помогут значительно упростить эти задачи, снизить риск ошибок и сделать управление инфраструктурой более удобным.