systemd を用いた Docker の管理
読む時間の目安: 2 分
Linux ディストリビューションでは、Docker デーモンの起動に systemd を用いるものが多くあります。 このドキュメントでは Docker の設定例をいくつか示します。
Docker デーモンの起動
手動で起動する場合
Docker をインストールしたら Docker デーモンを起動する必要があります。
たいていの Linux ディストリビューションではsystemctl
を使ってサービスを起動します。
$ sudo systemctl start docker
システムブート時に自動起動する場合
Docker をシステムブート時に起動したい場合は システムブート時の Docker 起動設定 を参照してください。
Docker デーモンオプションのカスタマイズ
Docker デーモンに対してのデーモンフラグや環境変数を設定する方法はいろいろあります。
推奨されるのは、プラットフォームに依存しないdaemon.json
ファイルを用いる方法です。
このdaemon.json
ファイルは Linux においてはデフォルトで/etc/docker/
に置かれます。
詳しくは デーモン設定ファイル を参照してください。
daemon.json
を使うと、デーモンオプションはほぼすべて設定することができます。
以下の例では 2 つのオプションを設定しています。
daemon.json
による仕組みで設定できないものに HTTP プロキシー があります。
実行時の利用ディレクトリとストレージドライバー
Docker のイメージ、コンテナー、ボリュームは、別のパーティションを使ってディスク管理を行いたいと考えるかもしれません。
これを行うにはdaemon.json
ファイルにおいて、以下のようなフラグ設定を行います。
{
"data-root": "/mnt/docker-data",
"storage-driver": "overlay2"
}
HTTP/HTTPS プロキシー
Docker デーモンではその起動環境においてHTTP_PROXY
、HTTPS_PROXY
、NO_PROXY
という環境変数を利用して、HTTP または HTTPS プロキシーの動作を定めています。
この環境変数による設定はdaemon.json
ファイルを用いて行うことはできません。
以下は、デフォルトのdocker.service
ファイルを上書き設定する例です。
企業内で設定されるような HTTP あるいは HTTPS プロキシーサーバーを利用している場合は、Docker systemd サービスファイルに、これらの設定を加える必要があります。
rootless モードに関するメモ
Docker を rootless モード で起動させるとき、systemd 設定ファイルの収容ディレクトリは異なるところにあります。 rootless モードの起動にあたって、Docker はユーザーモードの systemd サービスとして起動されます。 そしてその設定ファイルは、各ユーザーのホームディレクトリ配下の
~/.config/systemd/user/docker.service.d/
にあるものを利用します。 これに加えてsystemctl
はsudo
を用いず--user
フラグをつけて実行することが必要です。 rootless モードにより Docker を動作させる場合は、以下の “rootless モード” を選んでください。
-
Docker サービスに対応した systemd のドロップインディレクトリを生成します。
$ sudo mkdir -p /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"
HTTPS プロキシーサーバーを利用している場合には、環境変数
HTTPS_PROXY
の設定を書きます。[Service] Environment="HTTPS_PROXY=https://proxy.example.com:443"
環境変数を同時に複数設定することもできます。 以下は HTTP および HTTPs プロキシーを設定します。
[Service] Environment="HTTP_PROXY=http://proxy.example.com:80" Environment="HTTPS_PROXY=https://proxy.example.com:443"
-
内部に Docker レジストリがあって、プロキシーを介さずに接続する必要がある場合は、環境変数
NO_PROXY
を通じて設定することができます。変数
NO_PROXY
は、プロキシーから除外したいホスト名を、カンマで区切った文字列として指定します。 ホストを除外する設定は必要に応じて行います。- IP アドレスプレフィックス (
1.2.3.4
) - ドメイン名、あるいは特別な DNS ラベル (
*
) - ドメイン名は、その名前とサブドメインすべてにマッチします。
先頭に “.” のついたドメイン名は、サブドメインのみにマッチします。
たとえばドメイン名が
foo.example.com
とexample.com
であるとします。example.com
はexample.com
とfoo.example.com
にマッチします。.example.com
はfoo.example.com
のみにマッチします。
- 単一のアスタリスク (
*
) を指定するとプロキシーは行われません。 - リテラル数値としてポート番号を IP アドレスやドメイン名につけることができます(
1.2.3.4:80
やfoo.example.com:80
)。
設定例は以下です。
[Service] Environment="HTTP_PROXY=http://proxy.example.com:80" Environment="HTTPS_PROXY=https://proxy.example.com:443" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
- IP アドレスプレフィックス (
-
設定を反映して Docker を再起動します。
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
-
設定が適切にロードされていること、そして変更した内容が反映されていることを確認します。 たとえば以下のようにします。
$ sudo systemctl show --property=Environment docker Environment=HTTP_PROXY=http://proxy.example.com:80 HTTPS_PROXY=https://proxy.example.com:443 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
-
Docker サービスに対応した systemd のドロップインディレクトリを生成します。
$ mkdir -p ~/.config/systemd/user/docker.service.d
-
~/.config/systemd/user/docker.service.d/http-proxy.conf
というファイルを生成して、そこに環境変数HTTP_PROXY
の設定を書きます。[Service] Environment="HTTP_PROXY=http://proxy.example.com:80"
HTTPS プロキシーサーバーを利用している場合には、環境変数
HTTPS_PROXY
の設定を書きます。[Service] Environment="HTTPS_PROXY=https://proxy.example.com:443"
環境変数を同時に複数設定することもできます。 以下は HTTP および HTTPs プロキシーを設定します。
[Service] Environment="HTTP_PROXY=http://proxy.example.com:80" Environment="HTTPS_PROXY=https://proxy.example.com:443"
-
内部に Docker レジストリがあって、プロキシーを介さずに接続する必要がある場合は、環境変数
NO_PROXY
を通じて設定することができます。変数
NO_PROXY
は、プロキシーから除外したいホスト名を、カンマで区切った文字列として指定します。 ホストを除外する設定は必要に応じて行います。- IP アドレスプレフィックス (
1.2.3.4
) - ドメイン名、あるいは特別な DNS ラベル (
*
) - ドメイン名は、その名前とサブドメインすべてにマッチします。
先頭に “.” のついたドメイン名は、サブドメインのみにマッチします。
たとえばドメイン名が
foo.example.com
とexample.com
であるとします。example.com
はexample.com
とfoo.example.com
にマッチします。.example.com
はfoo.example.com
のみにマッチします。
- 単一のアスタリスク (
*
) を指定するとプロキシーは行われません。 - リテラル数値としてポート番号を IP アドレスやドメイン名につけることができます(
1.2.3.4:80
やfoo.example.com:80
)。
設定例は以下です。
[Service] Environment="HTTP_PROXY=http://proxy.example.com:80" Environment="HTTPS_PROXY=https://proxy.example.com:443" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
- IP アドレスプレフィックス (
-
設定を反映して Docker を再起動します。
$ systemctl --user daemon-reload $ systemctl --user restart docker
-
設定が適切にロードされていること、そして変更した内容が反映されていることを確認します。 たとえば以下のようにします。
$ systemctl --user show --property=Environment docker Environment=HTTP_PROXY=http://proxy.example.com:80 HTTPS_PROXY=https://proxy.example.com:443 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
Docker デーモンがどこからの接続待ちをするかの設定
Docker デーモンがどこからの接続待ちをするかの設定 を参照してください。
systemd ユニットファイルの手動生成
パッケージを利用せずにインストールを行った場合は、systemd を用いた Docker の設定が必要になるはずです。
これを行うには 2 つのユニットファイル(service
とsocket
)を Github リポジトリ から入手して/etc/systemd/system
に置いてください。