dockerコンテナをサービス化しようと思って、systemdで自動起動するようにsystemdのサービスを書いた。
方法自体は、公式にも書いてある。
Docker Docs Automatically start containers
要約すると、コンテナをdocker runして作って、そのコンテナをdocker start、docker 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/docker stop 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で良い。 - 起動時実行時コマンドである、
ExecStartにdocker runをやらせる。 - その前に、
docker pullとか停止とか削除とかをExecStartPreでやらせる。
このファイルを作成して、以下のとおり有効化する。
sudo systemctl daemon-reload
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にあげておきました。