Linux Labs

Контейнеры: Docker и compose / Ступень 2 из 11

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

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 4 из 8 · теория · 6 мин

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

Контейнер, который остановился сам или вместе со службой docker, может подниматься без тебя.

Главный процесс завершился — Docker оставляет контейнер остановленным. Перезапуск службы docker или всего сервера останавливает все контейнеры, и после него они тоже остаются остановленными. Это поведение меняет политика перезапуска — ключ --restart в docker run:

--restart Процесс упал (код ≠ 0) Процесс завершился с кодом 0 Остановлен docker stop, потом перезапущена служба docker
no — по умолчанию остаётся остановленным остаётся остановленным остаётся остановленным
on-failure поднимается остаётся остановленным поднимается, если процесс остановился с кодом ≠ 0
always поднимается поднимается поднимается
unless-stopped поднимается поднимается остаётся остановленным

Контейнер, остановленный вручную, ни одна политика не поднимает до перезапуска службы docker. Работающие контейнеры с always и unless-stopped поднимаются и после перезапуска службы docker или сервера. Сколько раз Docker поднимал контейнер, хранит поле RestartCount в docker inspect.

Политику, в отличие от порта и окружения, можно поменять у готового контейнера: sudo docker update --restart <политика> <имя>.

Проверь себя 1 вопрос

Работают три контейнера: a без политики, b с --restart always, c с --restart unless-stopped. b и c остановили docker stop, потом выполнили sudo systemctl restart docker. Какие контейнеры будут Up?

  • unless-stopped помнит ручной docker stop: c остаётся Exited и после перезапуска службы.

  • Без политики Docker контейнер не поднимает: a после перезапуска службы остаётся Exited.

  • always поднимает контейнер при старте службы docker, даже если его остановили вручную: b будет Up.

Перезапуск службы останавливает a, и без политики он остаётся остановленным. always поднимает b, хотя его остановили вручную, а unless-stopped помнит ручной docker stop и оставляет c в Exited.

Главное в шаге

  • Без политики контейнер не поднимается ни после падения процесса, ни после перезапуска службы docker.
  • always поднимает контейнер даже после ручного docker stop, как только служба docker перезапустится; unless-stopped оставляет его остановленным.
  • Политику меняет docker update --restart, а порт и окружение — только пересоздание контейнера.
Ubuntu 24.04
Загрузка…