Docker 網絡類型
1、Docker四種網絡模式
(1)docker四種網絡模式如下:
- Bridge contauner 橋接式網絡模式
- Host(open) container 開放式網絡模式
- Container(join) container 聯合掛載式網絡模式,是host網絡模式的延伸
- None(Close) container 封閉式網絡模式
(2)可以通過docker network
命令查看
(3)docker run --net
命令可以指定使用網絡模式
2、Bridge模式
當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,處于七層網絡模型的數據鏈路層,起到了交換機的作用,此主機上啟動的Docker容器會連接到這個虛擬網橋上, 所以有默認地址172.17.0.0/16的地址。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。
從docker0子網中分配一個IP給容器使用,并設置docker0的IP地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair設備,Docker將veth pair設備的一端放在新創建的容器中,并命名為eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,并將這個網絡設備加入到docker0網橋中。可以通過brctl show命令查看。
這個命令在bridge-utils中,需要提前安裝 apt install bridge-utils
bridge模式是docker的默認網絡模式,不寫–net參數,就是bridge模式。
使用docker run -p時,docker實際是在iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL
查看。
容器擁有獨立的network namespace,且擁有獨立的IP、端口、路由等,使用veth pair連接docker0網橋,并以dockero網橋為默認網關。
說明:
- –net=bridge 可省略 ,-p 指定端口映射
- 虛擬網橋默認 IP 范圍是一般都是 172.17.x.x
DNAT 的概念
DNAT,全稱 Destination NAT,就是在數據包進入網絡層時,把 目標 IP 地址 或 目標端口號 改成另外一個地址或端口。
-
D → Destination(目的地址)
-
NAT → Network Address Translation(網絡地址轉換)
常見用途:
-
端口映射(Port Forwarding)
-
負載均衡(把外部請求轉發到后端多臺服務器)
-
Docker 容器端口轉發(宿主機端口 → 容器端口)
3、host模式
如果給容器指定為host模式,那么該容器就沒有獨立的network namespace,而是共用宿主機的。所以,容器不會有自己的網卡信息,而是使用宿主機的IP和端口。但除了網絡,其他像文件系統、進程等和宿主機依然是隔離的。
注意:容器和宿主機公用一個IP地址,但使用的端口不能被宿主機占用,也不能相同。
4、None模式
在None模式下,容器有自己的Network Namespace,但是并不為Docker 容器進行任何網絡配置。也就是說,這個Docker 容器沒有網卡,ip, 路由等信息。
這種類型沒有辦法聯網,但是封閉的網絡能很好的保證容器的安全性,該容器將完全獨立于網絡,用戶可以根據需要為容器添加網卡。此模式擁有所有端口。特殊情況下才會用到,一般不用。
5、container模式
這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。
新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP,端口范圍等。
可以在一定程度上節省網絡資源,容器內部依然不會擁有所有端口。同樣,兩個容器除了網絡方面,其他的如文件系統,進程列表等還是隔離的。
兩個容器的進程可以通過網卡設備通信。
新建的容器與指定容器共享IP地址,但不能使用相同的端口。
以上四種網絡模式只考慮的是容器和宿主機、容器和容器之間的通信,只能在同一臺機器里,不能跨主機通信。
6、overlay模式–》實現跨宿主機的docker之間的通信
底層原理是VXLAN.
7、自己動手新建一個網絡接口sc,讓新建的容器連接到這個接口上來
docker inspect sc-nginx-1
查看容器詳情
使用iptables 查看
ip add
命令輸出詳解
ip add
輸出展示了主機上的 所有網絡接口(物理的 + 虛擬的),包括 Docker 創建的虛擬網絡。
1. lo
-
名字:
lo
-
類型:回環接口(Loopback)
-
作用:本地環回測試使用,IP 地址
127.0.0.1
或::1
,用于進程之間本機通信,不經過物理網卡。
2. ens33
-
名字:
ens33
-
類型:物理網卡(Ethernet 接口)
-
作用:主機真實的網絡接口,連接到你所在的物理網絡/虛擬機 NAT/橋接環境。
-
IPv4 地址:
192.168.237.177/24
,說明主機在192.168.237.0/24
網段。
3. docker0
-
名字:
docker0
-
類型:Docker 默認創建的 Linux 橋接網卡(bridge)
-
作用:當容器使用默認網絡(bridge 網絡模式)時,容器的虛擬網卡都會掛到這個網橋上,實現容器與主機之間通信。
-
默認 IPv4:一般是
172.17.0.1/16
,但你這里只顯示了 IPv6 地址。
4. veth3a2f510@if2
-
名字:
veth...
-
類型:veth pair(虛擬以太網設備對)的一端
-
作用:每個容器都會有一個 veth pair,一端在容器命名空間內,另一端接入主機上的
docker0
(或其他 Docker 網絡橋)。 -
說明:
@if2
表示另一端連接到編號2
的接口(容器內的 veth 設備)。
5. br-2737d7fbbbe5
-
名字:
br-2737d7fbbbe5
-
類型:Docker 用戶自定義 bridge 網絡
-
作用:當你用
docker network create
創建自定義網絡時,Docker 會在主機上創建一個 Linux bridge,并分配子網。 -
IPv4 地址:
172.18.0.1/16
,說明該網絡的容器默認分配172.18.x.x
地址。
6. vethaa59346@if2
-
名字:
veth...
-
類型:veth pair 的一端
-
作用:掛在
br-2737d7fbbbe5
上,對應一個容器的網絡接口。另一端在容器內部。
7. vethc5ed6bb@if2
-
名字:
veth...
-
類型:veth pair 的一端
-
作用:同上,也是
br-2737d7fbbbe5
橋接的一個容器接口。
🔹 總結
-
物理/本機接口
-
lo
:本地回環 -
ens33
:主機物理網卡(192.168.237.177)
-
-
Docker 默認網絡
-
docker0
:默認 bridge -
veth3a2f510
:掛在docker0
上的容器接口
-
-
Docker 自定義網絡
-
br-2737d7fbbbe5
:自定義 bridge(172.18.0.1) -
vethaa59346
/vethc5ed6bb
:掛在該自定義 bridge 上的容器接口
-
