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

«Как настроить автоматический запуск Docker-контейнера при старте системы?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для автоматического запуска контейнеров при загрузке системы в Docker-среде используется политика перезапуска (restart policy). Это настраивается либо в docker run, либо в docker-compose.yml.

1. Использование политики перезапуска

docker run -d --name my_app --restart unless-stopped nginx:alpine

Доступные политики:

  • no (по умолчанию): Не перезапускать автоматически.
  • on-failure[:max-retries]: Перезапускать только при ошибке выхода контейнера (ненулевой код). Можно указать максимальное количество попыток.
  • always: Всегда перезапускать. Если контейнер остановлен вручную (docker stop), Docker перезапустит его при старте демона.
  • unless-stopped: Наиболее часто используемая мной политика. Всегда перезапускать, кроме случаев, когда контейнер был явно остановлен пользователем (docker stop). После перезагрузки системы такие контейнеры запустятся снова.

2. Настройка в Docker Compose В файле docker-compose.yml:

version: '3.8'
services:
  database:
    image: postgres:15
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: example
  webapp:
    image: my-webapp:latest
    restart: on-failure:3
    depends_on:
      - database

3. Интеграция с systemd (для контейнеров без Docker Daemon) Если вы управляете контейнерами через podman или другой инструмент без демона, можно создать systemd-сервис:

# /etc/systemd/system/myapp-container.service
[Unit]
Description=My Application Container
After=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/podman run -d --name myapp --restart=no my-image:tag
ExecStop=/usr/bin/podman stop -t 10 myapp
ExecStopPost=/usr/bin/podman rm -f myapp
Restart=always

[Install]
WantedBy=multi-user.target

Затем выполнить sudo systemctl enable myapp-container.service.

Мой выбор: Для большинства сервисных контейнеров я использую restart: unless-stopped в Docker Compose, так как это обеспечивает авто-восстановление после сбоев системы и дает контроль для плановых остановок.