Ответ
Да, Docker-контейнер может быть настроен на автоматический перезапуск. Это одна из ключевых функций для обеспечения отказоустойчивости контейнеризованных сервисов. Политика перезапуска управляется флагом --restart.
Доступные политики перезапуска:
no(значение по умолчанию): Контейнер не перезапускается автоматически.on-failure[:max-retries]: Перезапуск происходит только если контейнер завершился с ненулевым кодом выхода (т.е. с ошибкой). Можно указать максимальное количество попыток.unless-stopped: Контейнер всегда перезапускается, если только он не был явно остановлен пользователем (командойdocker stop). Это наиболее полезная политика для production-сервисов, которые должны быть всегда запущены, даже после перезагрузки демона Docker или хоста.always: Контейнер всегда перезапускается. Даже если он был остановлен вручную, демон Docker перезапустит его при старте. Это может быть нежелательно, поэтомуunless-stoppedчасто предпочтительнее.
Пример запуска контейнера Nginx с политикой unless-stopped:
docker run -d --name my-nginx --restart unless-stopped -p 80:80 nginx:alpine
Как это работает на практике:
- Если контейнер падает из-за ошибки в приложении (exit code != 0), Docker перезапускает его.
- Если хост перезагружается, демон Docker при старте автоматически запустит все контейнеры с политикой
alwaysилиunless-stopped. - Политика применяется к контейнеру, а не к образу. Её можно изменить для уже запущенного контейнера с помощью
docker update.# Изменить политику перезапуска для running-контейнера docker update --restart unless-stopped my-nginx
Важные нюансы для DevOps:
- Зацикливание перезапусков: Если контейнер падает сразу после старта (например, из-за ошибки конфигурации), Docker будет пытаться перезапускать его с экспоненциальной задержкой (backoff), что может создать нагрузку. Нужно мониторить логи (
docker logs --tail 50 my-nginx) и метрики. - Интеграция с оркестраторами: В production-средах (Kubernetes, Docker Swarm) политики перезапуска контейнеров обычно управляются оркестратором (через
livenessProbe,restartPolicy), а не флагом--restart. - Состояние файловой системы: При перезапуске контейнера по умолчанию используется тот же самый образ. Изменения в файловой системе, сделанные в предыдущем запуске (если не использовались volumes), будут потеряны.