2015年1月25日日曜日

Docker Network Configuration

Dockerのネットワーク構成のメモ。

(1) Docker Host
dockerdを起動すると、docker用のローカルインタフェースdocker0ができる。適当なアドレス空間、この場合172.17.0.0/16が割り当てられる。
containerを起動すると各コンテナ毎に仮想ethインタフェースveth(この場合veth88b6e5a)ができる。
$ ifconfig -a
docker0 Link encap:Ethernet HWaddr 56:84:7a:fe:97:99
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::5484:7aff:fefe:9799/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:38 errors:0 dropped:0 overruns:0 frame:0
TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2466 (2.4 KB) TX bytes:2572 (2.5 KB)
......
veth88b6e5a Link encap:Ethernet HWaddr 9e:fa:9d:17:c9:47
inet6 addr: fe80::9cfa:9dff:fe17:c947/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:28 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1866 (1.8 KB) TX bytes:2108 (2.1 KB)
$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0


(2) Docker Container
docker0のネットワーク(172.17.0.0/16)につながるインタフェースeth0がみえる。
root@1365d04a68c9:/# ip addr
1: lo: 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
9: eth0: mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:4/64 scope link
valid_lft forever preferred_lft forever

root@1365d04a68c9:/# ip route
default via 172.17.42.1 dev eth0 

172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.4

(3) Communication btw Containers
Container間で通信を行うためには

  • EXPOSEでポートを公開する。
  • --link container_name:aliase でIPアドレス、ポート情報を取得できるようにする

外部から通信を行うためには-p host_port:container_portを使って、ホスト側のポートをContainerにマップする