dockerコンテナのネットワーク

Dockerコンテナのネットワーク機構

こんにちは、はむたまです。
この前のブログではNWの基礎について物理サーバレベルで用語解説をしながら学びました。
しかし昨今の現場では物理NWの設定変更よりコンテナ基盤にのったアプリケーションの開発が頻発します。
k8sやdockerのコンテナ基盤環境におけるNWやアプリケーションの管理の知識が求められます。
NWの原理原則知識と交えながらクラウド上のホストにdockerコンテナを立てた場合のNW設定について用語とコマンドを交えながらまとめます。

Dockerのネットワーク機構は、コンテナ同士の通信やコンテナと外部ネットワークの通信を管理するために重要な役割を果たします。

1. Dockerネットワークの基本概念

dockerの公式ページを参照しますと、docker engineをインストールするとデフォルトでbridgeとoverlayの二つのドライバーが用意されています。またインスタンスそのものが保持するhostのethernetもネットワーク一覧に含まれます。

docker上のコンテナはホストのネットワークに接続してインターネットにアクセスします。もしNWから孤立させたい場合はコンテナネットワークとの接続を遮断すればいいのです。

コンテナが外部と外部のインターネット環境と通信するには、ホストの物理NICでNATする必要があります。
一般にコンテナ内のIPアドレス帯は172.17.0.0/16が割り当てられることが多いです。
インターネットとのアクセスをインスタンスのdefault gatewayに設定し、IP rangeは0.0.0.0/0です。
コンテナのIP(172.17.0.0/16)からインターネットに出るパケットはネットワーク層である第4層で変換(SNAT)されます。
NATされたパケットはホストの第2層にあるhostのehternet(eth0)に到達し、外部に送信されます。
これにより外部にはコンテナIPではなくホストIPとして発信されたように見えます。
内部への通信は物理NICで受けるためDNATされません。

1.1 ブリッジネットワーク (Bridge Network)

ブリッジネットワークは、Dockerが作成するdefaultのネットワークです。各コンテナは同じブリッジネットワークを共有し、同一ホスト内のコンテナの通信を可能にします。
ブリッジネットワークは第二層で動作しますが、L2スイッチとは厳密には異なります。L2スイッチは物理的なネットワークセグメントを構築するのに対して、ブリッジネットワークでは、仮想ネットワークインターフェース同士(vethペア)をつなぐことで通信を許可します。デフォルトではdocker0というブリッジネットワークが作成されコンテナはこのネットワークを通じて通信します。

1.2 ホストネットワーク (Host Network)

ホストネットワークは、コンテナがホストのネットワークを直接利用するモードです。コンテナはホストと同じIPアドレス空間を共有します。

1.3 オーバーレイネットワーク (Overlay Network)

オーバーレイネットワークは、複数のホスト間でコンテナを接続するためのネットワークです。Docker SwarmやKubernetesのようなクラスタリングソリューションで使用され、異なるホスト上のコンテナ間通信を実現します。dockerではlibkvのライブラリにより可能となっており、対象のツールはConsul, Etcd, Zookeeperです。

1.4 マックベランネットワーク (Macvlan Network)

マックベランネットワークは、コンテナがホストの物理ネットワークインターフェースと同じネットワークに直接参加するためのネットワークモードです。各コンテナは独自のMACアドレスを持ち、物理ネットワーク上で別個のデバイスとして認識されます。レガシーアプリケーションやネットワークトラフィックを監視するアプリケーションは物理ネットワークに直接接続することが多いです。

2. Dockerネットワークドライバ

ここまでdockerのネットワーク構成パターンを例として挙げてきました。これらの構成に必要なDockerネットワークは、ネットワークドライバを使用して構成できます。以下は主要なネットワークドライバの一覧です。

2.1 bridgeドライバ

ブリッジネットワークを作成し、同一ホスト上のコンテナ間の通信を可能にします。デフォルトのネットワークドライバです。

2.2 hostドライバ

コンテナをホストのネットワークスタックに直接接続します。コンテナがホストのIPアドレスを共有するため、パフォーマンスが向上しますが、セキュリティのリスク分散ができません。例えばインスタンスに不正アクセスがあった場合に同じネットワークを共有しているため、攻撃者は自由にサーバとコンテナにアクセスできます。構築コストや設計が簡単な分、セキュリティリスクが大きいのが課題です。

2.3 overlayドライバ

複数のdocker daemonホスト間で分散ネットワークを作成します。Docker SwarmやKubernetesのようなオーケストレーションツールと連携して使用されます。

2.4 macvlanドライバ

コンテナに独自のMACアドレスを割り当て、物理ネットワークに直接接続します。物理ネットワーク上でコンテナを独立したデバイスとして扱います。
他のdriver同様にdocker network createコマンドでオプションに--driver macvlanを添えることで作成できます。
ただ設定する際にどのインターフェースの通過するかのparentの設定が必要です。

2.5 noneドライバ

ネットワークを一切割り当てないモードです。ネットワークインターフェースが必要ない場合に使用されます。インスタンス内部で完結したい処理であればこの設計が適当です。

3. Dockerネットワークの設定と管理

3.1 ネットワークの作成

Dockerではdocker network createコマンドを使用して新しいネットワークを作成できます。例えば、カスタムブリッジネットワークを作成するには以下のコマンドを使用します。

bash
# docker network create --driver bridge my_bridge_network

3.2 コンテナのネットワーク接続

コンテナを起動する際に--networkオプションを使用して特定のネットワークに接続できます。

docker run -d --name my_container --network my_bridge_network nginx

3.2 コンテナのネットワーク接続

コンテナを起動する際に--networkオプションを使用して特定のネットワークに接続できます。

docker run -d --name my_container --network my_bridge_network nginx

3.3 ネットワークの一覧表示

現在作成されているネットワークを一覧表示するには、docker network lsコマンドを使用します。

docker network ls

3.4 ネットワークの詳細情報

特定のネットワークの詳細情報を確認するには、docker network inspectコマンドを使用します。

docker network inspect my_bridge_network

4. まとめ

Dockerのネットワーク機構は、コンテナ同士の通信やコンテナと外部ネットワークの通信を効率的に管理するために重要です。ブリッジネットワークやオーバーレイネットワークなど、さまざまなネットワークモードとドライバを理解することで、より柔軟で効率的なコンテナネットワーキングを実現できます。

Dockerネットワーク機構を理解することは、Kubernetesのネットワーク機構を学ぶ上でも重要なステップとなります。引き続き、Kubernetesのネットワークについても学習を進めていきましょう。

参考:
https://docs.docker.jp/engine/userguide/networking/dockernetworks.html

コメント

タイトルとURLをコピーしました