Docker network について
Docker で使用される主なネットワークについては以下の通りです。
Docker overlay network の前提知識としてまとめておきました。
Default Networks
Docker をインストールした時に3 つのDocker Network がインストールされます。
それらのDocker network はdocker network ls
コマンドを実行することで確認することができます。
$ sudo docker network ls
NETWORK ID NAME DRIVER
10aa51e2d993 bridge bridge
202b87d7b8a4 none null
92316fc5522f host host
これらのNetwork はDocker の実装となっています。
コンテナを起動するときに--net
フラグで、コンテナがどのNetwork を使用するかを指定することができます。
none ネットワークについて
none ネットワークはnull なネットワークドライバの実装です。
ネットワーク接続を必要としないコンテナを作成する場合に使用されます。
none ネットワークを使用したbusy box コンテナを起動し、コンテナにログインしてネットワークを見てみましょう。
$ docker run --name none_net_busybox --net=none -ti busybox /bin/sh
/ # cat /etc/hosts
127.0.0.1 localhost
<dl>
<dd>:1 localhost ip6-localhost ip6-loopback</dd>
</dl>
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
/ #
/ # 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)
/ #
すると、loopback インタフェースのみがあるコンテナが作成されていることがわかります。
host
host ネットワークは、Docker ホストと同じネットワークにスタックするドライバで、Docker ホストマシンと同じネットワークインタフェース、IP アドレスを持つようになります。
$ docker run --name host_net_busybox --net=host -ti busybox /bin/sh
/ #
/ # ifconfig
docker0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::x/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:19888 errors:0 dropped:0 overruns:0 frame:0
TX packets:19314 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3063342 (2.9 MiB) TX bytes:29045336 (27.6 MiB)
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.1.121 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::x/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:135513 errors:0 dropped:0 overruns:0 frame:0
TX packets:109723 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:102680118 (97.9 MiB) TX bytes:22766730 (21.7 MiB)
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:230 errors:0 dropped:0 overruns:0 frame:0
TX packets:230 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:37871 (36.9 KiB) TX bytes:37871 (36.9 KiB)
/ #
bridge
Linux bridge 機能を使った、Linux 上に別ネットワークを使う方式。
Linux bridge で仮想インタフェースを作成し、そのインタフェースに対してveth でDocker コンテナと接続する方式で、Docker ホストが属するネットワークとは異なる、仮想bridge 上のネットワークにコンテナを作成し、NAT 形式で外部のノードと通信する形式です。
Docker のコンテナ作成時に--net
オプションを特に何も指定しない場合は、自動的にこれが選択されたものとしてDocker は振る舞います。
tsutomu@swmgr01:~$ docker run --name bridge_net_busybox -ti busybox /bin/sh
/ #
/ # ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
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:40 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6558 (6.4 KiB) TX bytes:508 (508.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)
/ #
/ # exit
user@dockerhost:~$ ifconfig docker0
docker0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:a2ff:fe10:ccf7/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:30 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:480 (480.0 B) TX bytes:5025 (5.0 KB)
overlay network
Docker overlay network を使うことで異なるL3 上(Docker の場合は異なるDocker ホスト上) に存在するコンテナに対して、同じネットワークに存在するコンテナとして透過的にアクセスすることができるようになります。
なお、このDocker overlay network はVXLAN を使って実装されているため、Docker ホストが異なる拠点やデータセンタに存在しても、そのDocker ホスト上のコンテナは、同じネットワーク上に存在しているものとしてアクセスすることができるようになります。
既にDocker には--link
機能がありますが、それは異なるDocker ホストをまたがって名前解決し、アクセスすることは不可能でした。
/ # ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:10.0.9.3 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:903/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:15 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1206 (1.1 KiB) TX bytes:648 (648.0 B)
eth1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe12:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:50 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6538 (6.3 KiB) TX bytes:648 (648.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)
参考
- Understand Docker container networks
- https://docs.docker.com/engine/userguide/networking/dockernetworks/
- VXLAN とは
- http://www.infraexpert.com/study/virtual3.html