1. 程式人生 > 實用技巧 >Docker 的網路模式

Docker 的網路模式

簡述

網路模式決定了容器之間互聯方式,地址資源的分配空間。
使用的過程中需要根據 容器之間聚合的關係,是否需要隔離網路地址和轉發的效率等方面來選擇適合的網路模型。

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

常用的容器網路互連方式:

實際上是使用了環境變數和 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 模式下面是無法啟動的。

none

joined-container 聯合容器