Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Запуск нескольких служб Docker Compose в Debian/Ubuntu

profile picture
Author
Bernd Stellwag
Published
2019-03-11
Time to read
3 minutes reading time

Введение

Из этого руководства вы узнаете, как запустить несколько служб Docker Compose с помощью шаблона служб systemd.

Требования

Шаг 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
Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue

Discover our

Dedicated Servers

Get €20/$20 free credit!

Valid until: 31 December 2026 Valid for: 3 months and only for new customers
Configure now
Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more