Контейнер, который остановился сам или вместе со службой 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 <политика> <имя>.
Работают три контейнера: 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, а порт и окружение — только пересоздание контейнера.