systemd における Docker の設定と管理¶
Linux ディストリビューションでは、Docker デーモンの起動に systemd を用いるものが多くあります。このドキュメントでは Docker の設定例をいくつか示します。
Docker デーモンの起動¶
手動で起動する場合¶
Docker をインストールしたら Docker デーモンの起動が必要になる場合もあるでしょう。たいていの Linux ディストリビューションでは systemctl
を使ってサービスを起動します。systemctl
がない場合は service
コマンドを使ってください。
systemctl
の場合$ sudo systemctl start docker
service
の場合$ sudo service docker start
システムブート時に自動起動する場合¶
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 (ルートレス)モードの注意
systemd の設定ファイルの場は、Docker を rootless モード で実行する場合、通常とは異なる場所になります。rootless モードで実行時、 Docker はユーザ・モード systemd サービスで開始され、各ユーザのホームティレクトリにある ~/.config/systemd/user/docker.service.d/
に保存されているファイルを使います。さらに、 systemctl
は sudo
を使わずに --user
フラグを使う必要があります。Docker を rootless モードで実行中の場合は、 rootless mode の項目をご覧ください。
通常のインストール¶
- Docker サービスに対応した systemd のドロップイン・ディレクトリを生成します。
$ 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/"
複数の環境変数を設定できます。 HTTPS 以外と 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"
- 変更を反映し、 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
rootless モード¶
- 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/"
複数の環境変数を設定できます。 HTTPS 以外と 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"
- 変更を反映し、 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
に置いてください。
参考
- Control Docker with systemd
- https://docs.docker.com/config/daemon/systemd/