【Docker Network 第１章】Dockerネットワーキングについて解説

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/d13f5fc2-36c3-46b6-63cd-f4307ff35bab.png)


#はじめに

Dockerのエコシステムを理解するには、コンテナネットワーキングについての十分な知識が必要です。
これから３章にわたる記事を投稿しますが、この第１章では最も重要なコンテナネットワーキングの概念について説明します。ここで紹介するさまざまな概念を理解するには、Dockerの専門家である必要はありませんが、ネットワーク、Docker、およびKubernetesの基本的な知識が必要になるものかと思います。

[【Docker Network 第2章】](https://qiita.com/MetricFire/items/4a542256325957bad302)
[【Docker Network 第3章】](https://qiita.com/MetricFire/items/b731c84975bd9894748d)

**Docker**は、コンテナー内で実行される分離された環境を作成、構築、実行するために設計されたツールです。アプリケーションをコンテナ化して軽量コンテナ内で実行できるようにするために広く使用されています。 Dockerをマスターするには、イメージの作成方法、実行方法、コンテナの保護方法、Dockerファイルシステムの操作方法、Dockerネットワークの管理方法に精通している必要があります。

そして、その中のDockerネットワーキングは、学習の過程で最も混乱する部分かもしれません。ここ数年の間に、このテクノロジーを中心にダイナミックなエコシステム全体が開発されました。 Docker Compose、Docker Swarm、Kubernetesなどのテクノロジーは、コンテナー化エコシステムの多くの問題を解決しましたが、特にネットワーキングに新しい課題をもたらしました。 Dockerエコシステムをよく理解するためには、ネットワーキングについての十分な知識が必要となってくるということです。


#コンテナ：1つのことを実行し、うまく実行する

コンテナー（Wordpressなど）を実行すると、イメージを構築してWebサーバー（NginxまたはApache）+ PHPまたは（PHP FPM）+ Mysql / MariaDBデータベースを使用できます。
このソリューションは、多くのネットワークの問題を解消します。また、supervisordなどのプロセスマネージャーを使用して、プロセスが実行されていることを確認できます。

ただし、イメージにレイヤーを追加することになるので、これは良い方法ではありません。supervisordを使用するには、それをインストールし、その構成をコンテナーに同梱する必要があります。重要なプロセスとは、重要なプロセスとソフトウェアパッケージのみを含む軽量コンテナを構築して実行することです。

さらに、単一のコンテナで複数のプロセスを実行することは良くないパターンです。コンテナー内で独自のプロセスを実行することをお勧めします。

Wordpressの場合、Webサーバー（ApacheまたはNginx）用のコンテナー、PHP用のコンテナー、およびデータベース用の別のコンテナーが必要です。これらのコンテナーは相互に通信する必要があります。Webサーバーは要求を受信し、要求をPHPコンテナーに送信します。後者がデータを必要とする場合は、データベースコンテナーに要求します。逆の経路も方程式に取り入れなければなりません。これらのコンテナーを異なるホストで実行する場合、それらが同じホストにない場合でも、それらは互いにトラフィックを送受信できるはずです。複数のホスト間のトラフィックについては、最低限のセキュリティ標準を検討する必要があります。また、ウェブサーバーまたはアプリケーションコンテナーをスケーリングし、ロードバランサーを使用してそれらにトラフィックをルーティングする必要があるいくつかのケースに直面することもあります。

この使用例が基本的なように見えても、スタック全体を実行する上でネットワークがどのように重要な役割を果たすかがわかります。

#オーケストレーション：複雑な層？
スタンドアロンコンテナを実行することは可能ですが、高可用性環境、特に本番環境では、これらのコンテナを管理するためにオーケストレーションプラットフォームが必要になります。

Kubernetesのようなオーケストレーションシステムを使用すると、コンテナだけでは満足のいく解決策を提供できない多くの問題が間違いなく解決されます。

それらのいくつかを識別しましょう：

1. サービスを構成するコンテナーの数のスケールアップ/ダウン
2. 同じサービスの異なるコンテナー間での負荷分散
3. あるノード（VM）から別のノードへのコンテナーの転送
4. 他のサービスおよびインターネットへのサービスの公開
5. コンテナーとサービス間のサービス検出
6. コンテナの配備

これらのユースケースと機能のほとんどを見ると、ネットワークが共通のポイントであることがわかります。

オーケストレーションは必須ですが、ネットワークの追加レイヤーも同時に追加されていきます。同じノード内のコンテナー間ネットワークの他に、マスターからクラスターへのネットワーク、クラスターからマスターへのネットワーク、インターネットからサービスへのネットワーク、サービスからポッドへのネットワーク、ポッドからポッドへのネットワーク、コンテナーからコンテナーへのネットワークなど、Kubernetesには複数のタイプのネットワークがあります。さらに詳しく説明したい場合は、ノード、kubelet、Kube-proxy、およびDNSネットワーキングも検討できます。

Kubernetesは最新のデータセンターオペレーティングシステムと見なされています。この大きさのプラットフォームでこのネットワークの複雑さを目にすると驚く人も多いでしょうが、Kubernetesで最も複雑でおそらく最も重要な部分の1つはネットワークです。ネットワーキングシステムを採用しない限り、Kubernetesを習得することはできません。

#コンテナネットワークは複雑ですが難易度は高くありません
Zen of Pythonには次のような格言があります。

**「Simple is better than complex. Complex is better than complicated.」**

ITでは、Complexとは、システムのコンポーネントの数と、コンポーネント間の相互作用のレベルを指します。 一方,Complicatedとは、難易度が高いことを意味します。

特にオーケストレーションされたシステムでのコンテナーのネットワーキングはComplex（複雑）ですが、Complicated（難解）ではありません。 さらに、このComplexは、一般的な問題に対する抽象的なシステムと一般的なソリューションを作成するために必要な場合があります。 これは、Kubernetes開発者の1人であるJoe Bedaが宣言したものです

**「KubernetesはComplexシステムです。これは多くのことを行い、エンジニアとして新しい抽象化をもたらします。私たちは自分で構築するComplexに対して、私たちが学ぶ必要があるComplicatedを無視する傾向があります。」**

Bedaはさらに、Jenkins、Bash、Puppet / Chef / Salt / Ansible、AWS、Terraformなどを使用して複雑なデプロイメントシステムを作成すると、独自のComplexのブランドに慣れてしまうと言いました。それは有機的に成長したのでそれは複雑に感じませんが、このような有機的に成長したシステムで新しい人々を助けることは困難です。彼らはいくつかのツールを知っているかもしれませんが、それらを組み立てる方法は独特です。

ここは、Kubernetesが付加価値を提供する場所です。一般的な一連の問題を解決する一連の抽象化を提供します。人々がこれらの問題について理解とスキルを構築するにつれて、より多くの状況でより生産的になります。

コンテナーのネットワーキングは一見Complicatedですが、ネットワーキングに関する基本的な知識と新しいスキルの学習に投資する時間がある場合は、近づきやすいでしょう。

この次の章の記事では、技術的な詳細について詳しく説明します。スタンドアロンモードで実行した場合のDockerコンテナネットワークの仕組み、マルチコンテナネットワークの仕組み、スタンドアロンコンテナネットワークの違い、マルチコンテナネットワークについて理解します。また、複数のホストと魅力的なKubernetesネットワーキングの世界でネットワーキングを管理する方法についても説明します。

#シリーズ

[【Docker Network 第2章】](https://qiita.com/MetricFire/items/4a542256325957bad302)
[【Docker Network 第3章】](https://qiita.com/MetricFire/items/b731c84975bd9894748d)