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
コメント