Docker ネットワークに深く突き入る

DockerDockerBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Docker ネットワーキングの基本を踏まえて、高度な Docker ネットワーキングの概念を探求します。Bridge、Host、None の 3 つの主なネットワークモードについて、さらに深く掘り下げます。また、カスタムネットワークを作成し、異なるネットワーク間でコンテナを接続し、各ネットワークモードがコンテナ通信と隔離に与える影響を理解する方法についても学びます。この実践的な経験は、Docker ネットワーキングの実践において堅牢な基礎を提供します。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 97%です。学習者から 99% の好評価を得ています。

カスタムブリッジネットワーク

Docker はデフォルトのブリッジネットワークを提供しますが、カスタムブリッジネットワークを作成することで、コンテナ間通信に対する隔離と制御が向上します。

  1. まず、Docker ネットワークの現在の一覧を見てみましょう。
docker network ls

以下のような出力が表示されるはずです。

NETWORK ID     NAME      DRIVER    SCOPE
296d1b460b17   bridge    bridge    local
91199fc6ad2e   host      host      local
1078d2c781b6   none      null      local
  1. 次に、カスタムブリッジネットワークを作成しましょう。
docker network create my-custom-bridge
  1. 作成を確認するために、再度すべての Docker ネットワークを一覧表示します。
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
  1. カスタムブリッジネットワーク上で 2 つのコンテナを起動し、ping をインストールします。
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
  1. コンテナ間の通信をテストします。
docker exec container1 ping -c 4 container2

同じカスタムブリッジネットワーク上のコンテナは、コンテナ名を使用して通信できることが示される、成功した ping 応答が表示されるはずです。これは、Docker の組み込み DNS が同じネットワーク内のコンテナ名をその IP アドレスに解決するためです。

ping が成功しない場合は、両方のコンテナが実行中であること (docker ps) と ping ユーティリティが正しくインストールされていることを確認してください。

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

Docker は、コンテナを複数のネットワークに接続し、異なるネットワーク上のコンテナ間の通信を可能にします。特定のコンテナを隔離しながらも、それらの間で特定の通信を許可したい場合には、これは特に役立ちます。

  1. まず、2 つ目のカスタムブリッジネットワークを作成しましょう。
docker network create my-second-bridge
  1. ネットワークの作成を確認します。
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
  1. container2 を新しいネットワークに接続します。
docker network connect my-second-bridge container2

このコマンドは、container2my-custom-bridge に接続したまま、my-second-bridge ネットワークに追加します。

  1. 2 つ目のネットワーク上に新しいコンテナを作成します。
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
  1. すべてのコンテナ間の通信をテストします。
docker exec container1 ping -c 2 container2
docker exec container1 ping -c 2 container3
docker exec container2 ping -c 2 container3

結果に注意してください。

  • container1container2 と通信できます(同じネットワーク上にあります)
  • container1container3 と通信できません(異なるネットワーク上にあります)
  • container2container1container3 の両方と通信できます(両方のネットワークに接続されています)

container1container3 を ping できた場合、ネットワークの隔離に問題があります。

ホストネットワークモード

ホストネットワークモードは、コンテナと Docker ホスト間のネットワーク隔離を解除し、コンテナがホストのネットワークを直接使用できるようにします。これはパフォーマンスを最大化するために役立つ場合がありますが、隔離を減らすため、セキュリティ上の影響も伴います。

  1. ホストネットワークモードを使用してコンテナを作成します。
docker run --network host --name host-container -d nginx
  1. 現在のネットワーク一覧を確認します。
docker network ls

このコンテナに対する新しいネットワークは表示されません。なぜなら、それが直接ホストのネットワークを使用しているからです。

  1. コンテナがホストのネットワークを使用していることを確認します。
docker inspect --format '{{.HostConfig.NetworkMode}}' host-container

このコマンドは host と出力されるはずです。

  1. ホストマシンから Nginx のデフォルトページにアクセスしてみます。
curl localhost:80

Nginx のウェルカムページが表示されるはずです。これは、コンテナがホストのネットワークを使用しており、Nginx がホストのネットワークインターフェイスのポート 80 で待ち受けているためです。

注:ホストマシンのポート 80 で既にサービスが実行されている場合、このステップは失敗する可能性があります。その場合は、まず既存のサービスを停止する必要があります。

ノーネットワークモード

「none」ネットワークモードは、ネットワークインターフェイスを持たないコンテナを作成し、それらをネットワークから完全に隔離します。これは最大限のセキュリティ隔離に役立ちますが、それはコンテナがネットワークを介して通信できないことを意味します。

  1. ネットワークのないコンテナを作成します。
docker run --network none --name isolated-container -d alpine sleep infinity
  1. 現在のネットワーク一覧を確認します。
docker network ls

このコンテナに対する新しいネットワークは表示されません。なぜなら、それがどのネットワークにも接続されていないからです。

  1. コンテナがネットワークインターフェイスを持たないことを確認します。
docker exec isolated-container ip addr

ループバックインターフェイス(lo)のみが表示されるはずです。eth0 やその他のネットワークインターフェイスはありません。

  1. 隔離されたコンテナから Google に ping を送信してみます。
docker exec isolated-container ping -c 2 google.com

コンテナにネットワークアクセスがないため、「Network is unreachable」エラーが表示されて失敗するはずです。

ネットワークエイリアスとサービスの検出

Docker ネットワークは、ネットワークエイリアスを使用したサービスの検出をサポートしており、堅牢で拡張可能なアプリケーションを作成する際に役立ちます。この機能により、複数のコンテナが同じ DNS 名に応答することができ、基本的な負荷分散が可能になります。

  1. この演習用に新しいブリッジネットワークを作成します。
docker network create service-network
  1. ネットワークの作成を確認します。
docker network ls

一覧に service-network が表示されるはずです。

  1. 同じネットワークエイリアスを持つ 2 つのコンテナを作成します。
docker run -d --network service-network --network-alias myservice --name service1 nginx
docker run -d --network service-network --network-alias myservice --name service2 nginx
  1. クライアントコンテナを作成し、nslookup を使用してサービスを解決します。
docker run --rm --network service-network appropriate/curl nslookup myservice

両方のコンテナの IP アドレスが返されるはずで、Docker の組み込み DNS サーバが 2 つのコンテナ間で負荷分散していることが示されます。

  1. サービスに複数回アクセスしてテストします。
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 ネットワーク実験では、いくつかの重要な概念を検討しました。

  1. コンテナの隔離と通信を向上させるためのカスタムブリッジネットワーク
  2. 複数のネットワーク間でのコンテナの接続
  3. ホストのネットワークスタックに直接アクセスするためのホストネットワークモード
  4. 完全なネットワーク隔離のためのノーネットワークモード
  5. 拡張可能なアプリケーションを構築するためのネットワークエイリアスとサービスの検出

Docker におけるこれらの高度なネットワーク機能は、コンテナ間の通信と隔離を精密に制御した複雑なマルチコンテナアプリケーションを設計するための強力なツールを提供します。これらの概念を理解することは、効率的でセキュア、拡張可能なコンテナ化されたアプリケーションを設計するために不可欠です。

Docker ネットワークは非常に柔軟性がありますが、コンテナネットワークアーキテクチャを設計する際には、セキュリティ上の影響を考慮することが重要です。常に最小限の特権の原則に従い、必要なポートとサービスのみを公開してください。

Docker を使い続けるうちに、これらのネットワーク概念は、複雑なアプリケーションとマイクロサービスアーキテクチャをオーケストレーションする際に非常に貴重であることがわかります。これらの概念を定期的に練習して、Docker ネットワークを効果的に管理する熟練者になりましょう。