systemd で Docker の管理・設定

多くの Linux ディストリビューションは systemd を使って Docker デーモンを起動します。このドキュメントは、様々な Docker の設定例を紹介します。

Docker デーモンの起動

Docker をインストールしたら、Docker デーモンを起動する必要があります。

$ sudo systemctl start docker
# 他のディストリビューションでは、次のように実行します
$ sudo service docker start

また、Docker をブート時に自動起動するには、次のように実行すべきです。

$ sudo systemctl enable docker
# 他のディストリビューションでは、次のように実行します
$ sudo chkconfig docker on

Docker デーモンのオプション変更

Docker デーモンの設定を変更するには、多くのフラグを使う方法と、環境変数を使う方法があります。

推奨する方法は、systemd 用のファイルを使うことです(詳細は systemd.unit ドキュメントに記述があります)。ローカルの設定ファイルは /etc/systemd/system/docker.service.d ディレクトリに <何らかの名前>.conf があります。もしかすると /etc/systemd/system/docker.service かもしれません。これは /lib/systemd/system/docker.service にあるデフォルト設定を上書きします。

一方で、既にパッケージを使ってインストールしていた場合は 環境設定ファイル (通常は /etc/sysconfig/docker ) があるかもしれません。これは後方互換性のためです。このファイルの内容は、 /etc/systemd/system/docker.service.d ディレクトリにあるファイルに落とし込めます。

[Service]
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY

docker.service環境設定ファイル を使っているか確認します。

$ systemctl show docker | grep EnvironmentFile
EnvironmentFile=-/etc/sysconfig/docker (ignore_errors=yes)

あるいは、サービス用のファイルがどこにあるか探します。

$ systemctl status docker | grep Loaded
FragmentPath=/usr/lib/systemd/system/docker.service
$ grep EnvironmentFile /usr/lib/systemd/system/docker.service
EnvironmentFile=-/etc/sysconfig/docker

Docker デーモンのオプションは、以下の HTTP Proxy 例 で説明するようなファイルを使って上書き可能です。このファイルは /usr/lib/systemd/system/lib/systemd/system にありますが、デフォルトのオプション設定は変更すべきではありません。

実行時のディレクトリとストレージ・ドライバ

Docker イメージ、コンテナ、ボリュームを別々のパーティションのディスク・スペースで管理したくなるでしょう。

この例では、次のような docker.service ファイルがあるものとします。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/docker daemon -H fd://
LimitNOFILE=1048576
LimitNPROC=1048576
TasksMax=1048576

[Install]
Also=docker.socket

これはドロップイン・ファイル(先ほど扱いました)を経由して外部フラグを追加できます。以下の内容を含むファイルを /etc/systemd/system/docker.service.d に作成します。

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt/docker-data" --storage-driver=overlay

このファイルに他の環境変数も設定できます。例えば、 HTTP_PROXY 環境変数を下に追加することもできるでしょう。

ExecSart 設定を変更するには、空の設定の次の行に、新しい設定を追加します。

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --bip=172.17.42.1/16

空の設定があると失敗しますので、次のように表示されるでしょう。

docker.service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.

HTTP プロキシ

この例はデフォルトの docker.service ファイルを上書きします。

HTTP プロキシサーバの背後にいる場合、ここではオフィスで設定する例として、Docker の systemd サービス・ファイルに設定を追加する必要があるものとします。

まず、docker サービス向けの systemd ドロップイン・ディレクトリを作成します。

mkdir /etc/systemd/system/docker.service.d

次は /etc/systemd/system/docker.service.d/http-proxy.conf ファイルを作成し、 HTTP_PROXY 環境変数を追加します。

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"

内部の Docker レジストリがあれば、プロキシを通さずに通信できるようにするため、 NO_PROXY 環境変数を指定します。

Environment="HTTP_PROXY=http://proxy.example.com:80/"    "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"

設定を反映します。

$ sudo systemctl daemon-reload

設定ファイルが読み込まれたのを確認します。

$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/

Docker を再起動します。

$ sudo systemctl restart docker

systemd ユニットファイルの手動作成

パッケージを使わずにバイナリをインストールした場合でも、Docker と systemd を連動したくなるでしょう。簡単に実現するには、単純に GitHub リポジトリ にある2つのユニットファイル(サービスとソケット用)を /etc/systemd/system に置くだけです。

参考

Quickstart Docker Engine
https://docs.docker.com/engine/quickstart/