概要
複数コンテナ間の通信は、シングルホストではdockerのlink
機能を使います。
しかしこの機能はマルチホストでは使えないので、擬似的にコンテナ群を同一ネットワーク上に置くことの出来るWeave
というツールを使います。
環境
- Ubuntu 14.04
- Docker 1.4.1
- Weave
vagrantの用意
マルチポスト環境なので複数のvagrantを用意します。Vagrantfile
に以下を追記してvagrant up
します。
config.vm.define :web1 do |web| web.vm.network :private_network, ip: "192.168.35.10" end config.vm.define :web2 do |web| web.vm.network :private_network, ip: "192.168.35.11" end
Dockerのインストール
$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh
これで最新版がインストールされます。
weaveのインストール
$ sudo wget -O /usr/local/bin/weave \ https://raw.githubusercontent.com/zettio/weave/master/weave $ sudo chmod a+x /usr/local/bin/weave
Dockerコンテナの用意
イメージだけダウンロードしておきましょう。
$ sudo docker pull ubuntu
ちゃんと動くかチェック。
$ sudo docker run -it ubuntu bash root@c7122d7007a2:/#
大丈夫ですね。
Weaveでマルチホスト間での通信
Weaveを試してみたでの説明が分かりやすかったのでその図を引用します。
上記のように異なるホスト間で、コンテナ同士を同じネットワークに置くことで疎通出来るようにしてます。
では以下実際の設定です。
ホスト1
$ sudo su # weave launch # weave run 10.0.1.1/24 -it ubuntu bash
これで10.0.1.x
のネットワークを持ったコンテナが作成されます。
バックグラウンド起動なので中に入っておきます。docker ps
でコンテナ名をチェックして
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 47b27915b3cc ubuntu:latest "/bin/bash" About a minute ago Up About a minute clever_rosalind 694cf62c5a8e zettio/weave:git-945a5cf7fee6 "/home/weave/weaver 2 minutes ago Up 2 minutes 0.0.0.0:6783->6783/tcp, 0.0.0.0:6783->6783/udp weave
docker exec
で入ります。
# docker exec -it clever_rosalind bash root@47b27915b3cc:/#
IPをチェックしてみましょう。
root@47b27915b3cc:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 12: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:3/64 scope link valid_lft forever preferred_lft forever 14: ethwe: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc pfifo_fast state UP group default qlen 1000 link/ether 3a:2c:c7:7b:f0:1f brd ff:ff:ff:ff:ff:ff inet 10.0.1.1/24 scope global ethwe valid_lft forever preferred_lft forever inet6 fe80::382c:c7ff:fe7b:f01f/64 scope link valid_lft forever preferred_lft forever
ちゃんと設定した10.0.1.1/24
になっていますね。
ホスト2
こちらではweave launch
の際に最初のホストのIPを指定します。
$ sudo su # weave launch 192.168.35.10
起動したらコンテナの方も起動します。こちらは同じネットワークで別IPを用意します。
# weave run 10.0.1.2/24 -it ubuntu bash
同様にコンテナの中に入ります。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4084e415846a ubuntu:latest "bash" 7 seconds ago Up 6 seconds stoic_lovelace c757d33c51b7 zettio/weave:git-945a5cf7fee6 "/home/weave/weaver 10 minutes ago Up 10 minutes 0.0.0.0:6783->6783/tcp, 0.0.0.0:6783->6783/udp weave
# docker exec -it stoic_lovelace bash root@4084e415846a:/#
IPを確認します。
root@4084e415846a:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 14: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff inet 172.17.0.4/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:4/64 scope link valid_lft forever preferred_lft forever 16: ethwe: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc pfifo_fast state UP group default qlen 1000 link/ether 16:79:e9:e8:94:3f brd ff:ff:ff:ff:ff:ff inet 10.0.1.2/24 scope global ethwe valid_lft forever preferred_lft forever inet6 fe80::1479:e9ff:fee8:943f/64 scope link valid_lft forever preferred_lft forever
10.0.1.2/24
になってますね。
ではホスト1のコンテナにping
を打ってみます。
root@4084e415846a:/# ping 10.0.1.1 PING 10.0.1.1 (10.0.1.1) 56(84) bytes of data. 64 bytes from 10.0.1.1: icmp_seq=1 ttl=64 time=1.71 ms 64 bytes from 10.0.1.1: icmp_seq=2 ttl=64 time=1.53 ms
通りました。
以上で異なるホストのDockerコンテナの通信が確認できました。
お疲れ様でした。