Docker 的網路模式
阿新 • • 發佈:2020-12-11
簡述
網路模式決定了容器之間互聯方式,地址資源的分配空間。
使用的過程中需要根據 容器之間聚合的關係,是否需要隔離網路地址和轉發的效率等方面來選擇適合的網路模型。
dockerd 在啟動的時候,會初始化以下三個不同 driver 模式的網路
NETWORK ID NAME DRIVER SCOPE 24e6af25485a bridge bridge local 3ad8ec491277 host host local 9608b5edcc32 none null local
因為第四種 joined-container
模式需要依託於一個執行時容器,所以並沒有對應的初始網路。
同時由於 bridge 橋接模式需要一個 "閘道器", 所以還會有一個 docker0 虛擬網絡卡在 "宿主機" 上面。
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:7b:1d:8f:e4 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:7bff:fe1d:8fe4/64 scope link valid_lft forever preferred_lft forever
常用的容器網路互連方式:
--link 引數
實際上是使用了環境變數和 hosts 檔案來實現網路通訊,早期的 k8s pod互聯也試用了這種方式。
這種方式已經不被官方推薦。網路應該類似 volume, images, container 在外部管理。
--net -network 引數指定的網路模式,一共有 4 種類別
bridge 橋接模式
橋接網路的網路地址是遞增的,從預設初始的 docker0 的 172.17.0.1/16
開始,建立的橋接網路會以如下命名。
br-<NETWORK_ID> 172.18.0.1/16 br-<NETWORK_ID> 172.19.0.1/16 br-<NETWORK_ID> 172.20.0.1/16
如果建立的容器沒有指定 network 型別,預設就是 docker0 為閘道器的橋接模式。
host 主機模式
使用 --net 設定為 host 的容器,使用 ip addr 等會看到和宿主機一樣的網絡卡情況。
容器並沒有向 bridge 模式那樣有一個私有 IP 地址,而且埠都是和宿主機共用一個地址空間。所以 -p
等埠對映的操作不僅是無效的,還會得到執行失敗和一句警告
WARNING: Published ports are discarded when using host network mode
因為 dockerfile 裡面嘗試使用的埠例如 80 如果在宿主機上已經 bind,例如 nginx 在 host 模式下面是無法啟動的。