各システムの Docker 設定と実行

Docker のインストールに成功したら、 docker デーモンはデフォルトの設定で動いています。

プロダクション環境では、システム管理者は組織における必要性に従い、 docker デーモンの設定を変更し、起動・停止するでしょう。ほとんどの場合、システム管理者は docker デーモンの起動・停止のために SysVinitUpstartsystemd といったプロセス・マネージャを設定するでしょう。

docker デーモンを直接実行

docker デーモンは dockerd コマンドで直接操作できます。デフォルトでは Unix ソケット unix:///var/run/docker.sock をリッスンします。

$ dockerd

INFO[0000] +job init_networkdriver()
INFO[0000] +job serveapi(unix:///var/run/docker.sock)
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
...
...

docker デーモンを直接設定

プロセス・マネージャの代わりに、docker daemon コマンドを使って docker デーモンを直接実行できます。 docker をコマンドで直接実行時に、オプション設定を追加可能です。 docker デーモンを設定するための他のオプションも追加できます。

デーモンで利用可能なオプション:

フラグ 説明
-D , --debug=false デバッグ・モードの有効化と無効化。デフォルトは false
-H , --host=[] デーモンが接続するソケット
--tls=false TLS の有効化と無効化。デフォルトは false

以下は docker デーモンに設定オプションを付けて実行する例です。

$ dockerd -D --tls=true --tlscert=/var/docker/server.pem    --tlskey=/var/docker/serverkey.pem -H tcp://192.168.59.3:2376

3つのオプションがあります:

  • -D (デバッグ)モードの有効化
  • tls を有効にするため、サーバ証明書と鍵を --tlscert--tlskey で個々に指定
  • tcp://192.168.59.3:2376 への接続をリッスン

コマンドライン・リファレンスの デーモンのフラグ一覧 に説明があります。

デーモンのデバッグ

更に捕捉しますと、管理者やオペレータがデーモンの実行時の挙動に関して、更に詳細な情報を得るには、デーモンのログレベルを「debug」に設定するか、 -D オプションを付けてデバッグ・モードにします。デーモンからの応答が無くても、Docker デーモンに対して SIGUSR1 シグナルを送信することで、デーモンのログに追加された全てのスレッドを強制的に追跡します。Linux システム上でシグナルを送る一般的な方法は kill シグナルを使います。例えば kill -USR1 <デーモンのpid> を実行したら、デーモンのプロセスに SIGUSR1 シグナルを送信し、スタック・ダンプをデーモンのログに追加します。

注釈

スタック・トレースをログに保存するには、 デーモンのログレベルの設定は少なくとも「info」レベル以上にする必要があります。デフォルトのデーモンのログレベルは「info」に設定されています。

デーモンは SIGUSR1 シグナルを受け取った後、スタック・トレースをダンプしてログに出力します。スタック・トレースはデーモン内部の全ての goroutine の状態とスレッドの把握に使えます。

Ubuntu

Ubuntu 14.04 からはプロセス・マネージャに Upstart を使います。デフォルトでは、Upstart のジョブは /etc/init に保管され、 docker Upstart ジョブは /etc/init/docker.conf にあります。

Ubuntu で Docker のインストール に成功した後、Upstart で稼働状態を確認するには、次のようにします。

$ sudo status docker
docker start/running, process 989

コンテナの実行

docker デーモンは次のように開始・停止・再起動できます。

$ sudo start docker

$ sudo stop docker

$ sudo restart docker

Docker の設定

以下の例は、プロセス・マネージャに upstart を使い Docker システムを設定する方法です。Ubuntu 15.04 以降はプロセス・マネージャに systemd を使います。Ubuntu 15.04 以降は、 systemd で Docker の管理・設定 をご覧ください。

システム上にある docker デーモンの設定は、 /etc/default/docker ファイルを編集します。ここに DOCKER_OPTS 環境変数を指定可能です。

Docker オプションの設定を変更するには:

  1. ホストに sudoroot 特権を持つユーザでログインします。
  1. ホスト上に /etc/default/docker ファイルがなければ作成します。Docker のインストール方法によっては、既にファイルが作成されている場合があります。
  1. 任意のエディタでファイルを開きます。
$ sudo vi /etc/default/docker
  1. DOCKER_OPTS 変数に、次のオプションを指定します。これらのオプションは docker デーモンを実行する時に追加されます。
DOCKER_OPTS="-D --tls=true --tlscert=/var/docker/server.pem --tlskey=/var/docker/serverkey.pem -H tcp://192.168.59.3:2376"

これらのオプションの意味は:

  • -D (デバッグ)モードの有効化
  • tls を有効にするため、サーバ証明書と鍵を --tlscert--tlskey で個々に指定
  • tcp://192.168.59.3:2376 への接続をリッスン

コマンドライン・リファレンスの デーモンのフラグ一覧 に説明があります。

  1. ファイルを保存して閉じます。
  1. docker デーモンを再起動します。
$ sudo restart docker
  1. docker デーモンが指定したオプションで実行しているか、 ps コマンドで確認します。
$ ps aux | grep docker | grep -v grep

ログ

Upstart ジョブのログは、デフォルトでは /var/log/upstart に保管されており、 docker デーモンのログは /var/log/upstart/docker.log にあります。

$ tail -f /var/log/upstart/docker.log
INFO[0000] Loading containers: done.
INFO[0000] Docker daemon commit=1b09a95-unsupported graphdriver=aufs version=1.11.0-dev
INFO[0000] +job acceptconnections()
INFO[0000] -job acceptconnections() = OK (0)
INFO[0000] Daemon has completed initialization

CentOS / Red Hat Enterprise Linux / Fedora

CentOS と RHEL の 7.x 以降では、プロセス・マネージャに systemd を使います。Fedora 21 以降は、プロセス・マネージャに systemd を使います。

CentOSRed Hat Enterprise LinuxFedora に Docker をインストール後は、次のように稼働状態を確認できます。

$ sudo systemctl status docker

Docker の実行

docker デーモンは次のように開始・停止・再起動できます。

$ sudo systemctl start docker

$ sudo systemctl stop docker

$ sudo systemctl restart docker

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

$ sudo systemctl enable docker

Docker の設定

CentOS 7.x と RHEL 7.x では systemd で Docker を管理・設定できます

以前の CentOS 6.x や RHEL 6.x の場合は、システム上にある docker デーモンの設定は /etc/default/docker ファイルを編集し、ここで様々な変数を設定します。CentOS 7.x と RHEL 7.x では、この変数名が OPTIONS になります。CentOS 6.x と RHEL 6.x では、この変数名は other_args です。このセクションでは CentOS 7 の docker デーモンを例に説明します。

Docker オプションの設定を変更するには:

  1. ホストに sudoroot 特権を持つユーザでログインします。
  1. /etc/systemd/system/docker.service.d ディレクトリを作成します。
$ sudo mkdir /etc/systemd/system/docker.service.d
  1. /etc/systemd/system/docker.service.d/docker.conf ファイルを作成します。
  1. 任意のエディタでファイルを開きます。
$ sudo vi /etc/systemd/system/docker.service.d/docker.conf
  1. docker デーモンの設定を変更するため、 docker.service ファイルの ExecStart 設定を上書きします。 ExecStart 設定を変更するためには、新しい設定行を追加する前に、次のように空の設定行を追加します。
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -D --tls=true --tlscert=/var/docker/server.pem --tlskey=/var/docker/serverkey.pem -H tcp://192.168.59.3:2376

これらのオプションの意味は:

  • -D (デバッグ)モードの有効化
  • tls を有効にするため、サーバ証明書と鍵を --tlscert--tlskey で個々に指定
  • tcp://192.168.59.3:2376 への接続をリッスン

コマンドライン・リファレンスの デーモンのフラグ一覧 に説明があります。

  1. ファイルを保存して閉じます。
  1. 変更を反映(フラッシュ)します。
$ sudo systemctl daemon-reload
  1. docker デーモンを再起動します。
$ sudo systemctl restart docker
  1. docker デーモンが指定したオプションで実行しているか、 ps コマンドで確認します。
$ ps aux | grep docker | grep -v grep

ログ

systemd は自身で journal と呼ばれるロギング・システムを持っています。 docker デーモンのログ表示は journalctl -u docker を使います。

$ sudo journalctl -u docker
May 06 00:22:05 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
May 06 00:22:05 localhost.localdomain docker[2495]: time="2015-05-06T00:22:05Z" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
May 06 00:22:05 localhost.localdomain docker[2495]: time="2015-05-06T00:22:05Z" level="info" msg="Listening for HTTP on unix (/var/run/docker.sock)"
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="+job init_networkdriver()"
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="-job init_networkdriver() = OK (0)"
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="Loading containers: start."
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="Loading containers: done."
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="Docker daemon commit=1b09a95-unsupported graphdriver=aufs version=1.11.0-dev""
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="+job acceptconnections()"
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="-job acceptconnections() = OK (0)"

注釈

journal の使い方や設定方法は高度なトピックのため、この記事の範囲では扱いません。

デーモンのないコンテナ(daemonless container)

Docker 1.12 から、 Docker や containerd 実行しなくてもコンテナを実行可能になります。これにより、システム上のコンテナに影響を与えずに、Docker デーモンを停止してのアップグレードや障害からの復旧が可能になります。この機能を有効にするためには、 dockerd の起動時点で --live-restore フラグの追加が必要です。この場合、Docker はコンテナの停止(kill)や丁寧な停止(graceful shutdown)や、実行中のコンテナに対する再起動ができなくなります。

Docker デーモンが停止中でも、ログ機能は収集し続けます。しかしながら、カーネルのパイプ・バッファ・サイズにバッファが満たされる上限に到達すると、処理が止まります。これらのバッファをフラッシュするには、Docker で再起動が必用です。カーネルがキャッシュするバッファ・サイズは /proc/sys/fs/pipe-max-size で変更できます。

参考

Configuring and running Docker on various distributions
https://docs.docker.com/engine/admin/configuring/