Dockerネットワークを触ってみる(1)

Docker1.9において表題の通り。まだよく理解できていないので触ってみることにする。

■ 環境

  • Docker 1.9.0
  • Docker Machine 0.5.0
  • Mac OSX (10.10.5)

■ 現状確認

コンテナを稼働させていない状態でネットワークの状態を確認。

$ docker network ls
NETWORK ID          NAME                DRIVER
f6fb9124ae7f        none                null
d806cfeaef35        host                host
47a46ac1b84b        bridge              bridge
$

3つのネットワークが存在している。`inspect`で詳細を見る。

$ docker network inspect none
[
    {
        "Name": "none",
        "Id": "f6fb9124ae7f......",
        "Scope": "local",
        "Driver": "null",
        "IPAM": {
            "Driver": "default",
            "Config": []
        },
        "Containers": {},
        "Options": {}
    }
]
$
$ docker network inspect host
[
    {
        "Name": "host",
        "Id": "d806cfeaef35......",
        "Scope": "local",
        "Driver": "host",
        "IPAM": {
            "Driver": "default",
            "Config": []
        },
        "Containers": {},
        "Options": {}
    }
]
$
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "47a46ac1b84b......",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {},
        "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"
        }
    }
]
$

名前から推測すると下記の感じであろうか。

  • none : DockerHostとも通信不可、他のコンテナとも通信不可
  • host : DockerHostと通信OK、他のコンテナとは通信不可
  • bridge : DockerHostと通信OK、他のコンテナとも通信OK

そもそもこの3つのネットワークに関しては以前から存在していたはずである。1.9ではこれらに加えて容易にネットワークインターフェースを追加することができるよ、ということなのだろうか。上記の想定が正しいのか確認する。確認する項目は下記。

  1. ネットワークを指定してコンテナを起動
  2. コンテナのネットワーク設定を確認(ifconfig)
  3. コンテナからDockerHostに接続確認
  4. 別ターミナルで同じネットワーク上にコンテナを起動し接続確認

■ none

コンテナを起動する。

$ docker run -ti --rm --net none --name host1 --hostname host1 busybox
/ # ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ #

ループバックインターフェースしか存在しない。これでは他のコンテナはもちろんDockerホストにも接続ができないであろう。

この時の`network inspect`の結果。

$ docker network inspect none
[
    {
        "Name": "none",
        "Id": "f6fb9124ae7f......",
        "Scope": "local",
        "Driver": "null",
        "IPAM": {
            "Driver": "default",
            "Config": []
        },
        "Containers": {
            "5b1c899a7e01......": {
                "EndpointID": "55db1d963bd3......",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
$

■ host

コンテナを起動する。

$ docker run -ti --rm --net host --name host1 --hostname host1 busybox
Error response from daemon: Conflicting options: -h and the network mode (--net)
$

起動すらできなかった。他の指定方法があるのだろうか?とりあえず放置とする。DockerHostとの通信というかファイルのやり取りはコマンド等でも可能であるし。

■ bridge

コンテナを起動する。

$ docker run -ti --rm --net bridge --name host1 --hostname host1 busybox
/ #
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:578 (578.0 B)  TX bytes:578 (578.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ #

ループバック以外に”eth0“が追加されている。DockerHost側から確認する。

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "47a46ac1b84b......",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {
            "6e5ee6c47dcd......": {
                "EndpointID": "8e1d799c3c2a......",
                "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つ目のコンテナを起動する。

$ docker run -ti --rm --net bridge --name host2 --hostname host2 busybox
/ #
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:418 (418.0 B)  TX bytes:418 (418.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ #

再度DockerHost側から確認。

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "47a46ac1b84b......",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {
            "055365403e92......: {
                "EndpointID": "96b8ff42ce0c.......",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "6e5ee6c47dcd......": {
                "EndpointID": "8e1d799c3c2a......",
                "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"
        }
    }
]
$

それぞれコンテナ間の接続も確認する。

/ # hostname
host1
/ #
/ # ping -c 3 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.099 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.077 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.470 ms

--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.077/0.215/0.470 ms
/ #

逆も確認。

/ # hostname
host2
/ #
/ # ping -c 3 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.099 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.129 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.104 ms

--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.099/0.110/0.129 ms
/ #

今回は”–net bridge“のオプションを付けて起動しているが、指定しない場合はデフォルトで”bridge“が使われるようである。

次は作成してネットワーク設定でどういうことができるのかを確認してみることにする。

Dockerネットワークを触ってみる(2)

以上。

■ 関連