Введение
Из этого руководства вы узнаете, как запустить несколько служб Docker Compose с помощью шаблона служб systemd.
Требования
- Сервер с Debian/Ubuntu
- Докер установлен и работает
- Docker Compose установлен в
/usr/local/bin/docker-compose
, как указано в официальном руководстве (в противном случае вам, возможно, потребуется изменить путь в примерах)
Шаг 1 — Создание файлов Docker Compose
В этом руководстве для хранения настроек служб Docker Compose используется директория /etc/docker-compose
.
mkdir /etc/docker-compose
В качестве примера предположим, что мы хотим запустить watchtower, чтобы поддерживать наши работающие контейнеры в актуальном состоянии. Мы должны создать каталог для этой службы в /etc/docker-compose
:
mkdir /etc/docker-compose/watchtower
И нам нужен соответствующий файл Docker Compose в /etc/docker-compose/watchtower/docker-compose.yml
:
version: "3"
services:
watchtower:
image: containrrr/watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --cleanup --no-pull
Для получения дополнительной информации о параметрах, указанных в command
, посетите страницу watchtower.
Здесь мы указываем, что старые образы должны быть удалены после обновления до нового образа (--cleanup
).
Мы также говорим watchtower, что не нужно проверять наличие новых образов (--no-pull
). Эта опция рекомендуется, если вы собираете свои собственные образы (без отправки их в Docker Registry). Мы настроим регулярное получение новых образов позже. Если вы не планируете собирать свои собственные образы, то вы можете просто опустить --no-pull
, а также пропустить шаг 3.
Шаг 2 — Создание шаблона службы systemd
Сейчас мы создаем шаблон службы systemd в /etc/systemd/system/docker-compose@.service
:
[Unit]
Description=docker-compose %i service
Requires=docker.service network-online.target
After=docker.service network-online.target
[Service]
WorkingDirectory=/etc/docker-compose/%i
Type=simple
TimeoutStartSec=15min
Restart=always
ExecStartPre=/usr/local/bin/docker-compose pull --quiet --ignore-pull-failures
ExecStartPre=/usr/local/bin/docker-compose build --pull
ExecStart=/usr/local/bin/docker-compose up --remove-orphans
ExecStop=/usr/local/bin/docker-compose down --remove-orphans
ExecReload=/usr/local/bin/docker-compose pull --quiet --ignore-pull-failures
ExecReload=/usr/local/bin/docker-compose build --pull
[Install]
WantedBy=multi-user.target
Этот шаблон службы будет:
- Пытаться получить новые версии используемых образов Docker при запуске и перезагрузке службы systemd
- Пытаться собрать образы, если это настроено в
docker-compose.yml
, при запуске и перезагрузке службы systemd - Удалять несвязанные контейнеры (например, после изменения имени контейнера или удаления контейнера из
docker-compose.yml
)
Возможно, вы обратили внимание на большой тайм-аут запуска службы. Он требуется для сборки образов.
Теперь мы попросим systemd перезагрузить служебные файлы, чтобы мы могли использовать их:
systemctl daemon-reload
Шаг 3 — Регулярное получение и сборка новых образов (необязательно)
Теперь, когда мы уже настроили шаблон службы для получения и сборки наших образов при перезагрузке службы systemd, мы также можем создать cronjob для этого, чтобы регулярно получать/собирать образы:
echo '0 4 * * * root /bin/systemctl reload docker-compose@*.service' >> /etc/crontab
Обратите внимание, что это работает только в сочетании с watchtower, как показано выше в шаге 1, поскольку новые образы не будут автоматически использоваться. При перезагрузке службы Docker Compose получит и соберет новые образы. Watchtower будет автоматически забрать эти новые образы и перезапустить соответствующие контейнеры.
Шаг 4 — Запуск служб Docker
Теперь можно запустить службу Docker Compose (в данном случае «watchtower»):
systemctl start docker-compose@watchtower
Включить автоматический запуск при загрузке можно при помощи команды:
systemctl enable docker-compose@watchtower
Вывод
Теперь вы создали среду, в которой вы можете легко запускать различные службы Docker Compose в качестве служб systemd. Для каждого дополнительной службы вам просто нужно:
- Создать соответствующий каталог
/etc/docker-compose/servicename
- Создать файл
/etc/docker-compose/servicename/docker-compose.yml
(и все остальное, что нужно для службы) - Запустить службу через
systemctl start docker-compose@servicename
- (Необязательно) Настроить автоматический запуск службы при загрузке с помощью команды
systemctl enable docker-compose@servicename