dockerのnetwork機能を使ってみる

docker v1.9の新機能、ネットワークを@zembutsuさんのスライドを見て、
手元の環境で試してみました。

公式：https://docs.docker.com/v1.5/contributing/devenvironment/
experimental機能を利用する
https://github.com/docker/docker/tree/master/experimental

1.gitからcloneします。

```
#  git clone https://git@github.com/docker/docker
Cloning into 'docker'...
remote: Counting objects: 124196, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 124196 (delta 6), reused 2 (delta 2), pack-reused 124184
Receiving objects: 100% (124196/124196), 74.52 MiB | 303.00 KiB/s, done.
Resolving deltas: 100% (82606/82606), done.
````

````
# cat VERSION
1.10.0-dev
````
2.ここで公式通り、make buildとしたいところですが、このコマンドの中でdockerコマンドを叩いており、まだインストールをしていない段階なので、command not foundとなります。

````
# make build
/bin/sh: docker: command not found
mkdir bundles
/bin/sh: docker: command not found
/bin/sh: docker: command not found
/bin/sh: docker: command not found
docker build -t "docker-dev:master" -f Dockerfile .
/bin/sh: docker: command not found
/bin/sh: docker: command not found
/bin/sh: docker: command not found
/bin/sh: docker: command not found
make: *** [build] Error 127
```

コマンドを使えるようにしたいのでdockerをyumから入れます。

参考：
http://stackoverflow.com/questions/24182901/how-to-set-up-docker-development-environment-on-debian

````
#yum install docker
#systemctl start docker
# make DOCKER_EXPERIMENRAL=1 binary
docker build -t "docker-dev:master" -f Dockerfile .
Sending build context to Docker daemon 108.7 MB
Step 0 : FROM ubuntu:14.04
Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from library/ubuntu
9377ad319b00: Downloading 54.06 MB/65.67 MB
a82f81f25750: Download complete
b207c06aba70: Download complete
d55e68e6cc9c: Download complete
略 この後goのコンパイルが続きます。
`````

yumでインストールしたdockerとgitからcloneしたdockerを入れ替えます。

````
#cd /usr/bin
#mv docker docker.old
#cd /home/vagrant/docker/bundles/1.10.0-dev/binary/
#cp docker-1.10.0-dev /usr/bin/
#mv docker-1.10.0-dev docker
`````

これでdockerが使えるようになったので、適当なimageをpullします。

````
# docker pull ansible/centos7-ansible
# docker images
  REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
  ansible/centos7-ansible   latest              fb3ef4e58b05        29 minutes ago      416.1 MB
  docker-dev                master              b120a2605ece        About an hour ago   1.774 GB
  docker.io/ubuntu          14.04               d59bdb51bb5c        5 days ago          187.9 MB
````

pullしたansible imageをrunし、デフォルトのネットワークを確認します。

````
# docker run -it ansible/centos7-ansible
# ip a
  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
  eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
      link/ether 02:42:ac:11:00:01 brd ff:ff:ff:ff:ff:ff
      inet 172.17.0.1/16 scope global eth0
         valid_lft forever preferred_lft forever
      inet6 fe80::42:acff:fe11:1/64 scope link
         valid_lft forever preferred_lft forever
````

また、ホストの通常時のネットワークを確認します。

````
# docker network ls
NETWORK ID          NAME                DRIVER
f2d8bed96ec7        none                null
55a5cd67c642        host                host
abd8037d618e        bridge              bridge

````

hogeネットワークを作ります。

`````
# docker network create hoge
787e10bb2e6f309845f7df34806fc68f8d9e5bcb1c056197aad8b5bd9361ed0e
# docker network ls
NETWORK ID          NAME                DRIVER
787e10bb2e6f        hoge                bridge
f2d8bed96ec7        none                null
55a5cd67c642        host                host
abd8037d618e        bridge              bridge

`````

hogeネットワークの詳細をinspectオプションで確認

`````
# docker network inspect hoge
[
    {
        "Name": "hoge",
        "Id": "5c18c10469063f396a50f699e4b0a75ae0036f55da190b7447726d8a51334eb1",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {},
        "Options": {}
    }
]
`````

このように起動すると、hogeネットワークを使える。

`````
#docker run --net=hoge -it ansible/centos7-ansible
# ip a
 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
  eth0: <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 eth0　★
        valid_lft forever preferred_lft forever
     inet6 fe80::42:acff:fe12:2/64 scope link
        valid_lft forever preferred_lft forever

# cat /etc/hosts
172.18.0.2      42bbea885190
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

`````

 上で設定したネットワークをホスト側から見てみる。


`````

# docker network inspect hoge
[
    {
        "Name": "hoge",
        "Id": "5c18c10469063f396a50f699e4b0a75ae0036f55da190b7447726d8a51334eb1",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {
            "42bbea885190484a555cf7785adbae50ccdd05590ba8737b006a63f78ed88177": {
                "Name": "jovial_mahavira",
                "EndpointID": "ccb7c7eb3b908a55d4e4825724e084d160b89e35ea9ddaf624acbf95cbdb882c",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
``````

もう１つ、ansible/centos7-ansibleを別のターミナルで開き、172.18.0.3のIPが振られていることを確認する。

`````
# ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.065 ms

`````
172.17.0.2から疎通できる。ホスト間通信ができる。

docker swarmを使わないでoverlayNWは作れないぽい。
http://qiita.com/ma2saka/items/bd4a846bdb5a4ee75d42
https://docs.docker.com/swarm/discovery/