Carpe Diem

備忘録

Weave を使ってマルチホスト間でのコンテナ通信を行う

概要

複数コンテナ間の通信は、シングルホストでは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を試してみたでの説明が分かりやすかったのでその図を引用します。

f:id:quoll00:20141225211828p:plain

上記のように異なるホスト間で、コンテナ同士を同じネットワークに置くことで疎通出来るようにしてます。

では以下実際の設定です。

ホスト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コンテナの通信が確認できました。
お疲れ様でした。

参考