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

Configure your dream server. Top performance with an excellent connection at an unbeatable price!

Want to contribute?

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

Find out more