CNM
CNM (Container Network Model) 是 Docker 發布的容器網絡標準。也有不是Docker發布的標準,例如CNI.CNI是由以Kubernetes為代表的公司發布的標準。主要還是因為Kubernetes面對的是多容器而不是單容器,所以標準和docker的不一樣,有專門的博客來介紹為什么Kubernetes不選擇CNM作為容器的網絡標準。雖然最后k8s的CNI成為了容器網絡標準,但是libnetwork的容器網絡模式使得pod中容器共享網絡環境成為可能。
libnetwork
Docker網絡部分代碼被抽離并單獨成為了Docker的網絡庫,即libnetwork。
(圖片來自網絡,侵刪)
從上圖可以看到libnetwork和docker daemon之間的關系。Docker daemon通過調用libnetwork對外提供的API完成網絡的創建和管理等功能。libnetwork中則使用了CNM來完成網絡功能的提供。同時也可以看到CNM的三個重要元素:
沙箱(sandbox):沙箱代表一個容器網絡棧的信息。可以對容器的接口、路由和DNS設置等進行管理。沙盒的實現可以是Linux network namespace、FreeBSD Jail或者類似的機制。一個沙盒可以有多個端點和多個網絡。
接入點(Endpoint):接入點將沙箱連接到網絡中,代表容器的網絡接口,接入點的實現通常是 Linux 的 veth 設備。一個接入點只可以屬于一個網絡并且只屬于一個沙箱。
網絡(Network):網絡是一組可以直接互相聯通的接入點。網絡的實現可以是Linux bridge、VLAN等。它將多接入點組成一個子網,并且多個接入點之間可以相互通信。
了解了CNM,接下來我們來認識libnetwork的四種常見網絡模式:
- null 空網絡模式:可以幫助我們構建一個沒有網絡接入的容器環境,以保障數據安全。
- bridge 橋接模式:可以打通容器與容器間網絡通信的需求。
- host 主機網絡模式:可以讓容器內的進程共享主機網絡,從而監聽或修改主機網絡。
- container 網絡模式:可以將兩個容器放在同一個網絡命名空間內,讓兩個業務通過 localhost 即可實現訪問。
(1)null 空網絡模式
空網意味著沒有網絡信息,就是一個單純的沒有連接網絡的一個容器。我們可以使用docker命令來創建一個空網模式的容器來檢查容器內部的網絡信息,首先我們可以先打開正常模式的容器來看一下網絡信息:
/yapi # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:02
inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:597521 errors:0 dropped:0 overruns:0 frame:0
TX packets:1194752 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:126660347 (120.7 MiB) TX bytes:254347460 (242.5 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:38 errors:0 dropped:0 overruns:0 frame:0
TX packets:38 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2362 (2.3 KiB) TX bytes:2362 (2.3 KiB)
/yapi # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.18.0.1 0.0.0.0 UG 0 0 0 eth0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
可以看到里面是有網卡信息eth0,ip也正常展示。接下來我們新建空網模式的容器,再來觀察它的網卡信息和路由信息:
[root@VM-12-13-centos ~]# docker run --net=none -it busybox
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
/ #
可以看到,新建的容器沒有eth0的信息,并且沒有ip信息。這種模式如果不進行特定的配置是無法正常使用的,但是優點也非常明顯,它給了用戶最大的自由度來自定義容器的網絡環境。
(2)bridge 橋接模式
bridge橋接模式是Docker網絡模型中的一種常見網絡模式,它可以讓多個容器之間相互通信,也可以與外部網絡進行通信。在bridge模式下,每個容器都會分配一個唯一的IP地址,并且可以通過容器名稱或者IP地址互相訪問。我們先來了解關于Docker的bridge模式的實現原理。
linux veth 和linux bridge
(圖片來自網絡,侵刪)
docker 的bridge模式就是這樣的,可以看到docker0像一個交換機,把不同的容器連通,是他們可以互相通信。一般我們在使用docker做網絡映射時,通常都加了-p指定端口,用來做容器間的通信或者與容器外部通信。
(3)host 主機網絡模式
host 主機網絡模式讓容器內的進程共享主機的網絡棧,從而使得容器內的應用程序能夠直接與主機和外部網絡進行通信,同時也可以避免了端口映射和NAT等額外的網絡開銷。使用這種模式的時候,libnetwork并不會創建獨立的network namespace。同樣,我們查看host模式下容器內部的網絡信息
[root@VM-12-13-centos ~]# docker run -it --net=host busybox
/ # ip a
1: lo: mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc mq qlen 1000
link/ether 52:54:00:4f:76:46 brd ff:ff:ff:ff:ff:ff
inet 10.0.12.13/22 brd 10.0.15.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe4f:7646/64 scope link
valid_lft forever preferred_lft forever
3: br-85f2d3e30fa7: mtu 1500 qdisc noqueue
link/ether 02:42:3e:54:35:a5 brd ff:ff:ff:ff:ff:ff
inet 172.22.0.1/16 brd 172.22.255.255 scope global br-85f2d3e30fa7
valid_lft forever preferred_lft forever
4: br-c42d4a549c65: mtu 1500 qdisc noqueue
link/ether 02:42:39:a3:4a:26 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-c42d4a549c65
valid_lft forever preferred_lft forever
inet6 fe80::42:39ff:fea3:4a26/64 scope link
valid_lft forever preferred_lft forever
5: docker0: mtu 1500 qdisc noqueue
link/ether 02:42:fd:43:ed:84 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:fdff:fe43:ed84/64 scope link
valid_lft forever preferred_lft forever
6: br-f057a92711b7: mtu 1500 qdisc noqueue
link/ether 02:42:78:b5:0a:b4 brd ff:ff:ff:ff:ff:ff
inet 172.21.0.1/16 brd 172.21.255.255 scope global br-f057a92711b7
valid_lft forever preferred_lft forever
/ #
可以看到容器內的網絡環境與主機完全一致。但是,但是,容器其他方面,如文件系統、進程列表等還是和宿主機隔離的。所以如果是集群規模比較大的情況,還是不是用這種host模式的。
(4)container 網絡模式
container 網絡模式可以將多個容器放在同一個網絡命名空間內。當這些容器需要共享網絡,但其他資源仍然需要隔離時就可以使用 container 網絡模式,例如我們開發了一個 http 服務,但又想使用 nginx 的一些特性,讓 nginx 代理外部的請求然后轉發給自己的業務,這時我們使用 container 網絡模式將自己開發的服務和 nginx 服務部署到同一個網絡命名空間中。
當創建一個新容器時,我們可以使用以下命令將其加入到已存在的網絡命名空間:
docker run -d --name my-nginx1 nginx
docker run -d --name my-nginx2 --network container:my-nginx1 nginx
通過上述命令,我們可以在my-nginx2容器中通過 curl http://localhost來訪問my-nginx1容器的Web服務。在container模式下,所有的容器都共享同一個網絡棧和IP地址,因此它們之間的網絡性能通常比bridge模式更高,但安全性可能會降低。
總結:
- Docker使用CNM為通信標準來完成網絡實現;
- CNM三要素:沙箱(Sandbox)、接入點(Endpoint)、網絡(Network);
- Libnetwork 常見四種網絡模式:null 空網絡模式、bridge 橋接模式、host 主機網絡模式、container 網絡模式;
-
freebsd
+關注
關注
0文章
37瀏覽量
10802 -
VLAN技術
+關注
關注
0文章
45瀏覽量
6400 -
LINUX內核
+關注
關注
1文章
316瀏覽量
21707
發布評論請先 登錄
相關推薦
評論