ubuntu上でdocker-composeをsystemdで管理する


目標

Dockerをsystemdで簡単に管理する

前提

すでにdocker-compose -f <yml> upは使えるようになっていること(dockerのインストールは、公式ドキュメント参照)

手順

1. docker-compose用の汎用化されたサービスを作成

/etc/systemd/system/[email protected]<- このファイルの名前が重要なので基本変えないこと。変える場合は、@.の役割をしっかり理解してから。

/etc/systemd/system/[email protected]
[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service

[Service]
Restart=always

WorkingDirectory=/etc/docker/compose/%i

# Remove old containers, images and volumes
ExecStartPre=/usr/bin/docker-compose down -v
ExecStartPre=/usr/bin/docker-compose rm -fv
ExecStartPre=-/bin/bash -c 'docker volume ls -qf "name=%i_" | xargs docker volume rm'
ExecStartPre=-/bin/bash -c 'docker network ls -qf "name=%i_" | xargs docker network rm'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=%i_*" | xargs docker rm'

# Compose up
ExecStart=/usr/bin/docker-compose up

# Compose down, remove containers and volumes
ExecStop=/usr/bin/docker-compose down -v

[Install]
WantedBy=multi-user.target

これだけではなにも起きない。これは、Docker-compose用のサービステンプレートと言う感じ

2. 実際のdocker-composeを置くフォルダ作成 & docker-compose.ymlを置く。

ファイルを置くときは、必ずdocker-compose.ymlで置く!

上のServiceからわかるように、複数のdocker-compose.ymlを別のDirctoryに配置&Working Directoryを変更することで汎用化しているので、docker-compose.ymlの名前は変更できない。

sudo mkdir -p /etc/docker/compose/<自分のservice名>/
sudo cp <自分のdocker-compose.yml> /etc/docker/compose/<自分のservice名>/docker-compose.yml

3. serviceスタート

sudo systemctl start docker-compose@<自分のservice名>

最後に

エラーが出たら、sudo journalctl -xeなどでみるが、わかりずらいので、実際にコマンドを確かめてみるのが早い。

  1. まずは、docker-compose -f <自分のyml> upでちゃんと動くことを確認
  2. docker-composeの場所はあっているか(which docker-composeで出てくるものとサービス内のPathが等しいか)
  3. docker-compose.ymlのおいた位置は正しいか などn