Help us understand the problem. What is going on with this article?

Dockerでweaveをつかったマルチホストネットワーキング

More than 3 years have passed since last update.

Dockerを使ったマルチホストのネットワークは、いくつかあるなか、weaveを検証したので、記事にしました。

執筆時の2016年5月時点で、docker+consul+swarm(+vxlan)による検証を行いましたが、vxlanが作成されないなど現象がでてきて、内部ネットワーク(10.0.0.x/16)通信ができませんでした。

(時間があれば別途記事化しようと思います)

今回参照させてもらった記事
マルチホストDockerネットワーキング(weave)
の異なるバリエーションとして位置づけています。
若干コマンドの仕様変更などもあり、見た目がかわりますが、わかりにくいところは若干補足の意味で追記しています。

1.検証環境

某有名なサイトのクラウドサービスを利用して、検証用に以下のVirutalMachineを起動を立ち上げた。

1.1 ホスト一覧

hostname private IP(eth0) public IP(eth0:0)
ホスト1 test01 172.31.13.144 x.x.x.x
ホスト2 test02 172.31.27.114 y.y.y.y

ホスト1とホスト2は別VLAN上で接続されている。

1.2 ホストの各種バージョン

ホスト1とホスト2の各種バージョンは以下の通り。

バージョン
distribution CentOS 7 Linux
kernel 3.10.0-327.el7.x86_64
docker Docker version 1.11.1, build 5604cbe
weave weave script 1.5.1
GO go1.4.2 linux/amd64

Dockerのインストール方法は
Installation on CentOS(英文)
に詳しい内容があります

1.3 ホストが使用するポート番号

使用するポート番号は以下の通り。

種類 ポート番号
No.1 udp/tcp 6783

イメージ図はこちら
図1.png

2.準備

すべてのホストで以下の作業を実施する。

2.1 必要パッケージのインストール

必要パッケージのインストール
root@test01:~# yum update
root@test01:~# yum -y install iptables2 bridge-utils curl

2.2 GOのインストール

golangのインストール
root@test01:~# yum -y install golang
root@test01:~# go version
go version go1.4.2 linux/amd64

詳細はこちら
Go言語をyumで入れる

2.3 Dockerのインストール

dockerのインストール
root@test01:~# yum -y install docker-engine
root@test01:~# docker version
Client:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Wed Apr 27 00:34:42 2016
 OS/Arch:      linux/amd64
dockerの起動
root@test01:~# systemctl start docker.service
ネットワークの確認
root@test01:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 06:59:6e:00:15:e4 brd ff:ff:ff:ff:ff:ff
    inet 172.31.13.144/21 brd 172.31.15.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 153.122.99.4/21 brd 153.122.103.255 scope global eth0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::459:6eff:fe00:15e4/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:9a:ec:5f:e5 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

2.4 weaveのインストール

weaveのインストール
root@test01:~# wget -O /usr/local/bin/weave https://github.com/zettio/weave/releases/download/latest_release/weave
root@test01:~# chmod a+x /usr/local/bin/weave

3.weaveクラスタの起動

weaveクラスタに参加するある一つのノード(今回はホスト1)でweaveを起動する。
サーバーの役割になるのが1つ、他はエージェント的役割になる。

3.1 ホスト1

weave起動
root@test01:~# weave launch
Unable to find image 'weaveworks/weaveexec:1.5.1' locally
1.5.1: Pulling from weaveworks/weaveexec
c52e3ed763ff: Pull complete 
e3ee3ebaaa7a: Pull complete 
9d94a316b7bf: Pull complete 
6e4a78881788: Pull complete 
3bd2811e2c9a: Pull complete 
886cab1ed359: Pull complete 
1ccbb1f1a1e7: Pull complete 
e7efc9eedb90: Pull complete 
b8e5c537a426: Pull complete 
Digest: sha256:91ff928a6e4c76869ce71053db900fa142d0cfa965f1502df8554530a65ca188
Status: Downloaded newer image for weaveworks/weaveexec:1.5.1
WARNING: existing iptables rule

    '-A FORWARD -j REJECT --reject-with icmp-host-prohibited'

will block name resolution via weaveDNS - please reconfigure your firewall.
Unable to find image 'weaveworks/weavedb:latest' locally
latest: Pulling from weaveworks/weavedb
c1d3010baf39: Pulling fs layer
c1d3010baf39: Verifying Checksum
c1d3010baf39: Download complete
c1d3010baf39: Pull complete
Digest: sha256:0790ab1a704d50eeae38468a9c95a710e044d7666d7dba5e0331f96ebc34aab8
Status: Downloaded newer image for weaveworks/weavedb:latest
Unable to find image 'weaveworks/weave:1.5.1' locally
1.5.1: Pulling from weaveworks/weave
91aaa506766f: Pulling fs layer
c7e848dbefae: Pulling fs layer
67966b7f321c: Pulling fs layer
908e601e8e38: Pulling fs layer
908e601e8e38: Waiting
91aaa506766f: Verifying Checksum
91aaa506766f: Download complete
67966b7f321c: Verifying Checksum
67966b7f321c: Download complete
c7e848dbefae: Verifying Checksum
c7e848dbefae: Download complete
908e601e8e38: Verifying Checksum
908e601e8e38: Download complete
91aaa506766f: Pull complete
c7e848dbefae: Pull complete
67966b7f321c: Pull complete
908e601e8e38: Pull complete
Digest: sha256:30fb6aa8c11e599683d5d21d0d069120ff1c222c1f97982c46e79b8bdbe17241
Status: Downloaded newer image for weaveworks/weave:1.5.1
Unable to find image 'weaveworks/plugin:1.5.1' locally
1.5.1: Pulling from weaveworks/plugin
c52e3ed763ff: Already exists
e3ee3ebaaa7a: Already exists
9d94a316b7bf: Already exists
6e4a78881788: Already exists
3bd2811e2c9a: Already exists
886cab1ed359: Already exists
1ccbb1f1a1e7: Already exists
e7efc9eedb90: Already exists
b8e5c537a426: Already exists
d7b5bdab083d: Pulling fs layer
d7b5bdab083d: Verifying Checksum
d7b5bdab083d: Download complete
d7b5bdab083d: Pull complete
Digest: sha256:a378027cf4730b63f0c68b556ab8216f7c90a256bfce53bce8bbe9d309daeb5f
Status: Downloaded newer image for weaveworks/plugin:1.5.1
root@test01:~# 

この段階でweaveというブリッジが作成される。
またweave用dockerコンテナが自動で立ち上がり、docker0とweaveにvethペアが差し込まれる。weave用dockerコンテナでは、weaverプロセスが起動している。

このときに、

WARNING: existing iptables rule
'-A FORWARD -j REJECT --reject-with icmp-host-prohibited'
will block name resolution via weaveDNS - please reconfigure your firewall.

のエラーが出たら、iptablesより削除しておかないとPINGが通らない。
iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited
と入力して削除する。

ホスト1のネットワークの状態(起動後)
root@test01:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 06:59:6e:00:15:e4 brd ff:ff:ff:ff:ff:ff
    inet 172.31.13.144/21 brd 172.31.15.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 153.122.99.4/21 brd 153.122.103.255 scope global eth0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::459:6eff:fe00:15e4/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:9a:ec:5f:e5 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc noqueue state UNKNOWN 
    link/ether fe:84:77:e8:eb:5d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc84:77ff:fee8:eb5d/64 scope link 
       valid_lft forever preferred_lft forever
5: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc noqueue state UP 
    link/ether 72:1f:cd:e9:07:33 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::701f:cdff:fee9:733/64 scope link 
       valid_lft forever preferred_lft forever
6: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN 
    link/ether 06:1c:d0:09:93:7d brd ff:ff:ff:ff:ff:ff
8: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc pfifo_fast master datapath state UP qlen 1000
    link/ether 1a:51:b3:21:b6:f1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::1851:b3ff:fe21:b6f1/64 scope link 
       valid_lft forever preferred_lft forever
9: vethwe-bridge@vethwe-datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc pfifo_fast master weave state UP qlen 1000
    link/ether 3a:66:a8:29:94:52 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::3866:a8ff:fe29:9452/64 scope link 
       valid_lft forever preferred_lft forever
root@test01:~# brctl show docker0
bridge name bridge id       STP enabled interfaces
docker0     8000.02429aec5fe5   no      
root@test01:~#  brctl show weave
bridge name bridge id       STP enabled interfaces
weave       8000.721fcde90733   no      vethwe-bridge
ホスト1で立ち上がったweave用コンテナ
root@test01:~# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
5fdfa5d771a1        weaveworks/plugin:1.5.1      "/home/weave/plugin"     2 minutes ago       Up 2 minutes                            weaveplugin
9800407af969        weaveworks/weaveexec:1.5.1   "/home/weave/weavepro"   3 minutes ago       Up 2 minutes                            weaveproxy
83e19416b6a4        weaveworks/weaveexec:1.5.1   "/bin/false"             3 minutes ago       Created                                 weavevolumes-1.5.1
4340cecb92e1        weaveworks/weave:1.5.1       "/home/weave/weaver -"   3 minutes ago       Up 3 minutes                            weave
4c5cb99ad7a5        weaveworks/weavedb           "data-only"              3 minutes ago       Created                                 weavedb

3.2 ホスト2

次にホスト2でweaveを起動する。この際、最初にweaveを立ち上げたホストのIPアドレスを指定することで、weaveクラスタに参加することができる。

クラスタメンバーのIPアドレスを指定してweave起動
root@test01:~# weave launch 172.31.13.144
Unable to find image 'weaveworks/weaveexec:1.5.1' locally
1.5.1: Pulling from weaveworks/weaveexec
...

ホスト1と同様にweaveブリッジが作成され、weaveコンテナが立ち上がる。
ホスト1と同様iptableのエラーメッセージの対応を行う。

ホスト2のネットワークの状態(起動後)
root@test02:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 06:9c:20:00:20:53 brd ff:ff:ff:ff:ff:ff
    inet 172.31.27.114/21 brd 172.31.31.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 153.122.99.4/21 brd 153.122.103.255 scope global eth0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::49c:20ff:fe00:2053/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:cc:c1:48:93 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc noqueue state UNKNOWN 
    link/ether d2:84:50:d5:5e:ab brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d084:50ff:fed5:5eab/64 scope link 
       valid_lft forever preferred_lft forever
5: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc noqueue state UP 
    link/ether de:54:76:ab:4f:e9 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::dc54:76ff:feab:4fe9/64 scope link 
       valid_lft forever preferred_lft forever
6: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN 
    link/ether 22:bf:fe:a5:26:a0 brd ff:ff:ff:ff:ff:ff
8: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc pfifo_fast master datapath state UP qlen 1000
    link/ether 0a:3c:9f:ac:47:bd brd ff:ff:ff:ff:ff:ff
    inet6 fe80::83c:9fff:feac:47bd/64 scope link 
       valid_lft forever preferred_lft forever
9: vethwe-bridge@vethwe-datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc pfifo_fast master weave state UP qlen 1000
    link/ether 82:4a:41:ff:a2:59 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::804a:41ff:feff:a259/64 scope link 
       valid_lft forever preferred_lft forever
root@test02:~# brctl show docker0
bridge name bridge id       STP enabled interfaces
docker0     8000.0242ccc14893   no      
root@test02:~#  brctl show weave
bridge name bridge id       STP enabled interfaces
weave       8000.de5476ab4fe9   no      vethwe-bridge
ホスト2で立ち上がったweave用コンテナ
root@test02:~# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
52f5367ccd91        weaveworks/plugin:1.5.1      "/home/weave/plugin"     5 minutes ago       Up 5 minutes                            weaveplugin
694d4665f366        weaveworks/weaveexec:1.5.1   "/home/weave/weavepro"   5 minutes ago       Up 5 minutes                            weaveproxy
6c9e84329487        weaveworks/weaveexec:1.5.1   "/bin/false"             5 minutes ago       Created                                 weavevolumes-1.5.1
918e14fc1142        weaveworks/weave:1.5.1       "/home/weave/weaver -"   5 minutes ago       Up 5 minutes                            weave
2f0cf5db8704        weaveworks/weavedb           "data-only"              6 minutes ago       Created                                 weavedb

4.weaveクラスタの状態

weave statusweave report でweaveクラスタの状態が確認できる。

weaveクラスタの状態
root@test01:~#  weave status

        Version: 1.5.1 (up to date; next check at 2016/05/24 17:27:23)

        Service: router
       Protocol: weave 1..2
           Name: 72:1f:cd:e9:07:33(test01)
     Encryption: disabled
  PeerDiscovery: enabled
        Targets: 0
    Connections: 1 (1 established)
          Peers: 2 (with 2 established connections)
 TrustedSubnets: none

        Service: ipam
         Status: idle
          Range: 10.32.0.0-10.47.255.255
  DefaultSubnet: 10.32.0.0/12

        Service: dns
         Domain: weave.local.
       Upstream: 172.31.10.160, 180.222.191.16, 180.222.191.15
            TTL: 1
        Entries: 0

        Service: proxy
        Address: unix:///var/run/weave/weave.sock

        Service: plugin
     DriverName: weave

root@test01:~# weave status connections
<- 172.31.27.114:51531   established fastdp de:54:76:ab:4f:e9(test02)
root@test01:~# weave status peers
72:1f:cd:e9:07:33(test01)
   <- 172.31.27.114:51531   de:54:76:ab:4f:e9(test02) established
de:54:76:ab:4f:e9(test02)
   -> 172.31.13.144:6783    72:1f:cd:e9:07:33(test01) established
root@test01:~# weave report
{
    "Version": "1.5.1",
    "VersionCheck": {
        "Enabled": true,
        "NewVersion": "",
        "NextCheckAt": "2016-05-24T17:27:23.32623158Z"
    },
    "Router": {
        "Protocol": "weave",
        "ProtocolMinVersion": 1,
        "ProtocolMaxVersion": 2,
        "Encryption": false,
        "PeerDiscovery": true,
        "Name": "72:1f:cd:e9:07:33",
        "NickName": "test01",
        "Port": 6783,
        "Peers": [
            {
                "Name": "72:1f:cd:e9:07:33",
                "NickName": "test01",
                "UID": 1232692811381818389,
                "ShortID": 1212,
                "Version": 2,
                "Connections": [
                    {
                        "Name": "de:54:76:ab:4f:e9",
                        "NickName": "test02",
                        "Address": "172.31.27.114:51531",
                        "Outbound": false,
                        "Established": true
                    }
                ]
            },
            {
                "Name": "de:54:76:ab:4f:e9",
                "NickName": "test02",
                "UID": 4984887491259103282,
                "ShortID": 2957,
                "Version": 2,
                "Connections": [
                    {
                        "Name": "72:1f:cd:e9:07:33",
                        "NickName": "test01",
                        "Address": "172.31.13.144:6783",
                        "Outbound": true,
                        "Established": true
                    }
                ]
            }
        ],
        "UnicastRoutes": [
            {
                "Dest": "72:1f:cd:e9:07:33",
                "Via": "00:00:00:00:00:00"
            },
            {
                "Dest": "de:54:76:ab:4f:e9",
                "Via": "de:54:76:ab:4f:e9"
            }
        ],
        "BroadcastRoutes": [
            {
                "Source": "72:1f:cd:e9:07:33",
                "Via": [
                    "de:54:76:ab:4f:e9"
                ]
            }
        ],
        "Connections": [
            {
                "Address": "172.31.27.114:51531",
                "Outbound": false,
                "State": "established",
                "Info": "fastdp de:54:76:ab:4f:e9(test02)"
            }
        ],
        "Targets": null,
        "OverlayDiagnostics": {
            "fastdp": {
                "Vports": [
                    {
                        "ID": 0,
                        "Name": "datapath",
                        "TypeName": "internal"
                    },
                    {
                        "ID": 1,
                        "Name": "vethwe-datapath",
                        "TypeName": "netdev"
                    },
                    {
                        "ID": 2,
                        "Name": "vxlan-6784",
                        "TypeName": "vxlan"
                    }
                ],
                "Flows": []
            },
            "sleeve": null
        },
        "TrustedSubnets": [],
        "Interface": "datapath (via ODP)",
        "CaptureStats": {
            "FlowMisses": 52
        },
        "MACs": null
    },
    "IPAM": {
        "Paxos": null,
        "Range": "10.32.0.0-10.47.255.255",
        "RangeNumIPs": 1048576,
        "DefaultSubnet": "10.32.0.0/12",
        "Entries": null,
        "PendingClaims": null,
        "PendingAllocates": null
    },
    "DNS": {
        "Domain": "weave.local.",
        "Upstream": [
            "172.31.10.160",
            "180.222.191.16",
            "180.222.191.15"
        ],
        "Address": "172.17.0.1:53",
        "TTL": 1,
        "Entries": null
    }
}

weave reportの詳しい内容はこちら
weave/site/troubleshooting.md

5.Dockerコンテナ起動

weaveコマンドを用い、以下のようなコンテナを立ち上げる。

ホスト コンテナ名 IPアドレス 備考
ホスト1 httpd 192.168.99.10/24 apache2を起動
ホスト1 client1 192.168.99.11/24
ホスト2 client2 192.168.99.21/24

5.1 ホスト1

weave runした後にweave exposeすることで、静的routeとNATルールが追加される。
ただし外部からコンテナ上のサービスにアクセスする場合、-pオプションでポートフォワードしなければならないが、docker0に紐付けられたIPアドレスに関する設定がiptablesに書かれているとパケットが届かないため、iptablesから当該ルールを削除する。

これは非常に煩雑な手順なので、本来もっと良い方法があるのかもしれない。。。

httpdコンテナ起動
root@test01:~# HTTPD=$(weave run 192.168.99.10/24 -d -i -p 80:80 -t ubuntu:latest /bin/bash)
root@test01:~# ping 192.168.99.10
PING 192.168.99.10 (192.168.99.10) 56(84) bytes of data.
^C
--- 192.168.99.10 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

root@test01:~# weave expose 192.168.99.10/24
192.168.99.10
root@test01:~# ping 192.168.99.10
PING 192.168.99.10 (192.168.99.10) 56(84) bytes of data.
64 bytes from 192.168.99.10: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 192.168.99.10: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 192.168.99.10: icmp_seq=3 ttl=64 time=0.047 ms
^C
--- 192.168.99.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.047/0.056/0.074/0.013 ms
client1コンテナ起動
root@test01:~# CLIENT1=$(weave run 192.168.99.11/24 -d -i -t ubuntu:latest /bin/bash)
root@test01:~# weave expose 192.168.99.11/24
192.168.99.11
iptablesのルール削除
root@test01:~# iptables-save | grep `docker inspect --format="{{.NetworkSettings.IPAddress}}" $HTTPD`
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT


root@test01:~# iptables-save | grep `docker inspect --format="{{.NetworkSettings.IPAddress}}" $HTTPD`
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

root@test01:~# iptables -t nat -D POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
root@test01:~# iptables -t nat -D DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
root@test01:~# iptables -D DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

iptableの詳細を知りたいかたはこちら
コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう

ホスト1のネットワーク状態
root@test01:~# brctl show docker0
bridge name bridge id       STP enabled interfaces
docker0     8000.02429aec5fe5   no      veth483c8f2
                            vethd470fff
[root@test01:~# brctl show weave
bridge name bridge id       STP enabled interfaces
weave       8000.721fcde90733   no      vethwe-bridge
                            vethwepl3947
                            vethwepl4633
root@test01:~#  ip route show
default via 172.31.15.254 dev eth0 
153.122.96.0/21 dev eth0  proto kernel  scope link  src 153.122.99.4 
169.254.0.0/16 dev eth0  scope link  metric 1002 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 
172.31.8.0/21 dev eth0  proto kernel  scope link  src 172.31.13.144 
192.168.99.0/24 dev weave  proto kernel  scope link  src 192.168.99.10 

root@test01:~# iptables-save
# Generated by iptables-save v1.4.21 on Tue May 24 20:45:39 2016
*nat
:PREROUTING ACCEPT [2:656]
:INPUT ACCEPT [2:656]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
:WEAVE - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -j WEAVE
-A DOCKER -i docker0 -j RETURN
-A WEAVE -s 192.168.99.0/24 -d 224.0.0.0/4 -j RETURN
-A WEAVE ! -s 192.168.99.0/24 -d 192.168.99.0/24 -j MASQUERADE
-A WEAVE -s 192.168.99.0/24 ! -d 192.168.99.0/24 -j MASQUERADE
COMMIT
# Completed on Tue May 24 20:45:39 2016
# Generated by iptables-save v1.4.21 on Tue May 24 20:45:39 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [93:90389]
:DOCKER - [0:0]
:DOCKER-ISOLATION - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -j ACCEPT
-A INPUT -p udp -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -d 172.17.0.1/32 -i docker0 -p tcp -m tcp --dport 6783 -j DROP
-A INPUT -d 172.17.0.1/32 -i docker0 -p udp -m udp --dport 6783 -j DROP
-A INPUT -d 172.17.0.1/32 -i docker0 -p udp -m udp --dport 6784 -j DROP
-A INPUT -i docker0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i docker0 -p tcp -m tcp --dport 53 -j ACCEPT
-A FORWARD -i docker0 -o weave -j DROP
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -i weave -o weave -j ACCEPT
-A DOCKER-ISOLATION -j RETURN
COMMIT
# Completed on Tue May 24 20:45:39 2016
Dockerコンテナの起動状況
root@test01:~# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                NAMES
963a338fe903        ubuntu:latest                "/bin/bash"              6 minutes ago       Up 6 minutes                             awesome_noyce
8d6a495ea1e0        ubuntu:latest                "/bin/bash"              8 minutes ago       Up 8 minutes        0.0.0.0:80->80/tcp   insane_keller
5fdfa5d771a1        weaveworks/plugin:1.5.1      "/home/weave/plugin"     27 minutes ago      Up 27 minutes                            weaveplugin
9800407af969        weaveworks/weaveexec:1.5.1   "/home/weave/weavepro"   28 minutes ago      Up 28 minutes                            weaveproxy
83e19416b6a4        weaveworks/weaveexec:1.5.1   "/bin/false"             28 minutes ago      Created                                  weavevolumes-1.5.1
4340cecb92e1        weaveworks/weave:1.5.1       "/home/weave/weaver -"   28 minutes ago      Up 28 minutes                            weave
4c5cb99ad7a5        weaveworks/weavedb           "data-only"              28 minutes ago      Created                                  weavedb
root@test01:~# weave ps
weave:expose 72:1f:cd:e9:07:33 192.168.99.10/24
963a338fe903 c2:0e:89:6a:b9:bf 192.168.99.11/24
8d6a495ea1e0 b6:55:46:0e:16:43 192.168.99.10/24

5.1.1 httpdコンテナ

各コンテナには、docker0ブリッジにつながっているeth0インタフェースとweaveブリッジにつながっているethweインタフェースが差し込まれている。
また192.168.99.0/24のパケットとマルチキャストパケットがethwe経由で送信されるように静的routeが設定されている。

httpdコンテナのネットワーク
root@test01:~# docker attach $HTTPD
root@8d6a495ea1e0:/# 
root@8d6a495ea1e0:/# ip addr show
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
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever
12: ethwe@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b6:55:46:0e:16:43 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.99.10/24 scope global ethwe
       valid_lft forever preferred_lft forever
    inet6 fe80::b455:46ff:fe0e:1643/64 scope link 
       valid_lft forever preferred_lft forever
root@8d6a495ea1e0:/# ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.2 
192.168.99.0/24 dev ethwe  proto kernel  scope link  src 192.168.99.10 
224.0.0.0/4 dev ethwe  scope link  mtu lock 1410

ip addr showコマンドでbash: ip: command not foundと表示されたら、apt-get updateをして必要なパッケージやモジュールをインストールしてください。
ipコマンドのパッケージは、apt-get -y install iprouteです。

apache2のインストール
root@8d6a495ea1e0:/# apt-get install apache2 -y
root@8d6a495ea1e0:/# apachectl start

5.1.2 client1コンテナ

client1コンテナのネットワーク
root@test01:~# docker attach $CLIENT1
root@963a338fe903:/# 
root@963a338fe903:/# ip addr show
ip addr show
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@if15: <BROADCAST,MULTICAST,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 link-netnsid 0
    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
16: ethwe@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc pfifo_fast state UP group default qlen 1000
    link/ether c2:0e:89:6a:b9:bf brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.99.11/24 scope global ethwe
       valid_lft forever preferred_lft forever
    inet6 fe80::c00e:89ff:fe6a:b9bf/64 scope link 
       valid_lft forever preferred_lft forever
curlのインストール
root@963a338fe903:/# apt-get install curl -y

5.2 ホスト2

client2コンテナ起動
root@test02:~# CLIENT2=$(weave run 192.168.99.21/24 -d -i -t ubuntu:latest /bin/bash)
root@test02:~# weave expose 192.168.99.21/24
ホスト2のネットワーク状態
root@test02:~# brctl show docker0
bridge name bridge id       STP enabled interfaces
docker0     8000.0242ccc14893   no      veth24d5d04
root@test02:~# brctl show weave
bridge name bridge id       STP enabled interfaces
bridge name bridge id       STP enabled interfaces
weave       8000.de5476ab4fe9   no      vethwe-bridge
                            vethwepl4363
root@test02:~# ip route show
default via 172.31.31.254 dev eth0 
153.122.96.0/21 dev eth0  proto kernel  scope link  src 153.122.99.4 
169.254.0.0/16 dev eth0  scope link  metric 1002 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 
172.31.24.0/21 dev eth0  proto kernel  scope link  src 172.31.27.114 
192.168.99.0/24 dev weave  proto kernel  scope link  src 192.168.99.21 
Dockerコンテナの起動状況
root@test02:~# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
00bf6e9f66f1        ubuntu:latest                "/bin/bash"              3 minutes ago       Up 3 minutes                            tiny_panini
52f5367ccd91        weaveworks/plugin:1.5.1      "/home/weave/plugin"     About an hour ago   Up About an hour                        weaveplugin
694d4665f366        weaveworks/weaveexec:1.5.1   "/home/weave/weavepro"   About an hour ago   Up About an hour                        weaveproxy
6c9e84329487        weaveworks/weaveexec:1.5.1   "/bin/false"             About an hour ago   Created                                 weavevolumes-1.5.1
918e14fc1142        weaveworks/weave:1.5.1       "/home/weave/weaver -"   About an hour ago   Up About an hour                        weave
2f0cf5db8704        weaveworks/weavedb           "data-only"              About an hour ago   Created                                 weavedb
root@test02:~# weave ps
weave:expose de:54:76:ab:4f:e9 192.168.99.21/24
00bf6e9f66f1 0a:03:33:71:a1:81 192.168.99.21/24

5.2.1 client2コンテナ

clent2コンテナのネットワーク
root@test02:~# docker attach $CLIENT2
root@00bf6e9f66f1:/# 
root@00bf6e9f66f1:/# ip addr show 
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
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever
12: ethwe@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 0a:03:33:71:a1:81 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.99.21/24 scope global ethwe
       valid_lft forever preferred_lft forever
    inet6 fe80::803:33ff:fe71:a181/64 scope link 
       valid_lft forever preferred_lft forever
curlのインストール
root@00bf6e9f66f1:/# apt-get install curl -y

6.疎通確認

ここまでで、複数ホストをまたがって敷設された192.168.99.0/24という仮想ネットワーク上に3つのコンテナが起動した。コンテナやホストから疎通確認を行う。

6.1 ホスト1 → httpdコンテナ

httpdコンテナはホスト1上の仮想ブリッジdocker0, weaveに直接つながっているため、eth0を経由せずに通信が行われる。

ping(ホスト1→httpdコンテナ)
root@test01:~# ping -c 3 192.168.99.10
PING 192.168.99.10 (192.168.99.10) 56(84) bytes of data.
64 bytes from 192.168.99.10: icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from 192.168.99.10: icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from 192.168.99.10: icmp_seq=3 ttl=64 time=0.071 ms

--- 192.168.99.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.057/0.065/0.071/0.005 ms
HTTP(ホスト1→httpdコンテナ)
root@test01:~# curl 192.168.99.10

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
    Modified from the Debian original for Ubuntu
    Last updated: 2014-03-19
    See: https://launchpad.net/bugs/1288690
...

6.2 client1コンテナ → httpdコンテナ

client1コンテナとhttpdコンテナは同じ仮想ブリッジdocker0, weaveにつながっているため、eth0を経由せずに通信が行われる。

ping(client1コンテナ→httpdコンテナ)
root@963a338fe903:/# ping -c 3 192.168.99.10
PING 192.168.99.10 (192.168.99.10) 56(84) bytes of data.
64 bytes from 192.168.99.10: icmp_seq=1 ttl=64 time=0.152 ms
64 bytes from 192.168.99.10: icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from 192.168.99.10: icmp_seq=3 ttl=64 time=0.093 ms

--- 192.168.99.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.085/0.110/0.152/0.029 ms

pingコマンドでbash: ping: command not foundと表示されたら、apt-get updateをして必要なパッケージやモジュールをインストールしてください。
ipコマンドのパッケージは、apt-get install iputils-pingです。

HTTP(client1コンテナ→httpdコンテナ)
root@963a338fe903:/# curl 192.168.99.10

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
...

6.3 ホスト2 → httpdコンテナ

同一VLAN上にあるホスト2からのパケットをweaverプロセスがラップしてホスト1のeth0に到達し、ホスト1のweaverプロセスを経由してhttpdコンテナと通信されている。

ping(ホスト2→httpdコンテナ)
root@test02:~# ping -c 3 192.168.99.10
PING 192.168.99.10 (192.168.99.10) 56(84) bytes of data.
64 bytes from 192.168.99.10: icmp_seq=1 ttl=64 time=101 ms
64 bytes from 192.168.99.10: icmp_seq=2 ttl=64 time=1.32 ms
64 bytes from 192.168.99.10: icmp_seq=3 ttl=64 time=1.31 ms

--- 192.168.99.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.311/34.579/101.098/47.036 ms
HTTP(ホスト2→httpdコンテナ)
root@test02:~# curl 192.168.99.10

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
    Modified from the Debian original for Ubuntu
    Last updated: 2014-03-19
...

6.4 client2コンテナ → httpdコンテナ

ホスト2上にあるclient2コンテナからのパケットをweaverプロセスがラップしてホスト1のeth0に到達し、ホスト1のweaverプロセスを経由してhttpdコンテナと通信されている。

ping(client2コンテナ→httpdコンテナ)
root@test02:~# docker attach $CLIENT2
root@00bf6e9f66f1:/# 
root@00bf6e9f66f1:/# ping -c 3 192.168.99.10
PING 192.168.99.10 (192.168.99.10) 56(84) bytes of data.
64 bytes from 192.168.99.10: icmp_seq=1 ttl=64 time=2.01 ms
64 bytes from 192.168.99.10: icmp_seq=2 ttl=64 time=0.666 ms
64 bytes from 192.168.99.10: icmp_seq=3 ttl=64 time=0.670 ms

--- 192.168.99.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.666/1.117/2.017/0.637 ms

pingコマンドでbash: ping: command not foundと表示されたら、apt-get updateをして必要なパッケージやモジュールをインストールしてください。
ipコマンドのパッケージは、apt-get install iputils-pingです。

7.まとめ

Dockerでのマルチホストネットワークとして、基本的な基盤の確認ができました。
docker+consul+swarm(+vxlan)は、Dockerの本体に組み込まれているところを中心な技術でqiitaでの執筆量は、結構ありますが、Docker+Weaveではあまりないようです。
weaveの記事を参考にさせて頂いたnmatsuiさんには感謝です。

8.参考資料

マルチホストDockerネットワーキング(weave)

複数のDockerサーバで独自ネットワークを構築する「Weave」を試す!

Weaveでマルチホストのコンテナ間ネットワークを作ってみる

Dockerコンテナ接続パターン (2014年冬)

(本家の資料)WEAVE NET 1.5.1 DOCUMENTATION

最後に

この検証環境は、某有名なクラウドサービス(ALTUS Basic)のサーバーを、2サーバー(1サーバー1ヶ月500円)借りて検証しました。
次は、weaveを使って、nginx+Webサーバーのスタイルを作ろうと思います。

ありがとうございます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした