Slide 1

Slide 1 text

Docker Networking Rueian docker engine 1.12

Slide 2

Slide 2 text

內建的 Driver • null • bridge • host • macvlan • overlay in swarm

Slide 3

Slide 3 text

Bridge Driver • 預設 bridge driver 在創建網路路的時候會在 linux 上⾯面開⼀一張 interface,可能叫做 br-xxxx,並利利⽤用 iptables NAT 連接外網。 • 當有容器加入該網路路的時候,docker 會為該容器創建⼀一個 linux network namespaces,然後再創建⼀一對互相連接的 veth peer,將其中⼀一個 veth 放置於該 namespace 底下,另外⼀一個 veth 則與 br-xxxx 做 bridge。如此⼀一來來就完成容器的網路路設 定。 • 若若容器有指定 -p 對外開放 port 的話,則是透過 iptables 做 DNAT 達成。

Slide 4

Slide 4 text

關於 Network Namespace & veth pair Network Namespace 可以創建出
 ⼀一個虛擬化的網路路環境。
 Namespace 透過 veth peer 與外界連接。 圖片出處:http://www.slideshare.net/zuan0312/linux-network-namespace

Slide 5

Slide 5 text

預設的 docker0 就是 bridge 圖片來來源:http://www.slideshare.net/MadhuVenugopal2/docker-112-networking-deep-dive

Slide 6

Slide 6 text

試試⼿手動將容器加入 docker0

Slide 7

Slide 7 text

試試⼿手動將容器加入 docker0

Slide 8

Slide 8 text

試試⼿手動將容器加入 docker0 圖片來來源:https://docs.docker.com/v1.8/articles/networking/

Slide 9

Slide 9 text

Host Driver • host network 不會創建 netwrok namespace,也不 會創 veth pair,⽽而是直接使⽤用 host 的 network stack • docker run --net=host busybox ifconfig 可以發現輸 出跟直接在 host 下 ifconfig ⼀一模⼀一樣。

Slide 10

Slide 10 text

Macvlan Driver • 當 docker 需要接入外⾯面 802.1Q vlan 的時候,要⽤用 macvlan driver。 • docker network create -d macvlan 
 --subnet=192.168.50.0/24 
 --gateway=192.168.50.1 
 -o parent=eth0.50 macvlan50 • 需要指定 vlan 對應的 subnet 以及 gateway 還有 parent 的 interface, 利利如 eth0.50 • 如果 docker 找不到 parent interface,則會⾃自動創建。
 若若要⾃自⼰己創則: ip link add link eth0 name eth0.50 type vlan id 50
 不過 docker 可以⾃自動管理理這些 sub interface,就算重開機後 docker 也 可以把這些 interface ⾃自動創建回來來。

Slide 11

Slide 11 text

Macvlan Driver 圖片來來源:https://github.com/docker/libnetwork/blob/master/docs/macvlan.md 將三個容器個別加入到三個 vlan

Slide 12

Slide 12 text

Overlay in Swarm • Overlay network 由 data plane 跟 control plane 組 成。 data plane 負責傳送資料,control plane 負責 保存傳遞 routing 跟 service discovery 訊息。 • 在 docker swarm 中,data plane 封包傳遞採⽤用 vxlan 格式包裝,還可以再套⼀一層 IPSec tunnel 加 密。control plane 採⽤用 Gossip based protocol,使 ⽤用 AES 加密,每⼗十⼆二⼩小時會換 key,且⽤用 decentralize store 保存資訊。

Slide 13

Slide 13 text

Networking in Swarm • swarm 模式開啟時, docker 會先創建⼀一個 docker_gwbridge bridge network,透過 iptables 做 NAT,作為對外的 gateway,跟 docker0 ⼀一樣。 • 除此之外還會創建⼀一個 ingress overlay network,以及 ⼀一個 ingress sbox namespace。所有的 swarm service container 都會加入 ingress overlay network。
 ⽽而這個 ingress sbox 將會透過 ingress overlay network 完成 docker swarm 的 port-publish, routing mesh, loadbalancing 功能。

Slide 14

Slide 14 text

圖片來來源:http://www.slideshare.net/MadhuVenugopal2/docker-112-networking-deep-dive

Slide 15

Slide 15 text

Networking in Swarm • docker service create --replicas 1 \
 -p 8080:80 \
 --network my-overlay \
 nginx • port-publish:
 docker 會將所有 node 的 8080 port 透過 iptables DNAT 設定把流 量量導入各⾃自的 ingress sbox。 • routing mesh + ingress loadbalancing:
 流量量進入 ingress sbox 之後會透過 iptables 打上對應的 firewall mark 再交給 IPVS 去根據 mark 找到 nginx 在 ingress overlay network 的 ip 列列表然後做 RR loadbalancing。

Slide 16

Slide 16 text

圖片來來源:http://www.slideshare.net/MadhuVenugopal2/docker-112-networking-deep-dive

Slide 17

Slide 17 text

Networking in Swarm • 若若想要在 swarm 裡⾯面直接連接內部服務,必須他們 加入同⼀一個非 ingress 的 overlay 網路路。 • 在同⼀一個 overlay 網路路的 container 可以透過 service name 去跟 embedded DNS 查詢 VIP 再透過 iptables 打上 mark 再交給 IPVS 根據 mark 去 RR 存 取服務。

Slide 18

Slide 18 text

圖片來來源:http://www.slideshare.net/MadhuVenugopal2/docker-112-networking-deep-dive

Slide 19

Slide 19 text

參參考 • Docker 1.12 networking deep dive • 簡介 Linux 的 Network Namespace 功能 • Docker libnetwork design • https://github.com/docker/libnetwork/blob/master/docs/macvlan.md • overlay網路路技術之VXLAN詳解 • IPVS 百度 • Swarm mode overview • Understand Docker container networks • https://docs.docker.com/v1.8/articles/networking/