Как перезапускать контейнер автоматически
docker run -d --name web --restart unless-stopped -p 8080:80 nginx:alpineС --restart unless-stopped контейнер поднимется сам после сбоя программы, после перезапуска Docker и после перезагрузки сервера. Не поднимется он только в одном случае — если вы остановили его сами командой docker stop.
Какие бывают политики
| Политика | Когда перезапускает |
|---|---|
no | никогда (по умолчанию) |
on-failure | только если программа завершилась с ошибкой (код выхода не 0) |
on-failure:5 | то же, но не больше 5 попыток подряд |
always | всегда; остановленный вручную — после перезапуска Docker или сервера |
unless-stopped | всегда, кроме контейнеров, остановленных вручную |
Для сервисов обычно берут unless-stopped. always подходит, если контейнер должен работать даже после того, как его кто-то остановил, — при следующей перезагрузке он вернётся. on-failure — для задач, которые должны завершиться: при успехе их не нужно запускать снова.
Поменять у готового контейнера
Пересоздавать контейнер не нужно:
docker update --restart unless-stopped webДля всех работающих контейнеров сразу:
docker update --restart unless-stopped $(docker ps -q)Проверить, какая политика стоит:
docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' webВ Docker Compose
services:
web:
image: nginx:alpine
restart: unless-stoppedПосле правки файла — docker compose up -d.
Чтобы работало после перезагрузки
Контейнеры поднимает служба Docker, поэтому она сама должна запускаться при включении компьютера. На Ubuntu и Debian это включено сразу после установки. Проверить и включить:
systemctl is-enabled docker
sudo systemctl enable dockerПервая команда должна ответить enabled. В Docker Desktop контейнеры поднимаются, когда запущен сам Docker Desktop, — в его настройках можно включить запуск при входе в систему.
Подводные камни
- Политика начинает действовать после успешного старта. Docker считает старт успешным, если контейнер проработал хотя бы 10 секунд. Это защищает от бесконечного цикла перезапусков сразу после создания.
- Контейнер, который падает снова и снова, Docker перезапускает с растущей паузой между попытками. В
docker psон будет в состоянииRestarting. Причину ищите вdocker logs, а не в политике перезапуска. docker stopиalways. Остановленный вручную контейнер сalwaysне поднимется сразу, но поднимется при следующем перезапуске Docker или сервера. Если это неожиданно — используйтеunless-stopped.- Не используйте systemd и
--restartвместе для одного контейнера: два «надсмотрщика» мешают друг другу. Документация Docker советует политики перезапуска, а не внешние менеджеры процессов.