dockerコンテナをsystemdで管理させる

dockerコンテナをサービス化しようと思って、systemdで自動起動するようにsystemdのサービスを書いた。

方法自体は、公式にも書いてある。

Docker Docs Automatically start containers

要約すると、コンテナをdocker runして作って、そのコンテナをdocker startdocker stopするサービスを作ってねという。

じゃあ、docker pullからしようと思うとどうすんねんというあたりは、以下のブログに、詳しく書かれていた。

Running Docker Containers with Systemd - Container Solutions

試しに、registryを起動するのを以下のとおり作った。

[Unit]
Description=Docker Registry
Documentation=https://github.com/74th/systemd-docker-registry
Requires=docker.service
After=docker.service

[Service]
Type=simple
ExecStartPre=-/usr/bin/docke stot registry
ExecStartPre=-/usr/bin/docker rm registry
ExecStartPre=/usr/bin/docker pull registry
ExecStart=/usr/bin/docker run --name registry -p 5000:5000 library/registry

[Install]
WantedBy=multi-user.target
  • docker.serviceが起動後に実行するようにする。After=docker.serviceとする。
  • サービスのTypeは、コマンドが動いている間を起動していると判定する、Type=simpleを使う。そのため、コンテナの起動自体は、docker run -dではなく、ただのdocker runで良い。
  • 起動時実行時コマンドである、ExecStartdocker runをやらせる。
  • その前に、docker pullとか停止とか削除とかをExecStartPreでやらせる。

このファイルを作成して、以下のとおり有効化する。

sudo systemctl enable docker
sudo systemctl enable docker-registry

これで再起動させたところ、自動起動されていた。

一つはまったのは、このdocker-registry.serviceのファイルをgitで管理しようと、/usr/lib/systemd/system/内にはシンボリックリンクで格納していた。すると、上記コマンドを入れても、Failed to issue method call: No such file or directoryと言われてしまった。/usr/lib/systemd/system/内には、実ファイルを置かなければならないらしい。

ワンライナーでできるのを、githubにあげておきました。

https://github.com/74th/systemd-docker-registry