Dockerで自由なネットワーク構成を組む


# はじめに
- VMバリにdockerを使いたいので、ネットワークを自由に構成する方法を調べてみた。

- 利用した環境は下記の通り

```bash
$ docker version
Client:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.4.3
 Git commit:   76d6bc9
 Built:        Tue Nov  3 19:20:09 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.4.3
 Git commit:   76d6bc9
 Built:        Tue Nov  3 19:20:09 UTC 2015
 OS/Arch:      linux/amd64
```

# docker network

- なんか1年位前はpipeworkとかを使った記憶があったけど、標準で行けそうなコマンドを発見。前あったかどうかは不明。

```bash
$ docker network --help

Usage:	docker network [OPTIONS] COMMAND [OPTIONS]

Commands:
  ls                       List all networks
  rm                       Remove a network
  create                   Create a network
  connect                  Connect container to a network
  disconnect               Disconnect container from a network
  inspect                  Display detailed network information

Run 'docker network COMMAND --help' for more information on a command.

  --help=false       Print usage
```

## ネットワーク一覧
- 兎にも角にも一覧を見てみる。標準だとこんな感じのご様子。

```bash
$ docker network ls
NETWORK ID          NAME                DRIVER
3ded1f7d73bf        bridge              bridge
e98e51648711        none                null
a4cd229ed4eb        host                host
```

- bridgeから詳しく見てみる。ちなみに現段階で2台位コンテナが上がってる。

```bash
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "3ded1f7d73bf634cf1802903182ca35b2e5dbb3be7fc06cfb6ca706e2905e5ce",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.17.0.1/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Containers": {
            "7503c9bd3f7b3c1e694c89b6a5d0950c5b479c4a5b7e7d5a56f2bdc6769dab3d": {
                "EndpointID": "3e4080dacbef993e4d9583edf1d336a29cb7c25c050fd34c67a10a63b0e554d3",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "eaed0415fcd6c368d39591586508dc4348ae80ad65fedd49c4fc7dc1cda39912": {
                "EndpointID": "b55b1939903d6451927529963e78b226d598aa80d0f64c4f4346f81b4abe9e68",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        }
    }
]
```

- デフォルトで立ち上げたコンテナ2台はこのネットワークに属している様子。
- bridgeという種類だけあって、ホストOSとの通信も可能だった。
- なんとなく一通りのことは設定できそう。
- scopeパラメータが気になる。L2 over L3ができそう。後述する。


## ネットワークの作成

- とりあえず1つ新しいネットワークを作成してみる。

```bash
$ docker network create -d bridge isolated_nw
f13de5c6af5e5069511dedc763411c574d911ba5f8cfbf43e7d3bb6e9c84366b
$
$
$ docker network inspect isolated_nw
[
    {
        "Name": "isolated_nw",
        "Id": "f13de5c6af5e5069511dedc763411c574d911ba5f8cfbf43e7d3bb6e9c84366b",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {},
        "Options": {}
    }
```

- optionは下記の様に指定できる。

```bash
$ docker network create -d bridge --gateway=192.168.100.254 --subnet=192.168.100.0/24 --ip-range=192.168.100.48/28 isolated_nw2
551e659db3c66a69b6dffcf642a097a36211fb9cf5b846969c970782be2f6c06
```

- --gateway ゲートウェイを指定する
- --subnet ネットワークのサブネットを指定する。CIDR表記で渡す。
- --ip-range コンテナに割り当てるIPアドレス帯をCIDR表記で渡す。

```bash
$ docker network inspect isolated_nw2[
    {
        "Name": "isolated_nw2",
        "Id": "551e659db3c66a69b6dffcf642a097a36211fb9cf5b846969c970782be2f6c06",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "192.168.100.0/24",
                    "IPRange": "192.168.100.48/28",
                    "Gateway": "192.168.100.254"
                }
            ]
        },
        "Containers": {},
        "Options": {}
    }
]
```

- いまのところ
- isolated_nw サブネットなどIPは定義されていない
- isolated_nw2 サブネットまで自前で定義
- の2つのネットワークがある状態となる。

## ネットワークへの接続

- コンテナ一覧

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7503c9bd3f7b        centos:7            "bash"              54 minutes ago      Up 54 minutes                           grave_bhaskara
eaed0415fcd6        centos:7            "bash"              35 hours ago        Up 35 hours                             agitated_mcclintock
```

- 1つ目の「grave_bhaskara」にisolated_nwをネットワークをくっつけてみる

```bash
$ docker network connect isolated_nw grave_bhaskara
$ docker network inspect isolated_nw
[
    {
        "Name": "isolated_nw",
        "Id": "f13de5c6af5e5069511dedc763411c574d911ba5f8cfbf43e7d3bb6e9c84366b",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {
            "7503c9bd3f7b3c1e694c89b6a5d0950c5b479c4a5b7e7d5a56f2bdc6769dab3d": {
                "EndpointID": "f64bb44990dfed24bebc0fbca91cd3aedbb97435e233aeeaf91d3c7758071e64",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
```

- さらにisolated_nw2を接続する。

```bash
$ docker network connect isolated_nw2 grave_bhaskara
$ docker network inspect isolated_nw2
[
    {
        "Name": "isolated_nw2",
        "Id": "551e659db3c66a69b6dffcf642a097a36211fb9cf5b846969c970782be2f6c06",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "192.168.100.0/24",
                    "IPRange": "192.168.100.48/28",
                    "Gateway": "192.168.100.254"
                }
            ]
        },
        "Containers": {
            "7503c9bd3f7b3c1e694c89b6a5d0950c5b479c4a5b7e7d5a56f2bdc6769dab3d": {
                "EndpointID": "e046f206f19cf1cd37ea23ad654243c0879b5cffb1352ce517b04ec0162701ae",
                "MacAddress": "02:42:c0:a8:64:31",
                "IPv4Address": "192.168.100.49/24",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
```

- コンテナに接続して内部から見てみる

```bash
$ docker attach grave_bhaskara

[root@7503c9bd3f7b /]# ip addr show
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
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    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
24: eth2@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 scope global eth2
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:2/64 scope link
       valid_lft forever preferred_lft forever
26: eth3@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:c0:a8:64:31 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.49/24 scope global eth3
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c0ff:fea8:6431/64 scope link
       valid_lft forever preferred_lft forever
```
- eth2にisolated_nw, eth3にisolated_nw2らしきものがついていることがわかる。
- eth1は別のネットワーク一回つけて外したりしてたからその影響で出ていない。

```bash
[root@7503c9bd3f7b /]# ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.080 ms
^C
--- 172.18.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.046/0.057/0.080/0.018 ms
```

- となるので、ネットワーク作成時にオプションをしていない場合は、先頭のアドレスがゲートウェイIPとして作成される模様。

- ちなみにコンテナのルーティングはこんな感じ。

```bash
[root@7503c9bd3f7b /]# ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.3
172.18.0.0/16 dev eth2  proto kernel  scope link  src 172.18.0.2
192.168.100.0/24 dev eth3  proto kernel  scope link  src 192.168.100.49

[root@7503c9bd3f7b /]# traceroute 192.168.99.1
traceroute to 192.168.99.1 (192.168.99.1), 30 hops max, 60 byte packets
 1  172.17.0.1 (172.17.0.1)  0.045 ms  0.011 ms  0.007 ms
 2  192.168.99.1 (192.168.99.1)  0.207 ms  0.165 ms  0.126 ms
```


- ここまででわかったことを絵として整理すると、下記の様な構成になっていると思われる。

![container_nw01.png](https://qiita-image-store.s3.amazonaws.com/0/99704/71571fdd-92b4-76cd-d92d-b1c17381c4a6.png "container_nw01.png")

# Multihost networking
- さて、ここまでわかったところで、複数VM上で動いているコンテナを同じネットワークで通信させてみたい。
- 大体こんなイメージになる予定。赤いセグメントが同じL3ネットワーク。

![container_nw02.png](https://qiita-image-store.s3.amazonaws.com/0/99704/6db52b5c-feb6-909c-4304-cb9c2e88f5ba.png "container_nw02.png")

- 以下dockerのドキュメントをそのまま写経。

## Key-Valueストアを作成する

- mh-keystoreというVirtualBoxを作成

```bash
$ docker-machine create -d virtualbox mh-keystore
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Provisioning created instance...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
To see how to connect Docker to this machine, run: docker-machine env mh-keystore
```

- このkey-valueストアはConsul, Etcd, ZooKeeperに対応している。
- 例ではdockerhubにあるConsulのboxを利用。

``` bash
$ docker $(docker-machine config mh-keystore) run -d \
>     -p "8500:8500" \
>     -h "consul" \
>     progrium/consul -server -bootstrap
Unable to find image 'progrium/consul:latest' locally
latest: Pulling from progrium/consul

3b4d28ce80e4: Pull complete
e5ab901dcf2d: Pull complete
30ad296c0ea0: Pull complete
3dba40dec256: Pull complete
f2ef4387b95e: Pull complete
53bc8dcc4791: Pull complete
75ed0b50ba1d: Pull complete
17c3a7ed5521: Pull complete
8aca9e0ecf68: Pull complete
4d1828359d36: Pull complete
46ed7df7f742: Pull complete
b5e8ce623ef8: Pull complete
049dca6ef253: Pull complete
bdb608bc4555: Pull complete
8b3d489cfb73: Pull complete
c74500bbce24: Pull complete
9f3e605442f6: Pull complete
d9125e9e799b: Pull complete
Digest: sha256:8cc8023462905929df9a79ff67ee435a36848ce7a10f18d6d0faba9306b97274
Status: Downloaded newer image for progrium/consul:latest
9d0d0eb96bb24d018dce219926d462424e064bfa9d1bd8139bda3c31c9134235
```

- ちゃんと動作しているか確認する。

```bash
$ eval "$(docker-machine env mh-keystore)"
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                                                            NAMES
9d0d0eb96bb2        progrium/consul     "/bin/start -server -"   About a minute ago   Up About a minute   53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp   insane_mcclintock
```

## Swarmクラスタを作成する
- SwarmはDockerクラスタを作成するための実装。
- 詳しいことはここでは触れず、とりあえず組んでみる。

- 1号機の作成

```bash
$ docker-machine create \
> -d virtualbox \
> --swarm --swarm-image="swarm" --swarm-master \
> --swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
> --engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
> --engine-opt="cluster-advertise=eth1:2376" \
> mhs-demo0
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Provisioning created instance...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Configuring swarm...
To see how to connect Docker to this machine, run: docker-machine env mhs-demo0
```

- 2号機の作成

```bash
$ docker-machine create -d virtualbox \
>     --swarm --swarm-image="swarm:1.0.0-rc2" \
>     --swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
>     --engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
>     --engine-opt="cluster-advertise=eth1:2376" \
>   mhs-demo1
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Provisioning created instance...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Configuring swarm...
To see how to connect Docker to this machine, run: docker-machine env mhs-demo1
```

- 作成後の確認

```bash
$ docker-machine ls
NAME          ACTIVE   DRIVER       STATE     URL                         SWARM
default       -        virtualbox   Running   tcp://192.168.99.100:2376
mh-keystore   *        virtualbox   Running   tcp://192.168.99.102:2376
mhs-demo0     -        virtualbox   Running   tcp://192.168.99.103:2376   mhs-demo0 (master)
mhs-demo1     -        virtualbox   Running   tcp://192.168.99.104:2376   mhs-demo0
```

## Overlayネットワークの作成
- やっと本論
- 1号機に入って、クラスタ情報の確認

```bash
$ eval $(docker-machine env --swarm mhs-demo0)
$ docker info
Containers: 3
Images: 2
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
 mhs-demo0: 192.168.99.103:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs
 mhs-demo1: 192.168.99.104:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs
CPUs: 2
Total Memory: 2.043 GiB
Name: dd559ef9a9a0
```

- ここでネットワーク情報を見ると、両方のネットワークが見える。
- ここには記載しないが、もう片方のVMでも同じ結果が返る。

```bash
$ docker network ls
NETWORK ID          NAME                DRIVER
a2f0bf73fe04        mhs-demo1/host      host
c54eeb866199        mhs-demo1/bridge    bridge
ad24cc1f7c67        mhs-demo0/bridge    bridge
4ee522eb9e50        mhs-demo0/none      null
1f44eb3f6bb5        mhs-demo0/host      host
1ecae89cb7f3        mhs-demo1/none      null
```

- Overlayネットワークを定義。
- ちょっとここはパラメータも設定するように変更を加えている。

```bash
$ docker network create --driver=overlay --gateway=10.0.0.254 --subnet=10.0.0.0/24 myoverlay
ddc210fbc114e17007364304d4694ad6bd916d604cc7130aa596bb0d74da1088
```

- 作成の確認

```bash
$ docker network ls
NETWORK ID          NAME                DRIVER
c54eeb866199        mhs-demo1/bridge    bridge
1ecae89cb7f3        mhs-demo1/none      null
ddc210fbc114        myoverlay           overlay
ad24cc1f7c67        mhs-demo0/bridge    bridge
4ee522eb9e50        mhs-demo0/none      null
1f44eb3f6bb5        mhs-demo0/host      host
a2f0bf73fe04        mhs-demo1/host      host
```

- 詳細も確認。scopeがglobalになっている。

```bash
$ docker network inspect myoverlay
[
    {
        "Name": "myoverlay",
        "Id": "ddc210fbc114e17007364304d4694ad6bd916d604cc7130aa596bb0d74da1088",
        "Scope": "global",
        "Driver": "overlay",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.254"
                }
            ]
        },
        "Containers": {},
        "Options": {}
    }
]
```

## コンテナの接続

- mhs-demo0に接続したまま、コンテナを1つ立ち上げる。

```bash
$ docker run -it --rm --net=myoverlay --env="constraint:node==mhs-demo1" centos:7 bash
```

その後、インタフェースを確認すると

```bash
[root@431da5667795 /]# ip addr show
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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP
    link/ether 02:42:0a:00:00:01 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aff:fe00:1/64 scope link
       valid_lft forever preferred_lft forever
14: eth1@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:2/64 scope link
       valid_lft forever preferred_lft forever
```

- さらにもう1つ、今度はdemo0側に立ち上げる
- 別のターミナルを立ち上げ、下記を実行し、コンテナをもう1つ作成する。

```bash
$ eval $(docker-machine env --swarm mhs-demo0)
$ docker run -it --rm --net=myoverlay --env="constraint:node==mhs-demo0" centos:7 bash
```

- ログインしたコンテナ内のインタフェースを確認する。

```bash
[root@764922b8a219 /]# ip addr show
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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aff:fe00:2/64 scope link
       valid_lft forever preferred_lft forever
16: eth1@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:2/64 scope link
       valid_lft forever preferred_lft forever
```

- 謎のeth1がついているが、これを追求する前にまずはoverlay経由で接続できることを確認したい。
- 念のため、もう1つのターミナルを立ち上げ、それぞれのコンテナが別のホスト上にいることを確認する。

```bash
$ eval $(docker-machine env --swarm mhs-demo0)
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
764922b8a219        centos:7            "bash"              2 minutes ago       Up 2 minutes                            mhs-demo0/nostalgic_bell
431da5667795        centos:7            "bash"              5 minutes ago       Up 5 minutes                            mhs-demo1/distracted_chandrasekhar
```

- 次にどちらかのコンテナに潜入し、pingを打つ。今回はmhs-demo0/nostalgic_bell側より行う。

```bash
$ docker attach mhs-demo0/nostalgic_bell
```

```bash
[root@764922b8a219 /]# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.601 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=1.02 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=1.06 ms
^C
--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 0.601/0.896/1.062/0.210 ms
```

- ちゃんと疎通とれました！

## 謎インタフェースの正体

- おもむろに下記コマンドを叩く

```bash
$ docker network ls
NETWORK ID          NAME                        DRIVER
c54eeb866199        mhs-demo1/bridge            bridge
1f44eb3f6bb5        mhs-demo0/host              host
20bb3a4f7b7d        mhs-demo0/docker_gwbridge   bridge
4ee522eb9e50        mhs-demo0/none              null
1ecae89cb7f3        mhs-demo1/none              null
a2f0bf73fe04        mhs-demo1/host              host
57d603c8f9a0        mhs-demo1/docker_gwbridge   bridge
ddc210fbc114        myoverlay                   overlay
ad24cc1f7c67        mhs-demo0/bridge            bridge
```

- なんか増えてる・・・
- mhs-demo[0-1]/docker_gwbridge

- 例のドキュメントを漁ったところ、自動的に付与される外部との接続性を持たせるネットワークであることが判明。
- つまり、overlay側からは外部に抜けられないということか？
- gateway ipまでは疎通が取れていたので、それ以降を確認したいが、ルーティングの変更が効かない

- とりあえずgwbridgeネットワークを外してみる。

```bash
$ docker network disconnect mhs-demo1/docker_gwbridge distracted_chandrasekhar
Error response from daemon: container 431da56677956945a0dbca802c35604ff06339953d7e8e58b34b05fc2cb68e0c failed to leave network docker_gwbridge: container 431da56677956945a0dbca802c35604ff06339953d7e8e58b34b05fc2cb68e0c: endpoint create on GW Network failed: service endpoint with name gateway_431da5667795 already exists
```

- なんかエラーになるが、コンテナ上から見る限り外れている。

- が、やっぱりルーティングの変更ができない・・・
- でもここの話題とはまた別で追求するものにする。

## 最終的な構成
- 最終的に出来たネットワークはこんなイメージ。

![container_nw03.png](https://qiita-image-store.s3.amazonaws.com/0/99704/f1ad7671-0fa7-0000-bdae-ddb65f6b799e.png "container_nw03.png")

- overlayに設定したgateway ipだけ正確に確認できていない。

# 結論
- 結構簡単にネットワークを切ったり外したりできる。
- きっとそのうち、vSphereみたいないい感じのUIとかも出てくるんだろうなぁと思った。
- 前やった時はopen vSwitch使ってVXLANしたけど、随分簡単に組めるようになったなぁ、という印象。
- 今回未解決の話題についてはまた別途検討する。

# 参考
- http://docs.docker.com/engine/userguide/networking/