はじめに
この実験では、Docker ネットワーキングの基本を踏まえて、高度な Docker ネットワーキングの概念を探求します。Bridge、Host、None の 3 つの主なネットワークモードについて、さらに深く掘り下げます。また、カスタムネットワークを作成し、異なるネットワーク間でコンテナを接続し、各ネットワークモードがコンテナ通信と隔離に与える影響を理解する方法についても学びます。この実践的な経験は、Docker ネットワーキングの実践において堅牢な基礎を提供します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Docker ネットワーキングの基本を踏まえて、高度な Docker ネットワーキングの概念を探求します。Bridge、Host、None の 3 つの主なネットワークモードについて、さらに深く掘り下げます。また、カスタムネットワークを作成し、異なるネットワーク間でコンテナを接続し、各ネットワークモードがコンテナ通信と隔離に与える影響を理解する方法についても学びます。この実践的な経験は、Docker ネットワーキングの実践において堅牢な基礎を提供します。
Docker はデフォルトのブリッジネットワークを提供しますが、カスタムブリッジネットワークを作成することで、コンテナ間通信に対する隔離と制御が向上します。
docker network ls
以下のような出力が表示されるはずです。
NETWORK ID NAME DRIVER SCOPE
296d1b460b17 bridge bridge local
91199fc6ad2e host host local
1078d2c781b6 none null local
docker network create my-custom-bridge
docker network ls
出力に my-custom-bridge
が表示されるはずです。
NETWORK ID NAME DRIVER SCOPE
296d1b460b17 bridge bridge local
91199fc6ad2e host host local
7215f99d0080 my-custom-bridge bridge local
1078d2c781b6 none null local
docker run --network=my-custom-bridge --name container1 -d nginx
docker run --network=my-custom-bridge --name container2 -d nginx
ここで、両方のコンテナに ping ユーティリティをインストールします。デフォルトの Nginx イメージに ping が含まれていないため、これを行う必要があります。
docker exec container1 apt-get update && docker exec container1 apt-get install -y iputils-ping
docker exec container2 apt-get update && docker exec container2 apt-get install -y iputils-ping
docker exec container1 ping -c 4 container2
同じカスタムブリッジネットワーク上のコンテナは、コンテナ名を使用して通信できることが示される、成功した ping 応答が表示されるはずです。これは、Docker の組み込み DNS が同じネットワーク内のコンテナ名をその IP アドレスに解決するためです。
ping が成功しない場合は、両方のコンテナが実行中であること (docker ps
) と ping ユーティリティが正しくインストールされていることを確認してください。
Docker は、コンテナを複数のネットワークに接続し、異なるネットワーク上のコンテナ間の通信を可能にします。特定のコンテナを隔離しながらも、それらの間で特定の通信を許可したい場合には、これは特に役立ちます。
docker network create my-second-bridge
docker network ls
両方のカスタムネットワークが表示されるはずです。
NETWORK ID NAME DRIVER SCOPE
296d1b460b17 bridge bridge local
91199fc6ad2e host host local
7215f99d0080 my-custom-bridge bridge local
8a15f99d0081 my-second-bridge bridge local
1078d2c781b6 none null local
container2
を新しいネットワークに接続します。docker network connect my-second-bridge container2
このコマンドは、container2
を my-custom-bridge
に接続したまま、my-second-bridge
ネットワークに追加します。
docker run --network=my-second-bridge --name container3 -d nginx
docker exec container3 apt-get update && docker exec container3 apt-get install -y iputils-ping
docker exec container1 ping -c 2 container2
docker exec container1 ping -c 2 container3
docker exec container2 ping -c 2 container3
結果に注意してください。
container1
は container2
と通信できます(同じネットワーク上にあります)container1
は container3
と通信できません(異なるネットワーク上にあります)container2
は container1
と container3
の両方と通信できます(両方のネットワークに接続されています)container1
が container3
を ping できた場合、ネットワークの隔離に問題があります。
ホストネットワークモードは、コンテナと Docker ホスト間のネットワーク隔離を解除し、コンテナがホストのネットワークを直接使用できるようにします。これはパフォーマンスを最大化するために役立つ場合がありますが、隔離を減らすため、セキュリティ上の影響も伴います。
docker run --network host --name host-container -d nginx
docker network ls
このコンテナに対する新しいネットワークは表示されません。なぜなら、それが直接ホストのネットワークを使用しているからです。
docker inspect --format '{{.HostConfig.NetworkMode}}' host-container
このコマンドは host
と出力されるはずです。
curl localhost:80
Nginx のウェルカムページが表示されるはずです。これは、コンテナがホストのネットワークを使用しており、Nginx がホストのネットワークインターフェイスのポート 80 で待ち受けているためです。
注:ホストマシンのポート 80 で既にサービスが実行されている場合、このステップは失敗する可能性があります。その場合は、まず既存のサービスを停止する必要があります。
「none」ネットワークモードは、ネットワークインターフェイスを持たないコンテナを作成し、それらをネットワークから完全に隔離します。これは最大限のセキュリティ隔離に役立ちますが、それはコンテナがネットワークを介して通信できないことを意味します。
docker run --network none --name isolated-container -d alpine sleep infinity
docker network ls
このコンテナに対する新しいネットワークは表示されません。なぜなら、それがどのネットワークにも接続されていないからです。
docker exec isolated-container ip addr
ループバックインターフェイス(lo)のみが表示されるはずです。eth0 やその他のネットワークインターフェイスはありません。
docker exec isolated-container ping -c 2 google.com
コンテナにネットワークアクセスがないため、「Network is unreachable」エラーが表示されて失敗するはずです。
Docker ネットワークは、ネットワークエイリアスを使用したサービスの検出をサポートしており、堅牢で拡張可能なアプリケーションを作成する際に役立ちます。この機能により、複数のコンテナが同じ DNS 名に応答することができ、基本的な負荷分散が可能になります。
docker network create service-network
docker network ls
一覧に service-network
が表示されるはずです。
docker run -d --network service-network --network-alias myservice --name service1 nginx
docker run -d --network service-network --network-alias myservice --name service2 nginx
nslookup
を使用してサービスを解決します。docker run --rm --network service-network appropriate/curl nslookup myservice
両方のコンテナの IP アドレスが返されるはずで、Docker の組み込み DNS サーバが 2 つのコンテナ間で負荷分散していることが示されます。
for i in {1..4}; do docker run --rm --network service-network appropriate/curl ping -c 1 myservice; done
両方のコンテナからの応答が表示され、基本的な負荷分散が行われていることが示されます。Docker DNS サーバは、myservice
を解決する際に 2 つの IP アドレスの間で切り替えます。
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.106 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.106/0.106/0.106 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.119 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.119/0.119 ms
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.097 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.097/0.097 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.140 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.140/0.140/0.140 ms
この高度な Docker ネットワーク実験では、いくつかの重要な概念を検討しました。
Docker におけるこれらの高度なネットワーク機能は、コンテナ間の通信と隔離を精密に制御した複雑なマルチコンテナアプリケーションを設計するための強力なツールを提供します。これらの概念を理解することは、効率的でセキュア、拡張可能なコンテナ化されたアプリケーションを設計するために不可欠です。
Docker ネットワークは非常に柔軟性がありますが、コンテナネットワークアーキテクチャを設計する際には、セキュリティ上の影響を考慮することが重要です。常に最小限の特権の原則に従い、必要なポートとサービスのみを公開してください。
Docker を使い続けるうちに、これらのネットワーク概念は、複雑なアプリケーションとマイクロサービスアーキテクチャをオーケストレーションする際に非常に貴重であることがわかります。これらの概念を定期的に練習して、Docker ネットワークを効果的に管理する熟練者になりましょう。