はじめに
この実験では、docker network create コマンドを使用してコンテナネットワークを効果的に管理する方法を学びます。異なるネットワークタイプと設定を調査し、コンテナが互いに、および外部世界とどのように通信するかを理解します。
具体的には、基本的なブリッジネットワークの作成、特定のサブネットとゲートウェイを使用したブリッジネットワークのカスタマイズ、およびマルチホスト通信シナリオ用のアタッチ可能な内部オーバーレイネットワークのセットアップに関する実践的な経験を積みます。この実験の終了時には、Docker コンテナのさまざまなネットワークトポロジを設計および実装する方法をしっかりと理解するようになります。
基本的なブリッジネットワークを作成する
このステップでは、Docker で基本的なブリッジネットワークを作成する方法を学びます。ブリッジネットワークはコンテナのデフォルトのネットワークタイプです。同じブリッジネットワークに接続されたコンテナは互いに通信できますが、他のブリッジネットワーク上のコンテナやホストマシンのネットワークからは隔離されています。
まず、既存の Docker ネットワークをリストアップして、デフォルトのネットワークを確認しましょう。
docker network ls
bridge、host、none などのいくつかのデフォルトネットワークが表示されるはずです。bridge ネットワークが今回操作する対象です。
では、新しいブリッジネットワークを作成しましょう。これを my-bridge-network と名付けます。
docker network create my-bridge-network
このコマンドは、デフォルト設定で新しいブリッジネットワークを作成します。Docker は自動的にこのネットワークにサブネットとゲートウェイを割り当てます。
ネットワークが正常に作成されたことを確認するために、再度 Docker ネットワークをリストアップしましょう。
docker network ls
これで、リストに my-bridge-network が表示されるはずです。
次に、新しく作成したネットワークを調査して、Docker によって割り当てられたサブネットやゲートウェイなどの詳細を確認しましょう。
docker network inspect my-bridge-network
このコマンドの出力には、ネットワークの詳細情報、たとえば ID、ドライバー(bridge であるはず)、IPAM セクションのサブネットとゲートウェイが表示されます。
では、コンテナを実行して、新しいネットワークに接続しましょう。この例では alpine イメージを使用します。alpine イメージがローカルにない場合、Docker は自動的にそれを取得します。
docker run -d --name container1 --network my-bridge-network alpine sleep infinity
このコマンドは、container1 という名前のコンテナをデタッチドモード(-d)で実行し、my-bridge-network に接続し(--network my-bridge-network)、sleep infinity コマンドを実行することでコンテナを実行し続けます。
コンテナが実行中で、正しいネットワークに接続されていることを確認するには、コンテナを調査できます。
docker inspect container1
出力で Networks セクションを探します。my-bridge-network がリストされ、そのネットワーク内でコンテナに割り当てられた IP アドレスも表示されるはずです。
最後に、別のコンテナを実行して同じネットワークに接続し、コンテナ間の通信を実証しましょう。
docker run -d --name container2 --network my-bridge-network alpine sleep infinity
これで、container1 と container2 の両方が my-bridge-network に接続されました。これらは、ネットワーク内のコンテナ名または IP アドレスを使用して互いに通信できるはずです。
通信をテストするために、container1 内でコマンドを実行して container2 を ping しましょう。まず、ping コマンドを使用するために、alpine コンテナに iputils パッケージをインストールする必要があります。
docker exec container1 apk add --no-cache iputils
docker exec container2 apk add --no-cache iputils
では、container1 から container2 を ping しましょう。
docker exec container1 ping -c 3 container2
ping の応答が成功するはずで、これは同じブリッジネットワーク上の 2 つのコンテナが通信できることを示しています。
カスタムサブネットとゲートウェイを持つブリッジネットワークを作成する
前のステップでは、デフォルト設定でブリッジネットワークを作成しました。Docker は自動的にサブネットとゲートウェイを割り当てました。このステップでは、ブリッジネットワークを作成し、独自のサブネットとゲートウェイを指定する方法を学びます。これにより、コンテナのネットワーク設定をより細かく制御できます。
まず、前のステップで作成したコンテナとネットワークを削除し、最初からやり直しましょう。
docker stop container1 container2
docker rm container1 container2
docker network rm my-bridge-network
では、custom-bridge-network という名前の新しいブリッジネットワークを作成し、--subnet と --gateway フラグを使用してカスタムサブネットとゲートウェイを指定しましょう。サブネットには 172.20.0.0/16 を、ゲートウェイには 172.20.0.1 を使用します。
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--gateway 172.20.0.1 \
custom-bridge-network
--driver bridge フラグは、デフォルトであっても明示的にブリッジドライバーを指定します。--subnet フラグはネットワークの IP アドレス範囲を定義し、--gateway フラグはこのネットワークに接続されたコンテナのゲートウェイ IP アドレスを設定します。
指定したサブネットとゲートウェイでネットワークが作成されたことを確認するには、ネットワークを調査しましょう。
docker network inspect custom-bridge-network
出力で IPAM セクションを見てください。Subnet と Gateway フィールドが、あなたが指定した値(172.20.0.0/16 と 172.20.0.1)と一致するはずです。
では、コンテナを実行して、新しいネットワークに接続しましょう。再び alpine イメージを使用します。
docker run -d --name custom-container1 --network custom-bridge-network alpine sleep infinity
このコマンドは、custom-container1 という名前のコンテナを実行し、custom-bridge-network に接続します。Docker は指定されたサブネット(172.20.0.0/16)からこのコンテナに IP アドレスを割り当てます。
カスタムネットワーク内でのコンテナの IP アドレスを確認するには、コンテナを調査しましょう。
docker inspect custom-container1
出力で custom-bridge-network の Networks セクションを見ると、172.20.0.0/16 の範囲内の IpAddress が表示されるはずです。
同じネットワーク上に別のコンテナを実行しましょう。
docker run -d --name custom-container2 --network custom-bridge-network alpine sleep infinity
これで、custom-container1 と custom-container2 の両方が custom-bridge-network 上にあり、通信できるはずです。
前のステップと同様に、ping を行うには iputils が必要です。
docker exec custom-container1 apk add --no-cache iputils
docker exec custom-container2 apk add --no-cache iputils
custom-container1 から custom-container2 を ping して通信をテストしましょう。
docker exec custom-container1 ping -c 3 custom-container2
ping の応答が成功するはずで、これはカスタムブリッジネットワーク内での通信が確認できることを示しています。
マルチホスト通信のためのアタッチ可能なオーバーレイネットワークを作成する
ブリッジネットワークは、同じ Docker ホスト上のコンテナ間の通信に適しています。しかし、異なる Docker ホスト上で実行されているコンテナ間の通信には、オーバーレイネットワークが必要です。オーバーレイネットワークは Docker Swarm によって作成および管理されます。
このステップでは、接続可能なオーバーレイネットワークを作成します。接続可能なオーバーレイネットワークは、スタンドアロンコンテナ(Swarm サービスの一部ではないコンテナ)が接続し、異なる Docker ホスト間で通信できるようにします。
まず、このホストで Docker Swarm を初期化する必要があります。これはオーバーレイネットワークを作成および管理するために必要です。
docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')
このコマンドは Swarm を初期化し、アドバタイズアドレスをホストの IP アドレスに設定します。出力には、現在のノードが Swarm マネージャーになったことが表示されます。
Swarm が初期化されたので、接続可能なオーバーレイネットワークを作成できます。これを my-overlay-network と名付けます。--attachable フラグは、スタンドアロンコンテナが接続できるようにするために重要です。
docker network create \
--driver overlay \
--attachable \
my-overlay-network
--driver overlay フラグは、オーバーレイネットワークを作成することを指定します。--attachable フラグは、スタンドアロンコンテナがこのネットワークを利用できるようにします。
オーバーレイネットワークが作成されたことを確認するには、Docker ネットワークをリストアップしましょう。
docker network ls
リストに my-overlay-network が表示され、そのドライバーは overlay であるはずです。
では、スタンドアロンコンテナを実行し、新しいオーバーレイネットワークに接続しましょう。alpine イメージを使用します。
docker run -d --name overlay-container1 --network my-overlay-network alpine sleep infinity
このコマンドは、overlay-container1 という名前のコンテナを実行し、my-overlay-network に接続します。
コンテナがオーバーレイネットワークに接続されていることを確認するには、コンテナを調査しましょう。
docker inspect overlay-container1
出力で Networks セクションを探します。my-overlay-network がリストされているはずです。
これは単一ホスト環境なので、マルチホスト通信を完全に実証することはできません。しかし、複数の Swarm ノードがあれば、このネットワークはマルチホスト通信をサポートするように構成されています。
この単一ホスト上の同じオーバーレイネットワーク上に別のコンテナを実行しましょう。
docker run -d --name overlay-container2 --network my-overlay-network alpine sleep infinity
これで、overlay-container1 と overlay-container2 の両方が my-overlay-network 上にあり、通信できるはずです。
コンテナに iputils をインストールして ping を行いましょう。
docker exec overlay-container1 apk add --no-cache iputils
docker exec overlay-container2 apk add --no-cache iputils
overlay-container1 から overlay-container2 を ping して通信をテストしましょう。
docker exec overlay-container1 ping -c 3 overlay-container2
ping の応答が成功するはずで、これはこの単一ホスト上のオーバーレイネットワーク内での通信が確認できることを示しています。
内部オーバーレイネットワークを作成する
前のステップでは、スタンドアロンコンテナが接続できる接続可能なオーバーレイネットワークを作成しました。このステップでは、内部 オーバーレイネットワークを作成します。内部ネットワークは外部ネットワークから隔離されており、つまり、内部ネットワーク上のコンテナは明示的に許可されない限り、外部世界(Docker ホストのネットワークを含む)と通信することができません。これは、Swarm 内で隔離されたサービスネットワークを作成するのに便利です。
まず、前のステップで作成したコンテナとネットワークをクリーンアップしましょう。
docker stop overlay-container1 overlay-container2
docker rm overlay-container1 overlay-container2
docker network rm my-overlay-network
では、my-internal-network という名前の内部オーバーレイネットワークを作成しましょう。これには --internal フラグを使用します。
docker network create \
--driver overlay \
--internal \
my-internal-network
--internal フラグは、このネットワークに接続されたコンテナが外部ネットワークと通信できないようにします。
内部オーバーレイネットワークが作成されたことを確認するには、Docker ネットワークをリストアップしましょう。
docker network ls
リストに my-internal-network が overlay ドライバーで表示されるはずです。
では、コンテナを実行し、新しい内部ネットワークに接続しましょう。alpine イメージを使用します。
docker run -d --name internal-container1 --network my-internal-network alpine sleep infinity
このコマンドは、internal-container1 という名前のコンテナを実行し、my-internal-network に接続します。
コンテナが内部ネットワークに接続されていることを確認するには、コンテナを調査しましょう。
docker inspect internal-container1
出力で Networks セクションを探します。my-internal-network がリストされているはずです。
同じ内部ネットワーク上に別のコンテナを実行しましょう。
docker run -d --name internal-container2 --network my-internal-network alpine sleep infinity
これで、internal-container1 と internal-container2 の両方が my-internal-network 上にあります。これらのコンテナは互いに通信できるはずですが、外部世界とは通信できません。
コンテナに iputils をインストールして ping を行いましょう。
docker exec internal-container1 apk add --no-cache iputils
docker exec internal-container2 apk add --no-cache iputils
internal-container1 から internal-container2 を ping して通信をテストしましょう。
docker exec internal-container1 ping -c 3 internal-container2
ping の応答が成功するはずで、これは内部オーバーレイネットワーク内での通信が確認できることを示しています。
では、internal-container1 から google.com のような外部アドレスを ping してみましょう。
docker exec internal-container1 ping -c 3 google.com
この ping は、内部ネットワークが外部ネットワークから隔離されているため、失敗するはずです。
まとめ
この実験では、docker network create コマンドを使用してコンテナネットワークを管理する方法を学びました。まず、コンテナのデフォルトのネットワークタイプである基本的なブリッジネットワークを作成し、docker network ls と docker network inspect を使用してその作成と詳細を確認しました。次に、コンテナをこの新しく作成したネットワークに接続する方法を実証しました。
基本的なブリッジネットワークを基に、カスタムサブネットとゲートウェイを持つブリッジネットワークを作成することで、ネットワークの IP アドレッシングをより細かく制御する方法を探りました。最後に、オーバーレイネットワークの作成に取り組みました。具体的には、マルチホスト通信のための接続可能なオーバーレイネットワークと、Swarm 内での隔離された通信のための内部オーバーレイネットワークを作成し、さまざまなデプロイメントシナリオに対応する Docker ネットワーキングの汎用性を示しました。



