深入淺出容器學習--Docker網路
一.Docker的網路概念
容器網路模型主要包含了三個概念:
-
network:網路,這裡可以理解為一個Driver,是一個第三方網路棧,包含多種網路模式。
- 單主機網路模式(none、host、bridge)
- 多主機網路模式(overlay、macvlan、flannel)
-
sandbox:沙盒,它定義了容器內的虛擬網絡卡、DNS和路由表,是network namespace的一種實現,是容器的內部網路棧。
-
endpoint:端點,用於連線sandbox和network。
這裡,我們可以類比傳統網路模型,將network比作交換機,sandbox比作網絡卡,endpoint比作介面和網線。
二.Docker的網路模式
這裡網路模式包含:
- host模式
- none模式
- bridge模式
- container模式
2.1 host模式
這個相當於Vmvare中的橋接模式,與宿主機在同一個網路中,但是沒有獨立的IP地址。
Docker不會為容器建立獨有的network namespace,使用宿主機預設的網路名稱空間,共享一個網路棧。表現為容器核心宿主機的IP一致。這種模式適用於網路效能要求較高的場景,但網路隔離性不太好。
2.2 bridge模式
橋接模式,這裡相當於Vmvare中的Nat模式。
Docker程序啟動時會建立一個docker0網橋,docker會為容器建立獨有的network namespace,也會為這個名稱空間配置好虛擬網絡卡、路由、DNS、IP地址與iptables規則(也就是sanbox內容)
2.2.1 Docker完成Bridge網路配置詳細說明
1.在主機上建立一堆虛擬網絡卡veth pair裝置。veth裝置總是成對出現的,它們組成了一個數據的通道,資料從一個裝置進入,就會從另一個裝置出來。因此,veth裝置常用來連線兩個網路裝置。
2.Docker將veth pair裝置的一端放在新建立的容器中,並命名為eth0。另一端放在主機中,以veth45h6這樣類似的名字命名,並將這個網路裝置加入到docker0網橋中,可以通過brctl show檢視。
[root@harbor ~]# brctl show bridge name bridge id STP enabled interfaces br-2ba1d6a2e994 8000.02426cb4a81a no veth6a79ace br-8d4b6181687f 8000.0242d8d0780d no docker0 8000.02424dbb4b07 no
3.從docker0子網中分配一個IP給容器使用,並設定docker0的IP地址為容器的預設閘道器。
[root@harbor ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b59058aece1 docker-nexus3:v1 "sh -c ${SONATYPE_DI…" 2 months ago Up 2 months 0.0.0.0:81->8081/tcp nexus3
[root@harbor ~]# docker inspect 4b59058aece1
.......
"Networks": {
"nexus_default": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"4b59058aece1",
"docker_nexus3"
],
"NetworkID": "2ba1d6a2e994bb68c9a9ec000867db8fb14e20c6abcaa95f9399b0d9a270b960",
"EndpointID": "e191fe5833aff25bbc6f71c215a717c5fa6c9f2b62690d94806768a302272129",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": null
}
}
}
}
]
# 檢視nexus_default的bridge network
[root@harbor_reg ~]# docker network inspect nexus_default
[
{
"Name": "nexus_default",
"Id": "2ba1d6a2e994bb68c9a9ec000867db8fb14e20c6abcaa95f9399b0d9a270b960",
"Created": "2020-08-24T10:20:21.947908808+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"4b59058aece184806ecc8d7d2c7c9dd93b24d7d120ea782d5c6909819725fe2d": {
"Name": "nexus3",
"EndpointID": "e191fe5833aff25bbc6f71c215a717c5fa6c9f2b62690d94806768a302272129",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "nexus",
"com.docker.compose.version": "1.23.2"
}
}
]
2.3 none模式
none模式可以說是橋接模式的一種特例,docker會為容器建立獨有的network namespace ,但不會為這個名稱空間準備虛擬網絡卡,IP地址,路由等,需要使用者自己配置。這種網路模式下容器只有lo迴環網路,沒有其他網絡卡。none模式可以在容器建立時通過--network=none來指定。這種型別的網路沒有辦法聯網,封閉的網路能很好的保證容器的安全性。
2.4 container模式
容器共享模式,這種模式是host模式的一種延伸,一組容器共享一個network namespace。對外表現為它們有共同的IP地址,共享一個網路棧。
三.Docker跨主機網路通訊
預設情況下,單臺主機上的Docker容器可以通過docker0網橋直接通訊,而不同主機上的Docker容器之間只能通過在主機上做埠對映進行通訊。這種埠對映方式對許多叢集應用來說非常不方便,如果可以讓Docker容器直接使用自己的IP地址進行通訊可以解決很多問題。這裡按照實現原理可以分為:
- 直接路由模式
- overlay隧道模式(如flannel、ovs+gre)
- 橋接模式(如pipework)
3.1 直接路由
直接在兩側主機增加靜態路由來實現:
ip route add 172.16.1.0/24 via 192.168.20.1
ip route add 172.16.2.0/24 via 192.168.20.2
注意:centos系統需要卡其ip轉發
vim /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
這裡測試兩臺主機的容器跨主機通訊可以參考此博文,相當詳細:https://www.cnblogs.com/xiao987334176/p/10049844.html
3.2 overlay隧道模式
這裡以flannel(flannel+udp或flannel+vxlan)來說明
flannel實現的容器的跨主機通訊過程如下過程實現:
- 每個主機安裝並執行etcd和flannel
- 在etcd中規劃配置所有主機的docker0子網範圍
- 每個主機上的flanneld根據etcd中的配置,為本主機的docker0分配子網,保證所有主機的docker0網段不重複,並將結果(及本主機上的docker0子網資訊和本主機IP的對應關係)儲存到etcd中,這樣etcd就儲存了所有主機上的docker子網資訊和本主機IP的對應關係。
- 當需要與其它主機上的網路進行通訊時,查詢etcd資料庫,找到目的容器的子網所對應的outip(目的宿主機的IP)。
- 將原始資料包封裝在Vxlan或UDP資料包,IP層以outip為目的IP進行封裝。
- 由於目的IP是宿主機IP,因此路由是可達的。
- Vxlan或UDP資料包到達目的宿主機解封裝,解出原始資料包,最終到達目的容器。
3.3 橋接模式
這裡可以通過靜態指定容器的IP為宿主機同一個網路的形式來實現。這裡不做具體說明,可以參考其它博文實現:https://blog.csdn.net/xpt211314/article/details/97375671
參考文件連線:
https://www.jianshu.com/p/22a7032bb7bd
https://zhuanlan.zhihu.com/p/82735394