systemd を用いた Docker の管理

読む時間の目安: 3 分

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_PROXYHTTPS_PROXYNO_PROXYという環境変数を利用して、HTTP または HTTPS プロキシーの動作を定めています。 この環境変数による設定はdaemon.jsonファイルを用いて行うことはできません。

以下は、デフォルトのdocker.serviceファイルを上書き設定する例です。

企業内で設定されるような HTTP あるいは HTTPS プロキシーサーバーを利用している場合は、Docker systemd サービスファイルに、これらの設定を加える必要があります。

rootless モードに関するメモ

Docker を rootless モード で起動させるとき、systemd 設定ファイルの収容ディレクトリは異なるところにあります。 rootless モードの起動にあたって、Docker はユーザーモードの systemd サービスとして起動されます。 そしてその設定ファイルは、各ユーザーのホームディレクトリ配下の~/.config/systemd/user/docker.service.d/にあるものを利用します。 これに加えてsystemctlsudoを用いず--userフラグをつけて実行することが必要です。 rootless モードにより Docker を動作させる場合は、以下の “rootless モード” を選んでください。

  1. Docker サービスに対応した systemd のドロップインディレクトリを生成します。

    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. /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"
    
  3. 内部に Docker レジストリがあって、プロキシーを介さずに接続する必要がある場合は、環境変数NO_PROXYを通じて設定することができます。

    変数NO_PROXYは、プロキシーから除外したいホスト名を、カンマで区切った文字列として指定します。 ホストを除外する設定は必要に応じて行います。

    • IP アドレスプレフィックス (1.2.3.4)
    • ドメイン名、あるいは特別な DNS ラベル (*)
    • ドメイン名は、その名前とサブドメインすべてにマッチします。 先頭に “.” のついたドメイン名は、サブドメインのみにマッチします。 たとえばドメイン名がfoo.example.comexample.comであるとします。
      • example.comexample.comfoo.example.comにマッチします。
      • .example.comfoo.example.comのみにマッチします。
    • 単一のアスタリスク (*) を指定するとプロキシーは行われません。
    • リテラル数値としてポート番号を IP アドレスやドメイン名につけることができます(1.2.3.4:80foo.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"
    
  4. 設定を反映して Docker を再起動します。

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
    
  5. 設定が適切にロードされていること、そして変更した内容が反映されていることを確認します。 たとえば以下のようにします。

    $ 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
    
  1. Docker サービスに対応した systemd のドロップインディレクトリを生成します。

    $ mkdir -p ~/.config/systemd/user/docker.service.d
    
  2. ~/.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"
    
  3. 内部に Docker レジストリがあって、プロキシーを介さずに接続する必要がある場合は、環境変数NO_PROXYを通じて設定することができます。

    変数NO_PROXYは、プロキシーから除外したいホスト名を、カンマで区切った文字列として指定します。 ホストを除外する設定は必要に応じて行います。

    • IP アドレスプレフィックス (1.2.3.4)
    • ドメイン名、あるいは特別な DNS ラベル (*)
    • ドメイン名は、その名前とサブドメインすべてにマッチします。 先頭に “.” のついたドメイン名は、サブドメインのみにマッチします。 たとえばドメイン名がfoo.example.comexample.comであるとします。
      • example.comexample.comfoo.example.comにマッチします。
      • .example.comfoo.example.comのみにマッチします。
    • 単一のアスタリスク (*) を指定するとプロキシーは行われません。
    • リテラル数値としてポート番号を IP アドレスやドメイン名につけることができます(1.2.3.4:80foo.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"
    
  4. 設定を反映して Docker を再起動します。

    $ systemctl --user daemon-reload
    $ systemctl --user restart docker
    
  5. 設定が適切にロードされていること、そして変更した内容が反映されていることを確認します。 たとえば以下のようにします。

    $ 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に置いてください。

docker, daemon, systemd, configuration