容器網路(一)docker容器網路驅動

2022-09-17 18:39:14 字數 4475 閱讀 7056

一、linux網橋和veth pair

1、linux網橋,虛擬的交換機,工作在資料鏈路層,通過學習到mac位址,將資料報**到網橋的不同埠上。

2、veth pair,可以理解為一根虛擬的網線,建立veth pair後,會以兩張虛擬網絡卡的形式成對出現,在其中乙個網絡卡發出的資料報,會直接出現在與它對應的另一張網絡卡上。

二、三種docker網路驅動

docker缺省會建立三種網路,分別為:none、host和bridge,可以通過命令docker network ls檢視

#

docker network ls

network id name driver scope

948cb107a456 bridge bridge local

59932afae000 host host local

d16315c941e2 none null local

1、none網路驅動

none,就是什麼都沒有,在建立容器時,指定引數—network=none,使用ifconfig命令檢視,可以看到只有lo的回環網絡卡。

#

docker run -it --network=none busybox

/ #ifconfig

lo link encap:local loopback

inet addr:127.0.0.1 mask:255.0.0.0up loopback running mtu:65536 metric:1rx packets:0 errors:0 dropped:0 overruns:0 frame:0tx packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000rx bytes:0 (0.0 b) tx bytes:0 (0.0 b)

2、host網路驅動

共享宿主機的網路棧,效能最佳,但是由於共享宿主機的網路棧,也共享了宿主機的網路埠資源。

在筆者的線上環境,為了網路效能,我們使用的就是host模式來部署zabbix server監控。

#

docker run -it --network=host busybox

/ #ifconfig

docker0 link encap:ethernet hwaddr 02:42:44:c8:bf:47inet addr:172.17.0.1 bcast:172.17.255.255 mask:255.255.0.0up broadcast multicast mtu:1500 metric:1rx packets:100 errors:0 dropped:0 overruns:0 frame:0tx packets:100 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0rx bytes:7702 (7.5 kib) tx bytes:11897 (11.6kib)

eth0 link encap:ethernet hwaddr fa:16:3e:38:3c:a1

inet addr:10.30.20.87 bcast:10.30.20.255 mask:255.255.255.0up broadcast running multicast mtu:1500 metric:1rx packets:1016565 errors:0 dropped:0 overruns:0 frame:0tx packets:169554 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000rx bytes:289066541 (275.6 mib) tx bytes:35157980 (33.5mib)

lo link encap:local loopback

inet addr:127.0.0.1 mask:255.0.0.0up loopback running mtu:65536 metric:1rx packets:4 errors:0 dropped:0 overruns:0 frame:0tx packets:4 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000rx bytes:200 (200.0 b) tx bytes:200 (200.0 b)

3、bridge網路驅動

docker服務啟動後,預設有乙個名為docker0的網絡卡,在宿主機上可以用ifconfig檢視到,分配的ip位址是172.17.0.1

#

ifconfig

docker0: flags=4163mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:44:c8:bf:47 txqueuelen 0(ethernet)

rx packets 100 bytes 7702 (7.5kib)

rx errors 0 dropped 0 overruns 0 frame 0tx packets 100 bytes 11897 (11.6kib)

tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

使用bridge建立容器,可以看到容器的eth0網絡卡分配的ip位址是172.17.0.2,閘道器是172.17.0.1

#

docker run -it --network=bridge busybox

/ #ifconfig

eth0 link encap:ethernet hwaddr 02:42:ac:11:00:02inet addr:172.17.0.2 bcast:172.17.255.255 mask:255.255.0.0up broadcast running multicast mtu:1500 metric:1rx packets:0 errors:0 dropped:0 overruns:0 frame:0tx packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0rx bytes:0 (0.0 b) tx bytes:0 (0.0b)

……/ #

route -n

kernel ip routing table

destination gateway genmask flags metric ref use iface

0.0.0.0 172.17.0.1 0.0.0.0 ug 0 0 0eth0

172.17.0.0 0.0.0.0 255.255.0.0 u 0 0 0 eth0

在宿主機上使用brctl show檢視,網橋docker0上「插入」了網絡卡vethc79f4a4,這個就是我們上面提到的veth pair,一端是vethc79f4a4接入網橋docker0,另一端就是容器裡的eth0網絡卡

#

brctl show

bridge name bridge id stp enabled inte***ces

docker0 8000.024244c8bf47 no vethc79f4a4

#ifconfig vethc79f4a4

vethc79f4a4: flags=4163mtu 1500ether 3e:d7:34:58:8b:ea txqueuelen 0(ethernet)

rx packets 0 bytes 0 (0.0b)

rx errors 0 dropped 0 overruns 0 frame 0tx packets 0 bytes 0 (0.0b)

tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0

為什麼docker0分配的ip位址是172.17.0.1?

#

docker network inspect bridge

……

"config

": [

……

我們可以檢視docker0分配的網段是172.17.0.0/16

最終使用網橋建立的容器的網路架構圖如下

Docker 容器網路

所有容器建立時,預設都掛在docker0上,可以在宿主機上使用ifconfig檢視docker0網橋裝置。docker0是乙個linux bridge。docker0網路建立時預設配置了subnet 172.17.0.0 16 建立bridge docker network create drive...

Docker容器網路

docker容器的網路驅動有很多種方式,當安裝docker engine後,docker會在每乙個engine上面生成乙個3種網路,通過命令可以看到是bridge,host和none,而docker官方推薦使用者使用自己的自定義網路,所以在使用容器的時候最好使用自定義的網路,預設docker使用自帶...

容器網路 為docker容器新增網路介面

一 背景 預設情況下容器啟動後只有乙個網路介面,一般外圍為eth0,且其ip位址已經提前分配。有時候我們希望為乙個容器建立多個網路介面,此時可以嘗試如下的方式。二 為容器新增網路介面 1 以預設的網路方式執行乙個容器 docker run name tst add inf it tst img bi...