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/ に保存されているファイルを使います。さらに、 systemctlsudo を使わずに --user フラグを使う必要があります。Docker を rootless モードで実行中の場合は、 rootless mode の項目をご覧ください。

通常のインストール

  1. Docker サービスに対応した systemd のドロップイン・ディレクトリを生成します。
$ mkdir -p /etc/systemd/system/docker.service.d
  1. /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"
  1. 内部に Docker レジストリがあって、プロキシを介さずに接続する必要がある場合は、環境変数 NO_PROXY を通じて設定することができます。

NO_PROXY 変数の文字列を指定する場合は、プロキシを除外したいホスト名にあたる値の記述を、カンマ記号で区切ります。ホストを除外する指定には、以下のオプションがあります。

  • IP アドレスのプレフィックス( 1.2.3.4

  • ドメイン名、もしくは特別な DNS ラベル( *

  • ドメイン名に一致する、全てのサブドメイン。ドメイン名の先頭に . 記号があれば、一致するサブドメインのみを対象。例えば、 foo.example.comexample.com がある場合:

    • example.com に一致するのは、 example.comfoo.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"
  1. 変更を反映し、 Docker を再起動します。
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 設定が読み込まれ、変更が反映したかどうかを確認します。
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 モード

  1. Docker サービスに対応した systemd のドロップイン・ディレクトリを生成します。
mkdir -p ~/.config/systemd/user/docker.service.d
  1. ~/.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"
  1. 内部に Docker レジストリがあって、プロキシを介さずに接続する必要がある場合は、環境変数 NO_PROXY を通じて設定することができます。

NO_PROXY 変数の文字列を指定する場合は、プロキシを除外したいホスト名にあたる値の記述を、カンマ記号で区切ります。ホストを除外する指定には、以下のオプションがあります。

  • IP アドレスのプレフィックス( 1.2.3.4

  • ドメイン名、もしくは特別な DNS ラベル( *

  • ドメイン名に一致する、全てのサブドメイン。ドメイン名の先頭に . 記号があれば、一致するサブドメインのみを対象。例えば、 foo.example.comexample.com がある場合:

    • example.com に一致するのは、 example.comfoo.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"
  1. 変更を反映し、 Docker を再起動します。
systemctl --user daemon-reload
systemctl --user restart docker
  1. 設定が読み込まれ、変更が反映したかどうかを確認します。
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 つのユニットファイル(servicesocket )を Github リポジトリ から入手して /etc/systemd/system に置いてください。

参考

Control Docker with systemd
https://docs.docker.com/config/daemon/systemd/