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

 お気づきの方もいらっしゃると思いますが、pingで指定したのはvmtest1やvmtest2のように名前です。でも、ちゃんと名前解決されているがわかります。

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

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

 

まとめ

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

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

 ここ数年で進化が加速しているDockerですが、今後がとても楽しみです。

 

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


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です