各システムの Docker 設定と実行¶
Docker のインストールに成功したら、 docker デーモンはデフォルトの設定で動いています。
プロダクション環境では、システム管理者は組織における必要性に従い、 docker デーモンの設定を変更し、起動・停止するでしょう。ほとんどの場合、システム管理者は docker デーモンの起動・停止のために SysVinit 、 Upstart 、 systemd といったプロセス・マネージャを設定するでしょう。
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 オプションの設定を変更するには:
- ホストに
sudoやroot特権を持つユーザでログインします。
- ホスト上に
/etc/default/dockerファイルがなければ作成します。Docker のインストール方法によっては、既にファイルが作成されている場合があります。
- 任意のエディタでファイルを開きます。
$ sudo vi /etc/default/docker
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への接続をリッスン
コマンドライン・リファレンスの デーモンのフラグ一覧 に説明があります。
- ファイルを保存して閉じます。
dockerデーモンを再起動します。
$ sudo restart docker
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 を使います。
CentOS 、 Red Hat Enterprise Linux 、 Fedora に 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 オプションの設定を変更するには:
- ホストに
sudoやroot特権を持つユーザでログインします。
/etc/systemd/system/docker.service.dディレクトリを作成します。
$ sudo mkdir /etc/systemd/system/docker.service.d
/etc/systemd/system/docker.service.d/docker.confファイルを作成します。
- 任意のエディタでファイルを開きます。
$ sudo vi /etc/systemd/system/docker.service.d/docker.conf
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への接続をリッスン
コマンドライン・リファレンスの デーモンのフラグ一覧 に説明があります。
- ファイルを保存して閉じます。
- 変更を反映(フラッシュ)します。
$ sudo systemctl daemon-reload
dockerデーモンを再起動します。
$ sudo systemctl restart docker
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/