52
Help us understand the problem. What are the problem?

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にあげておきました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
52
Help us understand the problem. What are the problem?