Dockerエコシステム:共通コンポーネントの紹介

前書き

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

Dockerとコンテナ化

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

image:https://assets.digitalocean.com/articles/docker_ecosystem/Container-Overview.png [Dockerコンテナ化]

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

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

  • 軽量リソースの使用:オペレーティングシステム全体を仮想化する代わりに、コンテナはプロセスレベルで分離し、ホストのカーネルを使用します。

  • 移植性:コンテナー化されたアプリケーションの依存関係はすべてコンテナー内にバンドルされており、任意のDockerホストで実行できます。

  • 予測可能性:ホストはコンテナ内で実行されているものを気にしません。また、コンテナはどのホストで実行されているかを気にしません。 インターフェイスは標準化されており、相互作用は予測可能です。

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

Dockerを使用したアプリケーションのコンテナー化の詳細については、https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-overview-of-containerization [こちら]をクリックしてください。

サービス検出とグローバル構成ストア

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

image:https://assets.digitalocean.com/articles/docker_ecosystem/Discover-Flow.png [Dockerサービスの発見]

上の画像では、1つのアプリケーションが接続情報をディスカバリサービスシステムに登録するフローの例を見ることができます。 登録すると、他のアプリケーションはディスカバリーサービスに照会して、アプリケーションへの接続方法を見つけることができます。

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

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

  • アプリケーションが、依存するサービスへの接続に必要なデータを取得できるようにします。

  • 上記の目的でサービスが接続情報を登録できるようにします。

  • グローバルにアクセス可能な場所を提供して、任意の構成データを保存します。

  • クラスター管理ソフトウェアの必要に応じて、クラスターメンバーに関する情報を保存します。

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

  • * https://www.digitalocean.com/community/tutorials/how-to-use-etcdctl-and-etcd-coreos-s-distributed-key-value-store [etcd] *:サービス検出/グローバルに分散されたキー-バリューストア

  • * https://www.digitalocean.com/community/tutorials/an-introduction-to-using-consul-a-service-discovery-system-on-ubuntu-14-04 [consul] *:サービスの発見/グローバルに配信キーバリューストア

  • * https://www.digitalocean.com/community/tutorials/an-introduction-to-mesosphere#a-basic-overview-of-apache-mesos [zookeeper] *:サービス発見/グローバルに分散されたキーバリューストア

  • * http://xordataexchange.github.io/crypt/ [crypt] *:etcdエントリを暗号化するプロジェクト

  • * https://www.digitalocean.com/community/tutorials/how-to-use-confd-and-etcd-to-dynamically-reconfigure-services-in-coreos [confd] *:キー値ストアの変更を監視新しい値を使用してサービスの再構成をトリガーします

Dockerによるサービス検出の詳細については、ガイドhttps://www.digitalocean.com/community/tutorials/the-docker-ecosystem-service-discovery-and-distributed-configuration-stores [こちら]をご覧ください。

ネットワーキングツール

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

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

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

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

  • ネットワークをオーバーレイして、複数のホスト間でアドレス空間を簡素化および統合します。

  • さまざまなコンポーネント間で安全な通信を提供するように構成された仮想プライベートネットワーク。

  • ホストごとまたはアプリケーションごとのサブネット化の割り当て

  • 通信用のmacvlanインターフェイスの確立

  • カスタムMACアドレス、ゲートウェイなどの構成 コンテナ用

Dockerネットワーキングの改善に関係するプロジェクトは次のとおりです。

  • * flannel *:各ホストに個別のサブネットを提供するオーバーレイネットワーク。

  • * weave *:単一ネットワーク上のすべてのコンテナを表すネットワークをオーバーレイします。

  • * pipework *:任意の高度なネットワーク構成のための高度なネットワーキングツールキット。

Dockerを使用したネットワークへのさまざまなアプローチの詳細については、https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-networking-and-communication [こちら]をクリックしてください。

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

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

image:https://assets.digitalocean.com/articles/docker_ecosystem/Example-Schedule-App-F.png [スケジュールアプリケーション]

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

このホスト選択プロセスは、スケジューラの中心的な責務の1つです。 通常、このプロセスを自動化する機能があり、管理者は特定の制約を指定するオプションを持っています。 これらの制約の一部は次のとおりです。

  • 別のコンテナと同じホスト上のコンテナをスケジュールします。

  • コンテナが別のコンテナと同じホストに配置されていないことを確認してください。

  • 一致するラベルまたはメタデータを持つホストにコンテナを配置します。

  • コンテナを最も混雑していないホストに配置します。

  • クラスター内のすべてのホストでコンテナーを実行します。

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

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

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

  • * https://www.digitalocean.com/community/tutorials/how-to-use-fleet-and-fleetctl-to-manage-your-coreos-cluster [fleet] *:スケジューラーおよびクラスター管理ツール。

  • * https://www.digitalocean.com/community/tutorials/an-introduction-to-mesosphere#a-basic-overview-of-marathon [marathon] *:スケジューラおよびサービス管理ツール。

  • * https://github.com/docker/swarm/ [Swarm] *:スケジューラおよびサービス管理ツール。

  • * https://www.digitalocean.com/community/tutorials/an-introduction-to-mesosphere#a-basic-overview-of-apache-mesos [mesos] *:スケジューラーのホストリソースを統合するホスト抽象化サービス。

  • * https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes [kubernetes] *:コンテナグループを管理できる高度なスケジューラ。

  • * https://github.com/docker/docker/issues/9694 [compose] *:コンテナグループを作成するためのコンテナオーケストレーションツール。

Dockerの基本的なスケジューリング、コンテナのグループ化、クラスター管理ソフトウェアの詳細については、https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-scheduling-and-orchestration [こちら]をクリックしてください。

結論

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