Dockerのシステム構成について


 前回は他の仮想化技術との比較について書きました。

 コンテナ型仮想化が他の仮想化よりも良いということではなく、コンテナ型仮想化とはどういうもので、どういった場面で活躍できそうなのか、という観点で書いたつもりです。

 今回は、もう少しDockerのことをご理解いただくために、構成要素について書きたいと思います。

 私がDockerの勉強を始めたばかりのころは、単にDockerのコマンドを実行して、その出力結果に一喜一憂する毎日でした。

 しかし、本を読んだり、Docker公式サイト(日本語あり)の技術情報を読んだりして、知識を仕入れることで、最初に思っていたシステム構成と全く異なっていることを知り、そこから理解がより深まり、応用も効くようになったと感じてます。

 以下の内容をお読みいただき、Dockerの構成要素についての理解が深まっていただければ幸いです。

 

Dockerの構成概要

 Dockerは、Dockerコンテナ、Dockerイメージ、及びDockerレジストリという重要な3つのコンポーネントがあり、それをDockerデーモンが管理しています。

 Dockerデーモンに処理を依頼する場合は、Dockerクライアントを使用して行います。

 

Dockerの構成図

まずは、Dockerの構成図です。

docker-arche2

 

では、図内の個々の構成要素について解説します。

 

Dockerデーモン

 Dockerデーモンは、Dockerコンテナの心臓部を担うデーモンプロセスになります。

 Dockerクライアントからの命令を受け、その内容に応じて必要な処理を行います。Dockerコンテナを起動したり、Dockerイメージを作成したり、DockerレジストリにDockerイメージの検索を依頼したりするのは、このDockerデーモンです。

 Dockerデーモンは、Dockerホストにてサービスとして起動されます。CentOSなどではsystemd管理下のプロセスとして起動します。

 また、リモートのDockerクライアントからの要求をTCP/IP経由で受け取ることも可能です。但し、DockerデーモンはDockerホストにおいて、ほぼroot権限をもっていると思っていた方が良く、また、Dockerデーモン自体には認証機能がありません。よって、Dockerデーモンにリモートから接続可能であることは、Dockerホストのroot権限を外部に晒すことに近い状態になります。

 デフォルトは、TCP/IPを使わずに、ローカルのDockerクライアントの要求しか受けない仕組みになっております。設定を変更する場合は、Dockerデーモンに対してセキュリティを重要視した内容にする必要があります。

 

 

 Dockerクライアント

 Dockerデーモンに処理を依頼する場合は、Dockerクライアントである「docker」コマンドを使用します。

 Dockerデーモンとは、デフォルトでは、Unixドメインソケットを使用して通信を行います。Dockerデーモンに実装されているREST APIを利用することも可能です。

 Dockerでは、この「docker」コマンド1つで全てのことが出来るようになってます。

 

Dockerイメージ

 Dockerイメージは、Dockerコンテナの雛形となるファイル群です。DockerイメージからDockerコンテナを作成します。

 Dockerホスト内にはDockerイメージの格納場所があります。Dockerデーモンは、ローカルのDockerイメージの格納場所にあるDockerイメージを使用して、Dockerコンテナを起動します。ローカルに目的のDockerイメージが存在しない場合は、自動的にリモートにあるDockerレジストリから入手します。

 DockerイメージはReadOnly(読み込み専用)です。とはいっても、Dockerイメージを使用して新たなイメージを作成することは可能です。

 Dockerイメージは、下図のとおり、レイヤ管理されており、Dockerイメージを更新する場合は、既存のイメージに、更新部分のイメージのみの新しいレイヤを積み重ねることになります。

docker-image

Dockerレジストリ

 様々なDockerイメージが格納されているサーバです。Docker社公式のDockerレジストリとして「Docker Hub」というものがありまして、誰でもDockerイメージの登録や入手が可能となっています。

 その中には有名なベンダが作成した公式Dockerイメージも含まれています。例えば、ApacheやMySQLの公式Dockerイメージなどがあります。CentOSなどLinuxのディストリビューション提供ベンダのDockerイメージもあります。OSのDockerイメージだからといってOS全部のイメージという訳ではなく、当然Kernel以外のバイナリやライブラリの部分のみです。

 一般ユーザのDockerイメージは出所がわからないため入手するのに躊躇してしまいますが、ベンダの公式なDockerイメージですと比較的安心して利用することが出来ると思います。
いずれにしても自己責任で利用することになります。

 

Dockerコンテナ

 Dockerコンテナは、Dockerにおける仮想環境になります。目的に合ったDockerイメージを入手、もしくは作成し、それを起動することでDockerコンテナが出来上がります。

 このDockerコンテナをいかに効率良く、簡単に、素早く起動させるかがポイントになります。

 起動したDockerコンテナは、Dockerホスト外にサービスを提供することが可能です。デフォルトでは、外部にサービス用ネットワークポートを晒しませんので、設定が必要となります。

 また、外部のストレージをDockerコンテナにマウントさせることも可能です。

 

Dockerデータボリューム(ストレージ)

 図内にはありませんが、Dockerデータボリュームと呼ばれるDocker管理のストレージがあります。

 Dockerデータボリュームは、Dockerホスト内にDockerが管理するストレージをDockerコンテナとは別に作成します。Dockerデータボリュームを使用する場合は、Dockerコンテナ起動時に、事前に作成したDockerデータボリュームをマウントして利用します。Dockerコンテナが削除されても、Dockerストレージの内容は基本的(※)に削除されません。
(※)基本的にと書いたのは、Dockerコンテナ削除時のオプションで、Dockerデータボリュームを削除することが可能なためです

docker-datavolume2

 Dockerストレージを利用しなくても、Dockerイメージを使って起動したDockerコンテナ内のファイルを更新することは可能ですが、Dockerコンテナが削除されてしまうと更新情報は消えてしまいます。

 更新情報を残すためには、現状の状態をイメージファイルとして出力(commit若しくはexport)します。そのイメージファイルを使用するには、出力したイメージファイルを取り込み(import)、そのイメージからDockerコンテナを起動する必要があります。

 この方法は、例えば、データベースのDockerコンテナの場合は現実的ではないと思います。単純に、障害が発生してDockerコンテナが消えてしまうと、直近のイメージファイル出力以降の更新情報が消えてしまいます。

 

Dockerネットワーク

 Dockerネットワークは、Dockerコンテナが使用するDocker環境内の仮想ネットワークです。

 Dockerをインストールした時点でいくつかのDockerネットワークが自動的に作成されますが、その中の1つに「bridge」という名前のDockerネットワークがあります。

 Dockerコンテナが起動されますと、特にDockerネットワークの指定を行わなかった場合は、このbridgeネットワークに接続されます。

 DockerネットワークにはDHCP機能が内蔵されており、DockerコンテナにIPアドレスが設定されます。当然、Dockerネットワークには複数のDockerコンテナを接続することが可能です。同一Dockerネットワーク内のDockerコンテナは、相互に通信可能です。

 また、Dockerホストの物理ネットワークとはブリッジ接続されますが、Dockerコンテナのポートは、デフォルトではDockerホストの外部からアクセスできません。外部から接続するには、Dockerコンテナの指定ポートをDockerホストのポートに接続する必要があります。

docker-network

 以上でDockerの構成要素の説明を終わります。

 多少なりともDockerに興味が沸いていただけたら幸いです。

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

 


コメントを残す

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