Dockerコンテナテクノロジー-ソフトウェアアーキテクチャ

目次

コンテナエンジンの構成

まず、コンテナエンジンの一般的な構成を説明する例として、CNCFのコンテナコンテナエンジンを取り上げます。

ここに写真の説明を挿入
上図の左側と右側に分けると、containerdは2つの主要な機能を提供していると考えることができます。

  1. ランタイム。これは、コンテナのライフサイクルの管理です。
  2. ストレージ、つまり、ミラーリングされたストレージの管理。

ビューのレベルによると:

  • 最初のレイヤーはGRPCです。上位レイヤーの場合、containerdはGRPCサーブの形式で上位レイヤーにサービスを提供します。メトリックこの部分は、主にcgroupメトリックの一部のコンテンツを提供します。
  • 下のレイヤーの左側はコンテナイメージのストレージ、中央はイメージ、コンテナ、そして下のレイヤーはメタデータです。メタデータのこの部分は、bootfsを介してディスクに保存されます。右側のタスクは、管理コンテナのコンテナ構造です。イベントとは、コンテナの一部の操作でイベントが上位層に送信され、上位層がこのイベントをサブスクライブできることを意味します。これにより、コンテナの状態でどのような変更が発生したかがわかります。
  • 最下層はランタイムレイヤーです。このランタイムは、runCやkataコンテナなどのタイプで区別できます。

Dockerコンポーネント

ここに写真の説明を挿入

Dockerのソフトウェアアーキテクチャには次のものが含まれます。

  • Dockerクライアント:ビルド、プル、実行、その他の操作など、Dockerサーバープロセスへの要求を開始します。Dockerクライアントは、ローカルデーモン(ローカルホスト)プロセスとリモート(リモートホスト)デーモンプロセスの両方にアクセスできます。
  • Docker Server:REST APIリクエストをリッスンし、イメージ、コンテナ、ネットワーク、ボリュームなどのDockerオブジェクトを管理します。デーモンは、他のデーモンと通信してDockerサービスを管理することもできます。
  • Dockerレジストリ(レジストリ、ウェアハウス登録サーバー):Dockerイメージを格納する中央ウェアハウス。その中で、Docker Hubは誰でも使用できるパブリックレジストリです。DockerServerのデフォルト設定は、DockerHubでイメージを検索することです。個人もプライベートレジストリを実行できます。DockerDataCenterを使用する場合は、Docker Trusted Registry(DTR)が含まれます。dockerpullまたはdockerrunコマンドを使用すると、DockerServerによって構成されたレジストリから必要なイメージが抽出されます。

リポジトリとレジストリには違いがあることに注意してください。多くの場合、レジストリには複数のリポジトリが保存されており、各リポジトリには複数の画像が含まれており、各画像には異なるタグが付いています。

ここに写真の説明を挿入

Dockerのソフトウェアアーキテクチャ

ここに写真の説明を挿入

上の図からわかるように、Dockerのメインモジュールは次のとおりです。

  • Dockerクライアント
  • Dockerデーモン
  • Dockerレジストリ
  • グラフ
  • 運転者
  • Libcontainer
  • Dockerコンテナ

ユーザーはクライアントを使用してデーモンとの通信を確立し、デーモンにリクエストを送信します。デーモンは、Dockerのコアとして、最初にサーバーにクライアントのリクエストを受け入れるように提供し、次にエンジンを介してDocker内で一連のタスクを実行します。各タスクはジョブに基づいています。形の存在。

  • コンテナに画像を提供する必要がある場合は、レジストリから画像をダウンロードし、画像管理を使用してGraphdriverを駆動し、ダウンロードした画像をグラフの形式で保存します。
  • コンテナのネットワーク環境を作成する必要がある場合は、ネットワーク管理ドライバNetworkdriverを使用してコンテナネットワーク環境を作成および構成します。
  • 実行中のリソースを制限したり、コンテナーのユーザー命令を実行したりする必要がある場合は、Execdriverを使用して実行します。

Libcontainerは、独立したコンテナ管理モジュールです。NetworkdriverとExecdriverはどちらも、Libcontainerを使用してコンテナの操作を完了します。docker runの一連のタスクが実行された後、実際のコンテナは実行状態になります。コンテナには、独立したファイルシステム、独立した安全な動作環境などがあります。

Dockerクライアント

Dockerクライアントは、Linuxではdocker実行可能ファイルとして表示されます。クライアントがデーモンから返された応答を受信して​​単純な処理を実行すると、クライアントの完全なライフサイクルは終了します。クライアントは、次の3つの方法でデーモンとの通信を確立できます。

  1. tcp:// host:port
  2. unix:path_to_socket; fd:// socketfd
  3. コマンドラインパラメータを設定してTLS接続を設定します

Dockerデーモン

Docker Daemonは、Linuxのバックグラウンドに存在し、systemdで管理できるシステムプロセスとして表示されます。実際、これはDockerクライアントと同じdocker実行可能ファイルです。

Docker Daemonは、次のモジュールに分割できます。

  • APIサーバー:デーモンはバックグラウンドでDockerサーバーを起動します。これはGolangのGorilla / Muxパッケージに基づくAPIサーバーです。クライアントから送信された要求を受け入れて処理のために別のハンドラーにルーティングします。

Docker Serverの起動は、servapiという名前のジョブを実行することによって実行されることに注意してください。したがって、サーバーの本質は多くのジョブの1つです。

  • エンジン:Dockerの実行中のエンジンであり、Dockerコンテナストレージウェアハウスの役割を果たし、ジョブを実行することによってこれらのコンテナを操作および管理します。Docker Engineには、Docker Engine Enterprise(Enterprise Edition)とDocker Engine Community(Community Edition)の2つの異なるバージョンがあります。

  • ジョブ:ジョブは、エンジン内の最も基本的な作業実行単位と見なすことができます。Dockerによって行われるすべての作業は、ジョブに抽象化できます。例:コンテナ内でプロセスを実行します。これはジョブです。新しいコンテナを作成します。これはジョブです。インターネットからドキュメントをダウンロードします。これはジョブです。Jobの設計者は、Unixプロセッサに似たジョブを設計しました。例:ジョブには、名前、パラメーター、環境変数、標準の入力と出力、エラー処理、および戻り状況があります。

ここに写真の説明を挿入

Dockerレジストリ

Docker Registryは、画像を保存するためのリポジトリです。Dockerの操作中、デーモンはレジストリと通信し、ミラーの検索、ミラーのダウンロード、ミラーのアップロードの3つの機能を実装します。これらの3つの機能に対応するジョブは、検索、プル、およびプッシュです。

Dockerは、パブリックDockerレジストリ、つまりDocker Hubを使用できます。DockerHubから、オープンソースプロジェクト、ソフトウェアベンダー、さらには個人アカウントからのDockerイメージを見つけることができます。同時に、Dockerを使用すると、ユーザーはローカルのプライベートDockerレジストリを構築することもできます。これにより、コンテナイメージの取得がイントラネット上で確実に完了するようになります。

グラフ

グラフは、ダウンロードされたミラーの管理者およびダウンロードされたミラー間の関係のレコーダーとして機能します。Graphは、ローカルファイルシステムミラーをバージョン情報とともに保存する一方で、GraphDBを介してすべてのファイルシステムミラー間の関係を記録します。

その中で、GraphDBはSQLite上に構築された小さなグラフデータベースであり、ノードの命名とノード間の関係の記録を実装します。ほとんどのグラフデータベースの小さなサブセットのみを実装しますが、ノード間の関係を表すためのシンプルなインターフェイスを提供します。

同時に、Graphのローカルディレクトリでは、各コンテナイメージについて、格納されている特定の情報は、コンテナイメージのメタデータ、コンテナイメージのサイズ情報、およびコンテナイメージによって表される特定のRootfsです。

ここに写真の説明を挿入

運転者

Driverはドライバーモジュールであり、DockerはDriverを使用してコンテナの実行環境をカスタマイズします。次の3種類のドライバーに分けることができます。

  1. グラフドライバー
  2. ネットワークドライバー
  3. Execdriver

グラフドライバー

Graphdriverは、保存と取得を含む画像管理を完了するために使用されます。ユーザーが指定された画像をダウンロードする必要がある場合、Graphdriverは指定されたローカルディレクトリに画像を保存します。ユーザーが指定された画像を使用してコンテナのRootfsを作成する必要がある場合、Graphdriverは指定されたコンテナ画像をローカル画像保存ディレクトリから取得します。

Graphdriverが初期化される前に、4種類のファイルシステムまたはファイルのようなシステムが登録されています。それらは次のとおりです。

  1. Btrfs
  2. Vfs
  3. Devmapper

Graphdriverが初期化されると、システム環境変数DOCKER_DRIVERを取得して、使用されている指定されたタイプのドライバーを抽出します。以降のすべてのグラフ操作は、このドライバーを使用して実行されます。

Graphdriverのアーキテクチャは次のとおりです。

ここに写真の説明を挿入

ネットワークドライバー

Networkdriverは、次のようなコンテナネットワーク環境の構成を完了するために使用されます。

  • 起動時にDockerデーモン用のブリッジを作成します。
  • コンテナの作成時に専用の仮想ネットワークカードデバイスを作成し、IPとポートをコンテナに割り当て、ホストとのポートマッピングを実行し、コンテナのファイアウォールポリシーを設定します。

Networkdriverのアーキテクチャは次のとおりです。

ここに写真の説明を挿入

Execdriver

コンテナの実行ドライバとして、Execdriverは、コンテナランタイムネームスペースの作成、コンテナリソース使用の統計と制限、およびコンテナの内部プロセスの実際の操作を担当します。

Execdriverの初期の実装では、LXC Driverを使用してLXCのインターフェイスを呼び出し、コンテナーの構成とライフサイクルを操作していました。現在、Execdriverはデフォルトでネイティブドライバーを使用し、LXCに依存しなくなりました。デーモンの起動時にExecDriverflagパラメータを指定することで選択できます。デフォルトはネイティブです。

Execdriverのアーキテクチャは次のとおりです。

ここに写真の説明を挿入

Libcontainer

Libcontainerは、DockerアーキテクチャのGolangに実装されたライブラリです。設計の本来の目的は、ライブラリが依存関係に依存することなく、カーネル内のコンテナ関連のAPIに直接アクセスできることです。

Dockerが最終的にコンテナの名前空間、Cgroup、Apparmor、ネットワーク機器、およびファイアウォールルールを操作できるのは、まさにLibcontainerの存在によるものです。この一連の操作の完了は、LXCまたは他のライブラリに依存する必要はありません。

Libcontainerのアーキテクチャは次のとおりです。

ここに写真の説明を挿入

Dockerは、基盤となるコンテナーランタイムを取り除き、プラットフォームの独立性を向上させます。LibContainerは、さまざまなコンテナーを抽象化したものであり、RunCに開発され、コンテナー環境を定義するための標準としてOCP組織に貢献しました。

Dockerコンテナ

Docker Containerは、Linuxオペレーティングシステムで実行されるコンテナプロセスになります。これは、Dockerサービス提供の最終形式です。

  • ユーザーは、コンテナーがRootfsなどのファイルシステムをカスタマイズできるようにイメージを指定できます。
  • ユーザーは、コンテナーが指定されたコンピューティングリソースを使用できるように、コンピューティングリソースのクォータを指定します。
  • ユーザーは、コンテナーが独立した安全なネットワーク環境を持つことができるように、ネットワークとそのセキュリティポリシーを構成します。
  • ユーザーは、実行するコマンドを指定することにより、コンテナーに指定された作業を実行させます。

・

おすすめ

転載: blog.csdn.net/Jmilk/article/details/108894978