前回は他の仮想化技術との比較について書きました。
コンテナ型仮想化が他の仮想化よりも良いということではなく、コンテナ型仮想化とはどういうもので、どういった場面で活躍できそうなのか、という観点で書いたつもりです。
今回は、もう少しDockerのことをご理解いただくために、Dockerの構成要素をシステム構成図を使用して解説します。
私がDockerの勉強を始めたばかりのころは、単にDockerのコマンドを実行して、その出力結果に一喜一憂する毎日でした。
しかし、本を読んだり、Docker公式サイト(日本語あり)の技術情報を読んだりして知識が身に付いてくると、最初に思っていたシステム構成と全く異なっていることに気づきました。
そこで、システム構成図を作成して頭の中を整理してみたところ、だんだんと理解が深まり、応用も効くようになってきました。
本記事をお読みになり、Dockerについてもうワンランク理解度をアップしていただけましたら幸いです。
Dockerの構成概要
Dockerは、Dockerコンテナ、Dockerイメージ、及びDockerレジストリという重要な3つのコンポーネントがあり、それをDockerデーモンがハンドリングしています。
Dockerデーモンに処理を依頼する場合は、Dockerクライアントを使用して行います。
Dockerの構成図
まずは、Dockerの構成図です。
Dockerデーモンを中心とした構成になっていまして、Dockerクライアントからコマンドによって各構成要素を操作するのが基本です。
Dockerシステム内の構成要素
図内の個々の構成要素について解説します。
Dockerデーモン
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コマンド1つで全てのことが出来るようになってます。
DockerデーモンとDockeクライアント間の通信は、デフォルトではUnixドメインソケットを使用します。
Dockerデーモンに実装されているREST APIを利用することも可能です。
Dockerイメージ
Dockerイメージは、Dockerコンテナの雛形となるファイル群です。Dockerコンテナは、ひな型となるDockerイメージを指定して作成します。
Dockerホスト内にはDockerイメージの格納場所があります。Dockerデーモンは、ローカルのDockerイメージの格納場所にあるDockerイメージを使用して、Dockerコンテナを起動します。
ローカルに目的のDockerイメージが存在しない場合は、自動的にリモートにあるDockerレジストリから入手します。
DockerイメージはReadOnly(読み込み専用)です。
また、Dockerイメージを利用して新たなイメージを作成することもできます。
Dockerイメージは、下図のとおり、レイヤ管理されており、Dockerイメージを更新する場合は、既存のイメージに、更新部分のイメージのみの新しいレイヤを積み重ねることになります。
Dockerレジストリ
様々なDockerイメージが格納されているサーバです。
Docker公式のDockerレジストリとして「Docker Hub」がありまして、誰でもDockerイメージの登録や入手が可能となっています。
その中には、著名なベンダが作成した公式Dockerイメージも含まれています。例えば、ApacheやMySQLの公式Dockerイメージなどです。
CentOSなどLinuxのディストリビューション提供ベンダのDockerイメージもあります。
一般ユーザのDockerイメージもあるのですが、出所がわからないため入手するのに躊躇してしまいますよね。
ベンダの公式なDockerイメージですと比較的安心して利用することができるでしょう。
Dockerコマンド(docker pullやdocker run)を使用して、いつでも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ストレージを利用しなくても、Dockerイメージを使って起動したDockerコンテナ内のファイルを更新することは可能ですが、Dockerコンテナが削除されてしまうと更新情報は消えてしまいます。
更新情報を残すためには、現状の状態をイメージファイルとして出力(commit若しくはexport)します。そのイメージファイルを使用するには、出力したイメージファイルを取り込み(import)、そのイメージからDockerコンテナを起動する必要があります。
Dockerネットワーク
Dockerネットワークは、Dockerコンテナが使用するDocker環境内の仮想ネットワークです。
Dockerをインストールした時点でいくつかのDockerネットワークが自動的に作成されますが、その中の1つに「bridge」という名前のDockerネットワークがあります。
Dockerコンテナが起動されますと、特にDockerネットワークの指定を行わなかった場合は、このbridgeネットワークに接続されます。
DockerネットワークにはDHCP機能のようなIPを動的に割り当てる機能が内蔵されており、DockerコンテナにIPアドレスが設定されます。
もちろん、Dockerネットワークには複数のDockerコンテナを接続することが可能です。同一Dockerネットワーク内のDockerコンテナは、相互に通信可能です。
また、Dockerホストの物理ネットワークとDockerネットワークはブリッジ接続されますが、Dockerコンテナのポートは、デフォルトではDockerホストの外部からアクセスできません。
外部から接続するには、Dockerコンテナの指定ポートをDockerホストのポートに接続する必要があります。
おわりに
Dockerの仮想マシンであるDockerコンテナを動かすために、様々な構成要素が存在していることをご理解いただけましたでしょうか。
Dockerをお使いになる際には、本記事で解説した構成要素を意識していただきますと、Dockerの素晴らしさがもっとお分かりいただけると思います。
多少なりともDockerに興味が沸いていただけたら幸いです。
最後までお読みいただきありがとうございました。
コメント