Dockerは、異なるホスト上にあるDockerコンテナをマルチホストネットワークの仕組みによって接続することが可能です。
この仕組みを利用することによって、別のホスト上のDockerコンテナがまるで同じホスト内に存在するかのように操作することができます。
本記事では、マルチホストネットワーク環境を使用しまして、複数のホスト上にあるDockerコンテナを同じネットワークに参加させて疎通確認を行うところまでを実例を交えて解説してます。
Dockerのマルチホストネットワーク機能を理解するキッカケになれば幸いです。
マルチホストネットワークを作成する
本記事では以下のマルチホストネットワーク環境を使用します。

実際にお試しになりながら本記事をお読みになる方は、別記事「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やクラスタ機能を組み合わせることで、更に可用性や信頼性もアップできます。
最後までお読みいただきありがとうございました。
コメント