search
LoginSignup
52

More than 1 year has passed since last update.

posted at

updated at

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を起動するのを以下のとおり作った。

/usr/lib/systemd/system/docker-registry.service
[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で良い。
  • 起動時実行時コマンドである、ExecStartdocker 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にあげておきました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
52