Ответ
В Docker есть четыре основные политики перезапуска, управляемые флагом --restart в команде docker run или в docker-compose.yml:
no(по умолчанию): Контейнер никогда не перезапускается автоматически.on-failure: Контейнер перезапускается только в случае завершения с ненулевым кодом ошибки. Можно указать максимальное количество попыток:--restart=on-failure:5.always: Docker всегда перезапускает контейнер, независимо от кода выхода. Если контейнер остановлен вручную, демон Docker перезапустит его при своей перезагрузке.unless-stopped: Поведение схоже сalways, но если контейнер был явно остановлен (командойdocker stop), он не будет перезапущен даже после перезагрузки демона Docker.
Практическое применение и нюансы:
# Запуск контейнера с политикой unless-stopped
sudo docker run -d --name my_app --restart unless-stopped nginx:alpine
# В docker-compose.yml
services:
app:
image: nginx:alpine
restart: unless-stopped
- Экспоненциальная задержка: Docker использует экспоненциальную задержку между попытками перезапуска, чтобы избежать нагрузки на систему при сбоях.
- Управление через systemd: Для гарантированного запуска контейнеров при загрузке всей системы необходимо, чтобы сам демон Docker был настроен на автозапуск (например, через
systemctl enable docker).