Table of Contents
はじめに:Docker のエコシステムを理解するにはコンテナネットワークの知識が必要
このシリーズでは、最も重要なコンテナネットワークのコンセプトについてお話します。ここで紹介する様々なコンセプトを理解するのに、ネットワーキンク、Docker、Kubernetes の基本的な理解は必要ですが、Docker の専門家である必要はありません。
Docker は、コンテナ内で動作する分離された環境を作成、構築、実行するのにデザインされたツールであり、アプリケーションをコンテナ化して軽量コンテナ内で実行できるようにするために広く使われています。Docker を使いこなすには、画像の作成方法や実行方法、コンテナの保護方法、Docker ファイルシステムの操作方法を十分に理解し、Docker ネットワークの管理方法を熟知していないといけません。
Docker ネットワークは、習得の過程で最も混乱するところかもしれません。過去数年間で、このテクノロジーを中心に、ダイナミックなエコシステム全体が開発されており、Docker Compose、Docker Swarm、Kubernetes などのテクノロジーは、コンテナ化エコシステムの多くの問題を解決しましたが、特にネットワークにおいて新たな課題をもたらしました。なので、Docker のエコシステムをしっかりと理解するには、ネットワークに関する十分な知識が必要となります。
コンテナ:一つのことをうまくやる
たとえば WordPress などのコンテナを実行する場合、画像を構築して、Web サーバー(Nginx または Apache)+ PHP または(PHP FPM)+ Mysql/MariaDB のデータベースを送ることができます。
このソリューションは、多くのネットワークの問題を解消するようです。この場合、プロセスが確実に実行されていることを確認する supervisord などのプロセス マネージャーを使うといいでしょう。
ただ、画像にさらにレイヤーを追加することになるため、これはいいやり方ではなく、supervisord を使うには、それをインストールして、その設定をコンテナと送る必要があります。なので重要なプロセスとソフトウェアパッケージのみなどの軽量コンテナを構築して実行することをお勧めします。
さらに、1つのコンテナで複数のプロセスを実行するのはダメなパターンです。なので、コンテナ内で固有のプロセスを実行することをお勧めします。
WordPress の場合、Web サーバー(Apache または Nginx)用のコンテナ、PHP 用のコンテナ、およびデータベース用の別のコンテナがあるべきです。そしてそのコンテナは「Web サーバーはリクエストを受信し、リクエストを PHP コンテナーに送信し、PHP コンテナでデータが必要な場合はデータベース コンテナからデータを要求する」というような、相互に通信する必要があります。逆パスも考慮しないといけません。これらのコンテナをさまざまなホストで実行する場合、同じホストになくても、相互にトラフィックを送受信できるはずであり、複数のホスト間のトラフィックについては、最低限のセキュリティ標準を考慮すべきです。また、Web サーバーまたはアプリケーション コンテナを拡張し、ロード バランサーを使ってトラフィックをルーティングする必要がある場合もあります。
このユースケースは基本的なものに見えますが、スタック全体を動かす上でネットワークがいかに重要な役割を果たしているかがわかります。
オーケストレーション: 複雑なレイヤー?
スタンドアロンコンテナを実行する場合もありますが、可用性の高い環境、特に本番環境では、そのようなコンテナを管理するオーケストレーションプラットフォームが必要になるでしょう。
Kubernetes のようなオーケストレーション システムを使うと、コンテナだけでは満足のいく解決策が得られない多くの問題が間違いなく解決されます。
その一部を見てみましょう:
- サービスを構成するコンテナ数の増減
- 同じサービスのさまざまなコンテナ間でのロードバランシング(負荷分散)
- あるノード(VM)から別のノード(VM)へのコンテナの転送
- 他のサービスやインターネットへのサービスの公開
- コンテナとサービス間のサービス検出
- コンテナのデプロイ
このようなユースケースや機能のほとんどを見てみると、ネットワークが共通点であることがわかるでしょう。
オーケストレーションは必須ですが、ネットワークの層が増えることになります。同じノード内のコンテナ間ネットワーク以外にも、Kubernetes には、マスターからクラスタへのネットワーク、クラスタからマスターへのネットワーク、インターネットからサービスへのネットワーク、サービスからポッドへのネットワーク、ポッドからポッドへのネットワーク、コンテナからコンテナへのネットワークなど、複数のタイプのネットワークがあり、さらに詳しく検討したい場合は、ノード、kubelet、Kube-proxy、DNS ネットワークも検討できます。
Kubernetes は最新のデータセンターオペレーティング システムと考えられており、この規模のプラットフォームではこのようなネットワークの複雑さが見られることが予想されます。同時に、Kubernetes の最も複雑で、おそらく最も重要な部分の1つはネットワークであり、Kubernetes のネットワーク システムを理解しないと、Kubernetes の習得はできません。
コンテナネットワークは複雑だがややこしくはない
Python の格言集にこんな格言があります:
「複雑よりシンプルな方がいい。ややこしいより複雑な方がいい。」
IT において、「複雑」は、システムのコンポーネントの数とそれらの間の相互作用のレベルを指し、「ややこしい」のは、難易度が高いということになります。
コンテナネットワーク、特にオーケストレーションシステムは、複雑ではありますがややこしくはありません。しかもこの複雑さは、抽象的なシステムや一般的な問題に対する汎用的なソリューションを作成するのに必要になることがあります。ちなみに Kubernetes 開発者の1人であるジョー・ベダ氏は次のように述べています。
「Kubernetes は複雑なシステムであり、多くのことを実現し、新たな抽象化をもたらします[...]エンジニアとして、我々は自ら作り上げた「複雑さ」と、習得が必要な「複雑さ」を軽視しがちです。」
ベダ氏はさらに、Jenkins、Bash、Puppet/Chef/Salt/Ansible、AWS、Terraform などを使って複雑なデプロイシステムを作成すると、慣れ親しんだ独特の複雑さが生まれると述べました。オーガニックに成長したため複雑な感じはしませんが、このように有機的に成長したシステムに新しい人を加えるのは大変です。彼らは知ってるツールがあるかもしれませんが、それを組み合わせる方法は独特ですからね。
ここで Kubernetes の付加価値が出てきます。Kubernetes には、共通の問題を解決する一連の抽象化が備わっており、人がこのような問題に対する理解とスキルを身につけることで、より多くの状況で生産性が上がります。
コンテナ ネットワークは一見ややこしく思われがちですが、ネットワークに関する基本的な知識があり、新しいスキルを習得する時間があれば、とっつきやすいでしょう。
このシリーズの次のパートでは、技術的な詳細について深く掘り下げていきます。Docker のコンテナネットワークをスタンドアロンモードで実行したときにどのように動作するのか、マルチコンテナネットワークがどのように動作するのか、スタンドアロンのコンテナネットワークとマルチコンテナネットワークの違いについて見ていきます。また、複数のホストにまたがってネットワークがどのように管理されるのか、そして Kubernetes のネットワークの魅力的な世界も見ていきましょう。