Перейти к основному содержимому

Политики перезапуска Docker Compose

· 5 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как использовать политику перезапуска с Docker Compose .

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

2. Политика перезапуска Docker

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

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

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

Для использования политик перезапуска Docker предоставляет следующие параметры:

  • no : контейнеры не будут перезапускаться автоматически
  • on-failure[:max-retries] : перезапустите контейнер, если он завершается с ненулевым кодом выхода, и предоставьте демону Docker максимальное количество попыток перезапустить контейнер.
  • всегда : всегда перезапускать контейнер, если он останавливается .
  • If-stopped : всегда перезапускать контейнер, если только он не был остановлен произвольно или демоном Docker.

Теперь давайте рассмотрим пример того, как установить политику перезапуска с помощью интерфейса командной строки Docker для одного контейнера:

docker run --restart always my-service

В приведенном выше примере my-service всегда будет перезапускаться, если контейнер перестанет работать. Однако если мы явно остановим контейнер, политика перезапуска вступит в силу только при перезапуске демона Docker или при использовании команды перезагрузки .

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

3. Настройка

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

У нас должен быть работающий контейнер Docker для тестирования политик перезапуска, которые мы укажем. Мы будем использовать проект из предыдущей статьи, spring-cloud-docker , который представляет собой докеризованное приложение Spring Boot. В этом проекте есть две службы Docker, которые мы будем использовать для реализации различных стратегий перезапуска с помощью Docker Compose.

Во-первых, мы должны подтвердить, что можем запустить оба контейнера, выполнив следующую команду из корня проекта:

docker-compose up --detach --build

Теперь мы должны увидеть обе службы, выполнив команду docker-compose ps :

$ docker ps
Name Command State Ports
--------------------------------------------------------------------------------
message-server java -jar /message-server.jar Up 0.0.0.0:18888->8888/tcp
product-server java -jar /product-server.jar Up 0.0.0.0:19999->9999/tcp

Кроме того, мы можем перейти на localhost:18888 или localhost:19999 в нашем браузере и убедиться, что мы видим сообщения, отображаемые службами приложений.

4. Перезапустите политику в Docker Compose

Как и команда перезапуска Docker, **Docker Compose включает свойство перезапуска для автоматического перезапуска контейнеров.

**

Кроме того, мы можем определить политики перезапуска в Docker Compose, предоставив сервису свойство перезапуска в файле docker-compose.yml . Docker Compose использует те же значения, что и команда перезапуска Docker CLI , для определения стратегии перезапуска. ``

Теперь давайте создадим политику перезапуска для наших контейнеров. В проекте spring-cloud-docker мы должны изменить файл конфигурации docker-compose.yml , добавив свойство политики перезапуска. Например:

message-server:
container_name: message-server
build:
context: docker-message-server
dockerfile: Dockerfile
image: message-server:latest
ports:
- 18888:8888
networks:
- spring-cloud-network
restart: no
product-server:
container_name: product-server
build:
context: docker-product-server
dockerfile: Dockerfile
image: product-server:latest
ports:
- 19999:9999
networks:
- spring-cloud-network
restart: on-failure

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

Далее давайте посмотрим, как те же самые политики объявляются с помощью Docker Compose в режиме swarm.

5. Перезапустите политику в режиме Docker Compose Swarm.

Docker Compose в режиме swarm предоставляет больший набор параметров при указании автоматического перезапуска контейнеров. Однако следующая реализация работает только в Docker Compose v3, которая вводит пару ключ-значение развертывания в конфигурацию .

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

  • условие : нет , при сбое или любое (по умолчанию) **

    **

  • delay : Продолжительность между попытками перезапуска **

    **

  • max_attempts : максимальное количество попыток за пределами окна перезапуска

  • window : продолжительность определения успешного перезапуска.

Теперь давайте определим наши политики перезапуска. Во-первых, мы должны убедиться, что используем Docker Compose v3, изменив свойство версии следующим образом:

version: '3'

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

deploy:
restart_policy:
condition: any
delay: 5s
max_attempts: 3
window: 120s

Аналогично добавляем политику перезапуска при сбое в product-server :

deploy:
restart_policy:
condition: on-failure
delay: 3s
max_attempts: 5
window: 60s

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

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

6. Заключение

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

Во-первых, мы использовали конфигурацию свойства перезапуска Docker Compose , которая включает те же параметры, что и собственная команда перезапуска в интерфейсе командной строки Docker. Наконец, мы использовали свойство restart_policy , доступное только в режиме swarm и Docker Compose версии 3, вместе с другими значениями конфигурации, определяющими политики перезапуска.

Как всегда, весь пример кода, используемый в этом руководстве, доступен на GitHub .