Dockerのマルチホストネットワーク機能を試してみた

Docker公式ロゴ1a
©2023 Docker Inc. All rights reserved

 Dockerは、異なるホスト上にあるDockerコンテナをマルチホストネットワークの仕組みによって接続することが可能です。

 この仕組みを利用することによって、別のホスト上のDockerコンテナがまるで同じホスト内に存在するかのように操作することができます。

 本記事では、マルチホストネットワーク環境を使用しまして、複数のホスト上にあるDockerコンテナを同じネットワークに参加させて疎通確認を行うところまでを実例を交えて解説してます。

 Dockerのマルチホストネットワーク機能を理解するキッカケになれば幸いです。

マルチホストネットワークを作成する

 本記事では以下のマルチホストネットワーク環境を使用します。

docker-network-multi20

 実際にお試しになりながら本記事をお読みになる方は、別記事「Dockerのマルチホストネットワークの概要説明と環境構築」を参考に環境をお作りください。

 まずはマルチホストネットワークを作成します。

 Dockerホスト1にて以下のコマンドを実行してください。

$ docker network create -d overlay overlay01

 以下のコマンドでネットワーク一覧を出力してみましょう。

$ docker network ls

 作成したoverlay01が表示されています。

NETWORK ID    NAME       DRIVER   SCOPE
ebbea95f923c  bridge     bridge   local
79dcd8a07b8c  host       host     local
938d33679936  none       null     local
4e6f718b1a99  overlay01  overlay  global

 では次に、Dockerホスト2にてネットワーク一覧を出力してみます。

$ docker network ls

 以下のように表示されました。

NETWORK ID    NAME       DRIVER   SCOPE
e08b48f093e2  bridge     bridge   local
af75db508d85  host       host     local
bda0bf45e916  none       null     local
4e6f718b1a99  overlay01  overlay  global

 Dockerホスト2ではoverlay01の作成は行っていないのに、表示されています。

 実は、Dockerホスト1でoverlay01を作成した時点で、その情報がキーバリューストアサーバーに登録されまして、その情報をDockerホスト2が既に受け取っていたのです。

 このように、マルチホストネットワークの情報は共有されます。同じキーバリューストアサーバーをDockerデーモンに登録しているDockerホストの中のどれか1つのサーバーで、ネットワークを管理するコマンドを実行すれば良いことになります。

 マルチホストネットワークの削除を行えば、キーバリューストアサーバーからも削除されて、結果的にDockerホスト内のネットワークからも削除されます。

マルチホストネットワークに他ホストのコンテナを参加させる

 では、異なるDockerホスト上に分散したコンテナを、同じネットワークに参加させてみようと思います。

 まずはDockerホスト1にて、vmtest1をoverlay01ネットワークに参加させて起動してみます。

$ docker run -d --name vmtest1 --net overlay01 centos init

 起動したことを確認しましょう。

$ docker ps
CONTAINER ID   IMAGE   COMMAND  CREATED         STATUS          PORTS  NAMES
fdbd31d2f690   centos  "init"   32 seconds ago  Up 30 seconds          vmtest1

 次にDockerホスト2にて、vmtest2をoverlay01ネットワークに参加させて起動してみます。

$ docker run -d --name vmtest2 --net overlay01 centos init

 起動したことを確認します。

$ docker ps
CONTAINER ID   IMAGE   COMMAND  CREATED         STATUS          PORTS  NAMES
fe8d877e2703   centos  "init"   3 seconds ago   Up 2 seconds           vmtest2

 異なるDockerホスト上にそれぞれ1つずつコンテナの起動が完了しましたので、コンテナ間の疎通を確認してみたいと思います。

 まずは、「vmtest1 → vmtest2」から行います。

 以下のコマンドでvmtest1上でvmtest2に対してpingを実行します。

$ docker exec -it vmtest1 ping vmtest2

 以下のとおり、vmtest2からpingの応答が確認できました。

PING vmtest2 (10.0.0.3) 56(84) bytes of data.
64 bytes from vmtest2.overlay01 (10.0.0.3): icmp_seq=1 ttl=64 time=0.276 ms
64 bytes from vmtest2.overlay01 (10.0.0.3): icmp_seq=2 ttl=64 time=0.290 ms
^C
--- vmtest2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.276/0.283/0.290/0.007 ms

 今度は逆の「vmtest2 → vmtest1」の確認です。

 以下のコマンドでvmtest2上でvmtest1に対してpingを実行します。

$ docker exec -it vmtest2 ping vmtest1

 以下のとおり、vmtest1からpingの応答が確認できました。

PING vmtest1 (10.0.0.2) 56(84) bytes of data.
64 bytes from vmtest1.overlay01 (10.0.0.2): icmp_seq=1 ttl=64 time=0.390 ms
64 bytes from vmtest1.overlay01 (10.0.0.2): icmp_seq=2 ttl=64 time=0.220 ms
^C
--- vmtest1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.220/0.305/0.390/0.085 ms

 別のDockerホストで起動されたvmtest1とvmtest2が、Dockerのマルチホストネットワークで接続されていることが分かります。

 pingではvmtest1やvmtest2のように名前でホストを指定しましたが、ちゃんと名前解決されていました。

 Dockerは同じネットワーク内のDockerコンテナ間では、名前解決を自動的に行ってくれます。

まとめ

 Dockerのマルチホストネットワーク機能はいかがでしたでしょうか。

 この機能のお陰で、システム設計の自由度がかなり上がったと思います。この機能にSwarmやクラスタ機能を組み合わせることで、更に可用性や信頼性もアップできます。

 最後までお読みいただきありがとうございました。

コメント