Docker構成図を利用してDockerシステム構成要素を詳しく解説

Docker
Docker公式ロゴ
©2020 Docker Inc. All rights reserved

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

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

 今回は、もう少し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では、「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-image

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-datavolume2

 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-network

おわりに

 Dockerの仮想マシンであるDockerコンテナを動かすために、様々な構成要素が存在していることをご理解いただけましたでしょうか。

 Dockerをお使いになる際には、本記事で解説した構成要素を意識していただきますと、Dockerの素晴らしさがもっとお分かりいただけると思います。

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

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

コメント

タイトルとURLをコピーしました