Глиф Учебники

Как перезапускать контейнер автоматически

Справочник · Docker · 1 минута чтения

Bash
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 — для задач, которые должны завершиться: при успехе их не нужно запускать снова.

Поменять у готового контейнера

Пересоздавать контейнер не нужно:

Bash
docker update --restart unless-stopped web

Для всех работающих контейнеров сразу:

Bash
docker update --restart unless-stopped $(docker ps -q)

Проверить, какая политика стоит:

Bash
docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' web

В Docker Compose

YAML
services:
  web:
    image: nginx:alpine
    restart: unless-stopped

После правки файла — docker compose up -d.

Чтобы работало после перезагрузки

Контейнеры поднимает служба Docker, поэтому она сама должна запускаться при включении компьютера. На Ubuntu и Debian это включено сразу после установки. Проверить и включить:

Bash
systemctl is-enabled docker
sudo systemctl enable docker

Первая команда должна ответить enabled. В Docker Desktop контейнеры поднимаются, когда запущен сам Docker Desktop, — в его настройках можно включить запуск при входе в систему.

Подводные камни