1. 程式人生 > 實用技巧 >深入淺出容器學習--Docker網路

深入淺出容器學習--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