序章

コンテナ化は、移植可能で予測可能な方法でアプリケーションを配布および展開するプロセスです。 これは、コンポーネントとその依存関係を、コンテナーと呼ばれる標準化された分離された軽量のプロセス環境にパッケージ化することで実現されます。  現在、多くの組織は、分散システムに簡単に展開できるアプリケーションとサービスの設計に関心を持っており、システムを簡単に拡張して、マシンとアプリケーションの障害に耐えることができます。  さまざまな環境でのデプロイメントを簡素化および標準化するために開発されたコンテナー化プラットフォームであるDockerは、このスタイルのサービス設計および管理の採用を促進するのに大いに役立ちました。  この分散コンテナ管理のエコシステムに基づいて構築するために、大量のソフトウェアが作成されています。

Dockerとコンテナ化

Dockerは、現在使用されている最も一般的なコンテナ化ソフトウェアです。 他のコンテナ化システムも存在しますが、Dockerはコンテナの作成と管理を簡単にし、多くのオープンソースプロジェクトと統合します。

Docker containerization

この画像では、コンテナがホストシステムにどのように関連しているかを(簡略化されたビューで)確認できます。 コンテナは個々のアプリケーションを分離し、Dockerによって抽象化されたオペレーティングシステムリソースを使用します。 右側の分解図では、複数のコンテナーが基礎となるレイヤーを共有し、リソースの使用量を減らして、コンテナーを「レイヤー化」することで構築できることがわかります。

Dockerの主な利点は次のとおりです。

  • 軽量リソース使用率:オペレーティングシステム全体を仮想化する代わりに、コンテナーはプロセスレベルで分離し、ホストのカーネルを使用します。
  • 移植性:コンテナー化されたアプリケーションのすべての依存関係がコンテナー内にバンドルされているため、任意のDockerホストで実行できます。
  • 予測可能性:ホストはコンテナー内で何が実行されているかを気にせず、コンテナーはどのホストで実行されているかを気にしません。  インターフェイスは標準化されており、相互作用は予測可能です。

通常、Dockerを使用するようにアプリケーションまたはサービスを設計する場合、機能を個々のコンテナーに分割するのが最適です。これは、サービス指向アーキテクチャーと呼ばれる設計上の決定です。 これにより、将来、コンポーネントを個別に簡単にスケーリングまたは更新することができます。 この柔軟性があることは、人々が開発とデプロイのためにDockerに興味を持っている多くの理由の1つです。

Dockerを使用したアプリケーションのコンテナー化の詳細については、ここをクリックをクリックしてください。

サービスディスカバリとグローバル構成ストア

サービスディスカバリは、コンテナの展開をスケーラブルで柔軟にすることを目的とした全体的な戦略の1つのコンポーネントです。 サービスディスカバリは、コンテナが管理者の介入なしに導入された環境を検出できるようにするために使用されます。 対話する必要のあるコンポーネントの接続情報を見つけることができ、他のツールがそれらが利用可能であることを認識できるように自分自身を登録することができます。 これらのツールは通常、グローバルに分散された構成ストアとしても機能し、インフラストラクチャで動作するサービスに対して任意の構成設定を設定できます。

Docker service discovery

上の画像では、1つのアプリケーションがその接続情報を検出サービスシステムに登録するフローの例を見ることができます。 登録すると、他のアプリケーションが検出サービスにクエリを実行して、アプリケーションへの接続方法を見つけることができます。

これらのツールは、多くの場合、クラスター環境のホスト間で分散される単純なKey-Valueストアとして実装されます。 一般に、Key-Valueストアは、値にアクセスして設定するためのHTTPAPIを提供します。 一部には、暗号化されたエントリやアクセス制御メカニズムなどの追加のセキュリティ対策が含まれています。 分散ストアは、新しいコンテナーの自己構成の詳細を提供するという主要な機能に加えて、クラスター化されたDockerホストを管理するために不可欠です。

サービスディスカバリストアの責任の一部は次のとおりです。

  • アプリケーションが、依存するサービスに接続するために必要なデータを取得できるようにします。
  • 上記の目的でサービスが接続情報を登録できるようにします。
  • 任意の構成データを格納するためのグローバルにアクセス可能な場所を提供します。
  • クラスタ管理ソフトウェアの必要に応じて、クラスタメンバーに関する情報を保存します。

人気のあるサービス検出ツールと関連プロジェクトは次のとおりです。

  • etcd :サービスディスカバリ/グローバルに分散されたKey-Valueストア
  • consul :サービスディスカバリ/グローバルに分散されたKey-Valueストア
  • zookeeper :サービスディスカバリ/グローバルに分散されたKey-Valueストア
  • crypt :etcdエントリを暗号化するプロジェクト
  • confd :Key-Valueストアの変更を監視し、新しい値でサービスの再構成をトリガーします

Dockerを使用したサービス検出の詳細については、ガイドこちらをご覧ください。

ネットワークツール

コンテナ化されたアプリケーションは、機能を個別のコンポーネントに分割することを促進するサービス指向設計に役立ちます。 これにより、管理とスケーリングが容易になりますが、コンポーネント間のネットワークの機能と信頼性に関してさらに保証が必要になります。 Docker自体は、コンテナーからコンテナーおよびコンテナーからホストの通信に必要な基本的なネットワーク構造を提供します。

Dockerのネイティブネットワーク機能は、コンテナーをフックするための2つのメカニズムを提供します。 1つは、コンテナのポートを公開し、オプションで外部ルーティングのためにホストシステムにマップすることです。 マップするホストポートを選択するか、Dockerが高い未使用のポートをランダムに選択できるようにすることができます。 これは、ほとんどの目的で適切に機能するコンテナへのアクセスを提供する一般的な方法です。

もう1つの方法は、Dockerの「リンク」を使用してコンテナーが通信できるようにすることです。 リンクされたコンテナは、対応するコンテナに関する接続情報を取得し、それらの変数に注意を払うように構成されている場合は、自動的に接続できるようにします。 これにより、サービスが配置されるポートまたはアドレスを事前に知らなくても、同じホスト上のコンテナ間の連絡が可能になります。

この基本レベルのネットワークは、単一ホストまたは厳密に管理された環境に適しています。 ただし、Dockerエコシステムは、オペレーターと開発者が利用できるネットワーク機能の拡張に焦点を当てたさまざまなプロジェクトを生み出しています。 追加のツールを介して利用できるいくつかの追加のネットワーク機能は次のとおりです。

  • オーバーレイネットワークを使用して、複数のホスト間でアドレス空間を簡素化および統合します。
  • さまざまなコンポーネント間の安全な通信を提供するように適合された仮想プライベートネットワーク。
  • ホストごとまたはアプリケーションごとのサブネット化の割り当て
  • 通信用のmacvlanインターフェースの確立
  • カスタムMACアドレス、ゲートウェイなどの構成。 あなたのコンテナのために

Dockerネットワークの改善に関係するいくつかのプロジェクトは次のとおりです。

  • francel :各ホストに個別のサブネットを提供するオーバーレイネットワーク。
  • weave :単一のネットワーク上のすべてのコンテナーを表すオーバーレイネットワーク。
  • pipework :任意の高度なネットワーク構成のための高度なネットワークツールキット。

Dockerを使用したネットワークへのさまざまなアプローチの詳細については、ここをクリックをクリックしてください。

スケジューリング、クラスター管理、およびオーケストレーション

クラスター化されたコンテナー環境を構築するときに必要なもう1つのコンポーネントは、スケジューラーです。 スケジューラーは、使用可能なホストでコンテナーを開始する責任があります。

Schedule applications

上の画像は、簡略化されたスケジューリング決定を示しています。 リクエストは、APIまたは管理ツールを介して提供されます。 ここから、スケジューラーは要求の条件と使用可能なホストの状態を評価します。 この例では、分散データストア/検出サービス(上記で説明)からコンテナー密度に関する情報を取得して、新しいアプリケーションを最もビジーでないホストに配置できるようにします。

このホスト選択プロセスは、スケジューラーの主要な責任の1つです。 通常、管理者が特定の制約を指定するオプションを使用して、このプロセスを自動化する機能があります。 これらの制約のいくつかは次のとおりです。

  • 別の特定のコンテナと同じホストでコンテナをスケジュールします。
  • コンテナが別の特定のコンテナと同じホストに配置されていないことを確認してください。
  • ラベルまたはメタデータが一致するホストにコンテナーを配置します。
  • コンテナを最もビジーでないホストに配置します。
  • クラスター内のすべてのホストでコンテナーを実行します。

スケジューラーは、関連するホストにコンテナーをロードし、プロセスのライフサイクルを開始、停止、および管理する責任があります。

スケジューラーはグループ内の各ホストと対話する必要があるため、通常、クラスター管理機能も含まれています。 これらにより、スケジューラーはメンバーに関する情報を取得し、管理タスクを実行できます。 このコンテキストでのオーケストレーションとは、通常、コンテナーのスケジューリングとホストの管理の組み合わせを指します。

スケジューラーおよびフリート管理ツールとして機能するいくつかの人気のあるプロジェクトは次のとおりです。

  • フリート:スケジューラーおよびクラスター管理ツール。
  • マラソン:スケジューラーおよびサービス管理ツール。
  • Swarm :スケジューラーおよびサービス管理ツール。
  • mesos :スケジューラーのホストリソースを統合するホスト抽象化サービス。
  • kubernetes :コンテナグループを管理できる高度なスケジューラ。
  • compose :コンテナーグループを作成するためのコンテナーオーケストレーションツール。

Dockerの基本的なスケジューリング、コンテナーグループ化、およびクラスター管理ソフトウェアの詳細については、ここをクリックをクリックしてください。

結論

これで、Dockerエコシステムに関連するほとんどのソフトウェアの一般的な機能に精通しているはずです。 Docker自体は、サポートするすべてのプロジェクトとともに、大規模なスケーラビリティを可能にするソフトウェア管理、設計、およびデプロイメント戦略を提供します。 さまざまなプロジェクトの機能を理解して活用することで、さまざまな運用要件に対応できる柔軟性を備えた複雑なアプリケーションの展開を実行できます。