Поиск по сайту:

Как использовать политики перезапуска Docker для поддержания работоспособности контейнеров


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

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

Доступные политики

В настоящее время существует четыре различных политики перезапуска:

  • no: эта политика никогда не будет автоматически запускать контейнер. Это политика по умолчанию для всех контейнеров, созданных с помощью docker run.
  • всегда — Docker обеспечит постоянную работу контейнера. Если контейнер остановится, он будет немедленно перезапущен. Вы по-прежнему можете вручную остановить контейнер с помощью docker stop, но Docker снова запустит его при следующем перезапуске демона.
  • при сбое — контейнер будет перезапущен, если он остановится из-за ошибки. Docker не запустит контейнер после перезапуска демона.
  • unless-stopped — действует аналогично всегда. Разница в том, что Docker никогда не перезапустит контейнер, если он был остановлен вручную.

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

Может быть сложно решить, какую политику перезапуска использовать. всегда часто является наиболее естественным выбором, но поведение перезапуска демона можно легко упустить из виду. Если вы хотите, чтобы контейнеры надежно оставались остановленными после запуска docker stop, вам следует использовать unless-stopped.

Docker обнаруживает ошибки на основе кода выхода, выдаваемого из процесса переднего плана контейнера. Код выхода 1 или выше интерпретируется как ошибка. Это соответствует обработке Unix кодов выхода, где только 0 представляет собой успешное выполнение.

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

Применение политики перезапуска

Вы можете запустить контейнер с определенной политикой перезапуска, передав флаг --restart в docker run:

docker run --name httpd --restart always httpd:latest

Если вы используете Docker Compose, добавьте поле restart в свой docker-compose.yml:

services:
  httpd:
    image: httpd:latest
    restart: always

Вы можете изменить политику перезапуска существующего контейнера с помощью docker update. Передайте имя контейнера команде. Вы можете найти имена контейнеров, запустив docker ps -a.

docker update --restart-policy unless-stopped httpd

Вы можете использовать docker update с запущенными или остановленными контейнерами.

Перезапустить циклы

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

Другое поведение специалиста касается команды docker stop. Docker всегда будет уважать использование docker stop, поэтому контейнер не перезапустится сразу после запуска команды. Если вы действительно хотите перезапустить контейнер, вместо этого используйте docker restart.

Ограничение повторных перезапусков

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

docker run httpd:latest --restart on-failure:5

В этом примере Docker попытается перезапустить контейнер пять раз после сбоя (ненулевой код выхода). Если контейнер не запускается с пятой попытки, повторные попытки предприниматься не будут. Этот параметр полезен для контейнеров, где постоянная ошибка запуска вряд ли будет устранена без ручного вмешательства.

Изучение причин остановки контейнеров

Если вам нужно узнать, почему контейнер остановился, запустите docker ps -a. Это покажет подробную информацию обо всех ваших контейнерах, независимо от того, остановлены они или запущены. Найдите целевой контейнер и посмотрите в его столбце «Статус». Для остановленных контейнеров код выхода будет показан в скобках. Если код больше нуля, работа контейнера завершилась из-за ошибки.

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

docker logs my-container

Поток журнала объединяет стандартный вывод контейнера и стандартные потоки ошибок. Если ошибка была зарегистрирована, вы должны увидеть ее в последних нескольких строках вывода.

Краткое содержание

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

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




Все права защищены. © Linux-Console.net • 2019-2024