Docker 1.12のoverlayネットワーク

以前Docker 1.9でのマルチホストネットワークの作成について記事を書きましたが,Docker 1.12になって手順がだいぶ変わったので改めてまとめようと思います.ついでに色々してみました.

結論から言うとDocker 1.12のoverlayネットワークはserviceが定義されたコンテナのみ接続されることが想定されていますが回避も可能です.

まず前の記事を参考にDocker swarmのクラスタを作成します.

  • node1(master) : ip-172-31-1-218

  • node2 : ip-172-31-1-219

  • node3 : ip-172-31-1-217

$ docker node ls
ID                           NAME             MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS
71g9k9xcb78u90r8w6zcer4z0 *  ip-172-31-1-218  Accepted    Ready   Active        Leader
7gg6fa9a7frr3h66widewkjc2    ip-172-31-1-219  Accepted    Ready   Active
em6kz4ijedaj48tfssi7k26l3    ip-172-31-1-217  Accepted    Ready   Active

node1でoverlayNWを作成してみます.

$ docker network create -d overlay backend

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9lapeboarpux        backend             overlay             swarm
af3236af05f2        bridge              bridge              local
1592e8ed2c89        docker_gwbridge     bridge              local
950ee88d8b98        host                host                local
5jq39idymrkq        ingress             overlay             swarm
40051a135237        none                null                local

これでNWは作成されたはずですが,他のホストで確認して見るとこのNWはまだ見えません.

ubuntu@ip-172-31-1-217$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1d3085970cb3        bridge              bridge              local
db8293d930ca        docker_gwbridge     bridge              local
d13db9be8a4c        host                host                local
5jq39idymrkq        ingress             overlay             swarm
a9f1cbd814fa        none                null                local

さらにネットワークを作成したnode1でこのNWに繋がるコンテナを作成しようとすると失敗します.

$ docker run -itd --net=backend busybox
docker: Error response from daemon: network backend not found.

この状態ではまだNWの実体がないんですね.inspectで確認するとサブネットなども設定されていないことがわかります.

$ docker network inspect backend
[
    {
        "Name": "backend",
        "Id": "10kza2wvjm6dz9nzt25jrdygl",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Containers": null,
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "257"
        },
        "Labels": null
    }
]

なのでまずこのNWに紐づくserviceを作成します.これでようやくNWのサブネットやGWが割り当てられ,NWの実体の作成とコンテナのアタッチが行われます.

$ docker service create --name=backend --replicas=5 -p 8000:80/tcp --network=backend redis

$ docker network inspect backend
[
    {
        "Name": "backend",
        "Id": "10kza2wvjm6dz9nzt25jrdygl",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "53b2c41b5b957f5926b48b9517f67b7af833c2c33d1f91023fd80486f83bcd02": {
                "Name": "anotherbackend.1.caomy5tse6gaow0cv6u6vy6rb",
                "EndpointID": "f09a12d8c937b32e9b8707a7e042168ef806372708c4d03cf26152e55b4f0a83",
                "MacAddress": "02:42:0a:00:00:0b",
                "IPv4Address": "10.0.0.11/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "257"
        },
        "Labels": {}
    }
]

これで別のホスト上でもNWが作成されます.

ubuntu@ip-172-31-1-217:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1ul9idog376w        backend             overlay             swarm
1d3085970cb3        bridge              bridge              local
db8293d930ca        docker_gwbridge     bridge              local
d13db9be8a4c        host                host                local
5jq39idymrkq        ingress             overlay             swarm
a9f1cbd814fa        none                null                local

しかしこの状態でもこのNWに繋がるコンテナをserviceの定義なしに作ることはできません.

$ docker run -itd --net=backend busybox
docker: Error response from daemon: swarm-scoped network (backend) is not compatible with `docker create` or `docker run`. This network can be only used docker service.
See 'docker run --help'.

あくまでoverlay NWに繋がるコンテナの作成はserviceの作成とセットになります.

$ docker service create --name=anotherbackend --replicas=5 --network=backend postgres

$ docker network inspect backend
[
    {
        "Name": "backend",
        "Id": "10kza2wvjm6dz9nzt25jrdygl",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "02d3b4a24d99720295539c4c56157e559ec2592c193e1f1ec82c79a265dfd655": {
                "Name": "backend.4.1wbj6bo0ruq87nvdkuswt9xy5",
                "EndpointID": "a248c65b18386464afb2baf4279c6541a9252432b153d7519cdc3fc6abc06654",
                "MacAddress": "02:42:0a:00:00:06",
                "IPv4Address": "10.0.0.6/24",
                "IPv6Address": ""
            },
            "06d638c77e2c3c12178ff6e93a453a3f67f9b7b43ce2d407753acb43e18b5d0e": {
                "Name": "backend.3.9387bpsqnvvyhnugj433ufx32",
                "EndpointID": "47c9969877337f965e742a08809a5065b339f543943cee1241af3f845cf94386",
                "MacAddress": "02:42:0a:00:00:05",
                "IPv4Address": "10.0.0.5/24",
                "IPv6Address": ""
            },
            "53b2c41b5b957f5926b48b9517f67b7af833c2c33d1f91023fd80486f83bcd02": {
                "Name": "anotherbackend.1.caomy5tse6gaow0cv6u6vy6rb",
                "EndpointID": "f09a12d8c937b32e9b8707a7e042168ef806372708c4d03cf26152e55b4f0a83",
                "MacAddress": "02:42:0a:00:00:0b",
                "IPv4Address": "10.0.0.11/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "257"
        },
        "Labels": {}
    }
]

もしもserviceに紐付かないコンテナをNWにどうしても接続したい場合は先にコンテナを作成してからNWにconnectしましょう.

$ docker run -itd busybox
2fda7c0bc0b7f70879c38461b9588f35880be76752ca594a6cd52a220a9ca077

$ docker network connect backend 2fda7c0bc0b7

何故作成時には許されなくて作成後は許されているのかはよく分かりませんが今のところはこれが可能です.
ちなみにdiscponnectも可能です.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2fda7c0bc0b7        busybox             "sh"                     4 minutes ago       Up 4 minutes                            angry_roentgen
53b2c41b5b95        postgres:latest     "/docker-entrypoint.s"   About an hour ago   Up About an hour    5432/tcp            anotherbackend.1.caomy5tse6gaow0cv6u6vy6rb
06d638c77e2c        redis:latest        "docker-entrypoint.sh"   About an hour ago   Up About an hour    6379/tcp            backend.3.9387bpsqnvvyhnugj433ufx32
02d3b4a24d99        redis:latest        "docker-entrypoint.sh"   About an hour ago   Up About an hour    6379/tcp            backend.4.1wbj6bo0ruq87nvdkuswt9xy5

$ docker network disconnect backend 06d638c77e2c

これをすると表面上サービスはscale=5で正しく動いているように見えて実はネットワーク不通のコンテナが発生することになります.
おいおいこれはまずいだろと思わなくもないですが,まあ新機能なのでこれから変わるのでしょう.

$ docker service tasks backend
          ID                         NAME       SERVICE  IMAGE  LAST STATE             DESIRED STATE  NODE
          euwtk7ck34ghknvggea6i1fg2  backend.1  backend  redis  Running About an hour  Running        ip-172-31-1-217
          24z71bl2u2fwebaa04dk2o186  backend.2  backend  redis  Running About an hour  Running        ip-172-31-1-219
実は不通-> 9387bpsqnvvyhnugj433ufx32  backend.3  backend  redis  Running About an hour  Running        ip-172-31-1-218 
          1wbj6bo0ruq87nvdkuswt9xy5  backend.4  backend  redis  Running About an hour  Running        ip-172-31-1-218
          1nt960d8v1vqkl69790yrborb  backend.5  backend  redis  Running About an hour  Running        ip-172-31-1-217

AWS上での悲しい出来事

これでできるはずなんですが,今回AWS上でテストしていることが原因(?)でDNSの名前解決したうえでの疎通がうまく行きませんでした.

$ docker exec -it 53b2c41b5b95 ping -c 3 backend
PING backend (10.0.0.2): 56 data bytes
92 bytes from 53b2c41b5b95 (10.0.0.11): Destination Host Unreachable
92 bytes from 53b2c41b5b95 (10.0.0.11): Destination Host Unreachable
92 bytes from 53b2c41b5b95 (10.0.0.11): Destination Host Unreachable
--- backend ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss

$ docker exec -it 53b2c41b5b95 ping -c 3 10.0.0.11
PING 10.0.0.11 (10.0.0.11): 56 data bytes
64 bytes from 10.0.0.11: icmp_seq=0 ttl=64 time=0.060 ms
64 bytes from 10.0.0.11: icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from 10.0.0.11: icmp_seq=2 ttl=64 time=0.057 ms
--- 10.0.0.11 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.057/0.064/0.076/0.000 ms

あれ!?っと思ったけどそういやなんかissue見たことあるなーと思ったら案の定こちらで報告されてました.
まあそのうち治るでしょう.以前もAWS上でNWの問題があったのでなにか相性が悪いことがあるようです.

広告

Docker 1.12のoverlayネットワーク」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中