Пошук уроків, статей та іншого контенту
Налаштуєте автоматичний перезапуск контейнерів і визначите поведінку сервісів після збоїв та перезавантаження хоста.
Політика перезапуску визначає, що Docker має робити з контейнером, якщо його головний процес завершився або Docker Engine перезапустився.
Політика задається під час створення контейнера за допомогою параметра --restart:
docker run --restart=<політика> IMAGEПолітика впливає лише на автоматичний перезапуск контейнера. Вона не виправляє помилки всередині застосунку і не запускає контейнер, якого вже не існує.
noЦе значення за замовчуванням. Docker не перезапускає контейнер автоматично.
docker run --name one-time-job --restart=no alpine sh -c "echo Завдання виконано"Після завершення команди контейнер залишиться у стані Exited.
on-failureКонтейнер перезапускається, якщо головний процес завершився з ненульовим кодом виходу. Ненульовий код зазвичай означає помилку.
docker run --name retry-job --restart=on-failure alpine sh -c "echo Помилка; exit 1"Docker намагатиметься запускати цей контейнер знову після кожного невдалого завершення.
Щоб обмежити кількість повторних спроб, вкажіть максимальну кількість:
docker run --name retry-job --restart=on-failure:3 alpine sh -c "echo Спроба; exit 1"У цьому прикладі Docker виконає не більше трьох автоматичних перезапусків.
Якщо процес завершиться з кодом 0, Docker не вважатиме це помилкою і не перезапускатиме контейнер за політикою on-failure.
alwaysDocker завжди намагатиметься запустити контейнер знову після його завершення.
docker run --name always-running --restart=always alpine sh -c "echo Завершення; exit 1"Ця політика також використовується для сервісів, які повинні автоматично запускатися після перезапуску Docker Engine або хоста.
Якщо контейнер з політикою always зупинити вручну командою docker stop, Docker не запускатиме його знову, доки Docker Engine не перезапуститься або контейнер не буде запущено вручну.
unless-stoppedЦя політика схожа на always, але враховує ручну зупинку контейнера.
docker run --name web-service --restart=unless-stopped nginx:alpineЯкщо контейнер завершиться через помилку, Docker запустить його знову. Якщо контейнер працював під час перезапуску Docker Engine або хоста, він також запуститься після відновлення Docker Engine.
Якщо ж контейнер перед цим зупинили вручну, він залишиться зупиненим і після перезапуску Docker Engine.
Для довготривалих сервісів unless-stopped часто є зручним вибором.
Створимо контейнер із вебсервером, який має автоматично відновлюватися після збою:
docker run -d \
--name demo-web \
--restart=unless-stopped \
-p 8080:80 \
nginx:alpineПояснення параметрів:
-d запускає контейнер у фоновому режимі;
--name demo-web задає ім’я контейнера;
--restart=unless-stopped вмикає автоматичний перезапуск;
-p 8080:80 публікує порт контейнера 80 на порт 8080 хоста;
nginx:alpine — образ вебсервера Nginx.
Перевіримо стан контейнера:
docker psУ стовпці STATUS контейнер має бути запущеним.
Тепер зупинимо контейнер вручну:
docker stop demo-webПеревіримо всі контейнери, включно із зупиненими:
docker ps -aКонтейнер залишиться зупиненим. Це очікувана поведінка для unless-stopped.
Запустимо його знову:
docker start demo-webТепер контейнер знову працює. Його політика перезапуску не змінилася.
Поточну політику можна переглянути через docker inspect:
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' demo-webКоманда виведе:
unless-stoppedДля політики з обмеженням кількості спроб можна перевірити також максимальну кількість повторів:
docker inspect -f '{{.HostConfig.RestartPolicy.Name}} {{.HostConfig.RestartPolicy.MaximumRetryCount}}' retry-jobНе обов’язково видаляти контейнер і створювати його знову. Політику можна змінити командою docker update.
docker update --restart=always demo-webПеревіримо нове значення:
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' demo-webЩоб вимкнути автоматичний перезапуск:
docker update --restart=no demo-webЗміна політики не змінює образ контейнера, його файлову систему або підключені порти.
Розглянемо контейнер, процес якого завершується з помилкою:
docker run --name failing-app --restart=on-failure:3 alpine sh -c "echo Застосунок завершився з помилкою; exit 1"Подивитися журнал контейнера можна так:
docker logs failing-appПеревірити фінальний стан:
docker ps -a --filter name=failing-appОскільки команда завершується з кодом 1, Docker виконає автоматичні спроби перезапуску. Після досягнення ліміту контейнер залишиться зупиненим.
Код завершення процесу можна переглянути так:
docker inspect -f '{{.State.ExitCode}}' failing-appЗначення 1 означає, що процес завершився з помилкою.
Контейнери не працюють без Docker Engine. Після перезавантаження хоста Docker Engine запускається як системний сервіс, а потім обробляє політики контейнерів.
Загальна поведінка:
no — контейнер автоматично не запускається;
on-failure — контейнер може бути перезапущений залежно від стану та коду завершення;
always — Docker намагається знову запустити контейнер;
unless-stopped — контейнер запускається знову, якщо його не зупинили вручну перед перезавантаженням.
Політика не допоможе, якщо:
Docker Engine не запущений;
образ контейнера недоступний і його неможливо завантажити;
контейнер видалений;
контейнер не має потрібної конфігурації або зовнішньої залежності.
Політика перезапуску також не створює контейнер заново. Вона працює лише з уже створеним контейнером.
docker stop і збоємdocker stop — це навмисна ручна зупинка контейнера. Docker розуміє, що користувач свідомо зупинив сервіс, і не повинен негайно запускати його знову.
Якщо ж основний процес контейнера аварійно завершився, це вважається збоєм. Тоді політика on-failure, always або unless-stopped може запустити контейнер повторно.
Щоб знову запустити вручну зупинений контейнер:
docker start demo-webДля ручного перезапуску запущеного контейнера:
docker restart demo-webВибір залежить від призначення контейнера:
одноразове завдання — no;
процес, який потрібно повторити після помилки, — on-failure або on-failure:КІЛЬКІСТЬ;
сервіс, який має працювати постійно, — always;
постійний сервіс, який не повинен самостійно повертатися після ручної зупинки, — unless-stopped.
Для навчальних і локальних сервісів часто зручно використовувати:
docker run -d --name app --restart=unless-stopped my-app:lateston-failure для процесу, який завершується успішноЯкщо програма завершується з кодом 0, політика on-failure не запускатиме її знову.
Для постійного сервісу головний процес має залишатися активним або потрібно вибрати іншу політику.
docker stopРучна зупинка не є аварією. Для unless-stopped контейнер після docker stop залишиться зупиненим.
Запустіть його вручну:
docker start container-nameПравильні значення:
no
on-failure
on-failure:3
always
unless-stoppedНаприклад, restart-always не є правильною політикою.
Якщо виконати:
docker rm container-nameконтейнер буде видалено. Політика перезапуску більше не зможе його відновити.
Політика on-failure без максимального числа спроб може нескінченно запускати процес, який відразу завершується з помилкою.
Для контрольованої кількості повторів використовуйте:
--restart=on-failure:5Політика перезапуску задається параметром --restart.
no вимикає автоматичний перезапуск.
on-failure реагує на ненульовий код завершення.
always намагається постійно підтримувати контейнер запущеним.
unless-stopped підтримує контейнер запущеним, але запам’ятовує ручну зупинку.
Для вже створеного контейнера політику можна змінити через docker update.
Політика діє лише для наявного контейнера і потребує запущеного Docker Engine.