Ответ
Да, 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), будут потеряны.
Ответ 18+ 🔞
А, ну это про контейнеры, которые сами воскресают! Да, Docker такое умеет, и это, блядь, одна из его главных фишек, чтобы сервис не сдох навсегда от первой же ошибки. Всё крутится вокруг одного волшебного флага — --restart. Без него твой контейнер, как только чихнет, так и ляжет пластом.
Какие есть варианты, чтобы не бегать с реанимацией каждые пять минут:
no(стоит по умолчанию): Самый простой вариант. Упал — и хуй с горы. Лежи и не дыши, пока вручную не пнёшь.on-failure[:max-retries]: Умнее. Перезапустится только если кончил жизнь с ошибкой (код выхода не ноль). Можно даже указать, сколько раз пытаться — типа, «пять раз попробовал и пошёл нахуй».unless-stopped: Самый адекватный для прода! Контейнер будет воскрешаться всегда, если только ты его сам лично не прибил командойdocker stop. Перезагрузил сервер — он стартанёт. Упал от сбоя — поднимется. Красота.always: Ну, тут уже перебор. Перезапускается ВСЕГДА. Даже если ты его вручную остановил, демон Docker при старте его всё равно поднимет. Ёперный театр, иногда же надо обслуживание провести, а он тебе — опять живой. Поэтомуunless-stoppedобычно разумнее.
Вот, смотри, как запустить Nginx, чтобы он был неубиваемый, как таракан:
docker run -d --name my-nginx --restart unless-stopped -p 80:80 nginx:alpine
Как это всё работает в жизни, чтобы не было обмана:
- Приложение внутри контейнера накосячило и вылетело с ошибкой — Docker его тут же поднимет заново. Волнение ебать, но система держится.
- Сервак на перезагрузку ушёл — демон Docker, когда сам оживёт, автоматически запустит всех, у кого политика
alwaysилиunless-stopped. Удобно, бля. - Эта политика — она привязана к контейнеру, а не к образу. Так что если забыл указать при создании, всегда можно подправить на лету через
docker update.# Меняем судьбу уже бегущего контейнера docker update --restart unless-stopped my-nginx
Но есть подводные камни, чувак, без них никуда:
- Бесконечный цикл пиздеца: Если контейнер скончался сразу после старта (например, конфиг кривой), Docker будет упорно его перезапускать с нарастающей задержкой. Получится такая сосалка, которая просто жрёт ресурсы. Надо следить за логами (
docker logs --tail 50 my-nginx) и метриками, а то так и до добра не дожить. - Оркестраторы рулят: В нормальной продакшен-среде (Kubernetes, Docker Swarm) этими перезапусками обычно командует уже оркестратор (через свои
livenessProbe,restartPolicy). Флаг--restartтам уже не главный. - Файлы не вечны: Когда контейнер перезапускается, он стартует с чистого листа из образа. Все файлы, которые накопились в прошлой жизни (если не использовал volumes), — к ебеням. Помни об этом, хитрая жопа.