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 .