Dockerデーモンに関するもう少し詳しい説明


 どのような仮想環境でも、仮想環境全体を制御する管理機能的役割を果たすコンポーネントがあると思います。

 Dockerの場合は、dockerデーモンがその役割を担ってます。

 通常は、Dockerデーモンは大々的に前面には登場しませんが、なにか少し複雑なことをしてみたいとか、問題が発生したときなどには、逆にほぼ関わってきます。

 そんな時に役に立つ情報になればと思い、dockerデーモンの基本的なことから、更にもう少し突っ込んだ内容について書いてみました。

 実際のDocker環境を利用した例を掲載しておりますが、ホストOSはCentOS7.2を使用しております。

 

Dockerデーモンの詳細説明

 Dockerデーモンは、Docker環境の中では最も重要なコンポーネントなのですが、縁の下の力持ち的な存在であるため、あまり目立たないと思います。

 

Dockerデーモンとは

 Dockerデーモンとは、Dockerの心臓部にあるとても重要なコンポーネントです。

 

 Dockerデーモンは、Docker内のコンポーネント(Dockerイメージ、Dockerコンテナ、Dockerネットワーク、DockerボリュームなどDockerの構成要素)の管理者的な位置づけのデーモンです。

 Docker内のコンポーネントを制御する場合は、Dockerクライアントを使ってDockerデーモンとやり取りを行います。また、Dockerデーモンのインターフェースは、REST APTを採用しており、自由度の高い構成となってます。

 Dockerコンテナを1つのOSと見た場合、DockerデーモンはそのOSのカーネル部分に相当すると考えて良いでしょう。

 Dockerは、コンテナ型仮想環境を提供するために、Linuxカーネルが元々持っている複数の機能を利用してます。言い換えれば、Dockerは、Linuxカーネルが元々持つ便利で複雑な機能を組み合わせて、利用者に解り安く仮想環境を提供してくれている、といって良いと思います。

 参考までに、Linuxが利用しているLinuxカーネルの機能の主なものを以下に挙げます。

名称 説明
namespaces プロセスに対する各種リソース割り当てを分離
させる技術
cgroup システムリソースの割り当て、制御を行う
Union FileSystem 複数のマウントポイントを1つに束ねる技術

 いつかLinuxカーネルの標準機能を使って、自分がDockerになったつもりで、手動でコンテナを作ってみたいと思います。そのときは、このサイトに載せようと思います。

 

 では、実際にDockerデーモンを見てみましょう。

 ホストOSはCentOS7.2を使用してます。

 まずは「systemctl status」にてdockerサービスのステータスを確認します。

# systemctl status docker

 

 以下のような内容が出力されたと思います。

 ● docker.service - Docker Application Container Engine
 Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
 Active: active (running) since 木 2016-08-25 18:35:46 JST; 17h ago
 Docs: https://docs.docker.com
 Main PID: 27097 (dockerd)
 Memory: 26.0M
 CGroup: /system.slice/docker.service
 |-27097 /usr/bin/dockerd
 |-27103 docker-containerd -l unix:///var/run/docker/libcontainerd/...
 |-27506 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-po...
 |-27512 docker-containerd-shim 4c4803f8a07b4d089638bcb0151cb43753d...

8月 25 18:35:45 srv1.local dockerd[27097]: time="2016-08-25T18:35:45.8..."
8月 25 18:35:46 srv1.local systemd[1]: Started Docker Application Cont....
8月 25 18:36:13 srv1.local dockerd[27097]: time="2016-08-25T18:36:13+0..."
 Hint: Some lines were ellipsized, use -l to show in full.

 CentOS7.2では、Dockerはsystemd配下で動いています。よって、Dockerデーモンはsystemctlコマンドにて操作します。

 Dockerデーモンのバイナリは、「/usr/bin/dockerd」のようですね。

「ps」コマンドで見てみましょう。

# ps -ef | grep dockerd

以下のような内容が出力されたと思います。

root 27097 1 0 8月25 ? 00:00:38 /usr/bin/dockerd

いました。特にオプションはついていないようですね。

■ 本記事の目次に戻る ■

dockerdのオプションの設定方法

 では、dockerdのオプションについてみてみましょう。

 dockerdのオプション一覧は以下のコマンドで確認できます。

# /usr/bin/dockerd --help

 内容はバージョンごとに異なると思いますので、省略します。

 詳細は、Docker公式サイトでご確認ください。

 とりあえず、単独のDockerホストで外部から接続可能なDockerコンテナを作ることでしたら、デフォルトの状態で問題ないと思います。

 とりあえず、単独のDockerホストで外部から接続可能なDockerコンテナを作ることでしたら、デフォルトの状態で問題ないと思います。

 

 オプションを指定する場合は、以下のディレクトリに定義ファイルを置くことで、dockerデーモンの起動時に、その内容を自動で反映してくれます。

/etc/systemd/system/docker.service.d/

 例えば、通常はDockerレジストリとの通信はhttpsで行いますが、特定のネットワーク内のDockerレジストリはhttpで行うようにするためには、dockerdに「--insecure-registry」オプションを使用します。

 例えば、「192.168.0.0/24」のネットワーク内のDockerレジストリとの通信はhttpで大丈夫なように設定する場合は、以下の内容の定義ファイル「docker.conf」(ファイル名は任意)を上のディレクトリに作成します。

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.0.0/24

 この内容のファイル「docker.conf」を「/etc/systemd/system/docker.service.d/」に保存したら、dockerdの再起動を行います。

 まず、systemd関連のファイルを更新したので、以下のコマンドを実行します。

# systemctl daemon-reload

 その後、以下のコマンドでdockerdの再起動を行います。

# systemctl restart docker

 再起動後、定義が反映されていることを確認します。

# systemctl status docker

 以下のような内容が出力されたと思います。

 ● docker.service - Docker Application Container Engine
 Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
 Drop-In: /etc/systemd/system/docker.service.d
      |-docker.conf
 Active: active (running) since 金 2016-08-26 14:20:02 JST; 1min 11s ago
 Docs: https://docs.docker.com
 Main PID: 27029 (dockerd)
 Memory: 56.0M
 CGroup: /system.slice/docker.service
      |-27029 /usr/bin/dockerd --insecure-registry=192.168.0.0/24
 (以下省略)

 「/usr/bin/dockerd」が以下のように、指定したオプション付きで起動されていることが確認できました。

|-27029 /usr/bin/dockerd --insecure-registry=192.168.0.0/24

 あと、出力内容の3~4行目に、先ほど作成したファイルが読み込まれていることも解ります。

Drop-In: /etc/systemd/system/docker.service.d
 |-docker.conf

 今後、Dockerに色々なカスタマイズを行うことになると思いますが、その際はこの方法でオプションの追加を行う必要が出てくるかもしれませんので、覚えておいた方が良いかもしれません。

■ 本記事の目次に戻る ■

Dockerデーモンとの通信(コミュニケーション)方法

 Dockerデーモンとの通信は、Dockerクライアントである「docker」コマンドを使用して行いますが、その通信には、デフォルトでは「unixドメインソケット」という技術を使用して行います。

 unixドメインソケットは、ファイルシステムを介して行う通信方式で、Dockerは「/var/run/docker.sock」というファイルを使用してます。

 「ls」コマンドで確認してみてください。

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 8月 26 14:19 /var/run/docker.sock

 このファイルを使用して、プロセス間通信を行っています。

 ファイルの所有権は、ユーザはroot、グループはdockerになっています。

 以前の記事で、Docker管理者を追加する方法について書かせていただきましたが、その際に行ったdockerグループへの追加作業は、ここと関連しているのです。
 このファイルへの読み書きができませんと、dockerデーモンと通信が出来ないことになります。

 試しにテスト環境で、「/var/run/docker.sock」のグループをrootにしたら、今まで使えていたdocker管理ユーザで「docker ps」を行っても、Dockerデーモンと通信が出来なくなり、以下の内容が出力されるようになってしまいました。

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

 所有権を元に戻したら、当然元に戻りました。
 危険なので、あえてコマンドは書きませんが、お試しになる場合は自己責任でお願いします。

 Dockerデーモンとの通信方法は、unixドメインソケット以外に、TCPソケットもあります。しかし、この方法を安易に行ってしまいますと、Dockerホストのroot権限を晒すこととイコールになってしまいますので、十分ご注意ください。
 これに関しましては、そのうち書きたいと思います。

 最後までお読みいただきありがとうございました。

■ 本記事の目次に戻る ■


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください