docker

Docker network 概論

More than 1 year has passed since last update.

Docker network について

Docker で使用される主なネットワークについては以下の通りです。
Docker overlay network の前提知識としてまとめておきました。

Default Networks

Docker をインストールした時に3 つのDocker Network がインストールされます。
それらのDocker network はdocker network ls コマンドを実行することで確認することができます。

dockernetworkls
$ sudo docker network ls 
NETWORK ID          NAME                DRIVER
10aa51e2d993        bridge              bridge
202b87d7b8a4        none                null
92316fc5522f        host                host

これらのNetwork はDocker の実装となっています。
コンテナを起動するときに--net フラグで、コンテナがどのNetwork を使用するかを指定することができます。

none ネットワークについて

Docker_Network0001.png

none ネットワークはnull なネットワークドライバの実装です。
ネットワーク接続を必要としないコンテナを作成する場合に使用されます。
none ネットワークを使用したbusy box コンテナを起動し、コンテナにログインしてネットワークを見てみましょう。

noneネットワークを持ったbusyboxコンテナ
$ 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

Docker_Network0000.png

host ネットワークは、Docker ホストと同じネットワークにスタックするドライバで、Docker ホストマシンと同じネットワークインタフェース、IP アドレスを持つようになります。

hostネットワークを持っているDockerコンテナのインタフェース一覧
$ 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

Docker_Network0002.png

Linux bridge 機能を使った、Linux 上に別ネットワークを使う方式。
Linux bridge で仮想インタフェースを作成し、そのインタフェースに対してveth でDocker コンテナと接続する方式で、Docker ホストが属するネットワークとは異なる、仮想bridge 上のネットワークにコンテナを作成し、NAT 形式で外部のノードと通信する形式です。
Docker のコンテナ作成時に--net オプションを特に何も指定しない場合は、自動的にこれが選択されたものとしてDocker は振る舞います。

bridgeネットワークを持っている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_Network0003.png

Docker overlay network を使うことで異なるL3 上(Docker の場合は異なるDocker ホスト上) に存在するコンテナに対して、同じネットワークに存在するコンテナとして透過的にアクセスすることができるようになります。
なお、このDocker overlay network はVXLAN を使って実装されているため、Docker ホストが異なる拠点やデータセンタに存在しても、そのDocker ホスト上のコンテナは、同じネットワーク上に存在しているものとしてアクセスすることができるようになります。
既にDocker には--link 機能がありますが、それは異なるDocker ホストをまたがって名前解決し、アクセスすることは不可能でした。

overlayネットワークを持っている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