網絡簡單介紹
在介紹 Docker 的網絡模式之前,先簡單說下我們在使用 Vmware
虛擬機中的網絡模式,形成對比,更好理解。
1、Vmware
中的網絡模式
1.1、VMnet0(橋接模式)
虛擬機通過宿主機的物理網卡直接連接到外部網絡,類似于在物理網絡中新增了一臺獨立設備。虛擬機會獲得與宿主機同網段的 IP 地址,由外部 DHCP 服務器或手動分配。
橋接模式的原理如下圖所示:
這種模式下,VMware虛擬出了一個交換機。
首先,該虛擬交換機通過主機的物理網卡連接到主機所在的網絡中,然后所有的虛擬機都通過虛擬交換機接入到主機所在網絡中。
所以在該模式下,虛擬機和主機位于同一網絡中,因此在主機接入網絡的前提下,虛擬機和物理機是可以互通的。
可以把
虛擬交換機
當成平時生活中的物理交換機
,用于擴展我們的 LAN 口。
1.2、VMnet8(NAT模式)
虛擬機通過宿主機的 NAT
服務共享其 IP
訪問外部網絡。宿主機充當路由器,將虛擬機的內部IP轉換為宿主機的公網IP進行通信。
NAT模式的原理如下圖所示:
這種模式下,VMware虛擬出了一個交換機,一個DHCP服務以及一個NAT服務,相當于構成了一個虛擬路由器。
虛擬路由器通過主機的物理網卡連接到主機所在的網絡,虛擬機則全部連接到虛擬路由器上,組成了一個子網。
此時所有的虛擬機位于同一網絡,因此彼此之間可以互通,但是主機不能與虛擬機互通。
為使主機能夠和虛擬機互通,VMware 又在主機中虛擬出了一個網卡,并連接到了這個虛擬路由器中,這時主機便可虛擬機互通了。
首先需要明確的一點,就是在這種模式下邊, VMware它不僅虛擬出來了一個交換機,它還同時虛擬出來了一個 DHCP 服務以及一個 NAT 服務。
實際上這三者組合起來就相當于構成了一個虛擬的路由器,然后這個虛擬路由器的一端也就是它的WAN口,會通過這個宿主機(圖中物理機-03),連接到這個真正的路由器上,相當于是它的一個WAN口上邊。好了,然后所有的虛擬機都會接入到這個虛擬的路由器當中。
其實就相當于是我們這個虛擬路由器,那它又在真正的這個路由器的局域網下邊又創建了一個子局域網。那這些虛擬機都位于這個子網內,所以這種情況下虛擬機之間是可以互相通信的,并且這個虛擬機也是可以訪問互聯網的。
原理
在訪問互聯網的時候,這個數據包會經過兩次NAT的地址轉換。
一次是由這個虛擬路由器,由這個子網 IP 轉換成這個局域網的IP。
再一次就是由這個真正的路由器當中的NAT,由這個局域網的這個私網 IP 轉換成互聯網上面的一個公網IP。
目前這個主機在 NAT 模式下邊,其實是處在兩個網絡當中的,一個是我們這個虛擬網絡,還有一個是咱們這個真正的物理網絡。
端口映射(Port Forwarding):
允許外部網絡通過宿主機的特定端口訪問虛擬機內的服務(需手動配置)。
例如:將宿主機的 8080
端口映射到虛擬機的 80
端口,用戶訪問 宿主機IP:8080
即可訪問虛擬機的Web服務。
1.3、VMnet1(僅主機模式)
虛擬機與宿主機通過虛擬網絡連接,但完全隔離于外部網絡。宿主機提供虛擬交換機,僅允許虛擬機間及與宿主機通信。
僅主機模式的原理如下圖所示:
這種模式,和NAT模式十分相似,唯一的區別是,虛擬路由器并未連接到主機所在的網絡中,因此主機和虛擬機之間可以互通,但是虛擬機不能訪問互聯網。
這個模式就非常非常簡單了。僅主機模式其實和 NAT 模式十分相似,這里虛擬出來了一個路由器,然后這些虛擬機也都會接入到這個路由器當中,那并且這個 VMware 在主機當中也虛擬出來了一塊網卡。這個網卡也接入到了這個虛擬的路由器當中。
2、Dockers
中的網絡模式
2.1、Bridge 模式
Docker
默認的網絡模式。當你啟動一個容器而沒有指定網絡模式時,它將使用bridge模式。在這種模式下,Docker 會在主機上創建一個名為 docker0
的虛擬網橋,作為容器之間的默認網橋。每個容器都會連接到這個網橋,并獲得一個獨立的 IP 地址,該地址通常在172.17.x.x
或 192.168.x.x
范圍內。
容器可以通過 docker0
網橋與外部網絡通信,但這種通信默認情況下需要通過NAT(網絡地址轉換)進行。這意味著從外部網絡訪問容器時,必須先映射端口到宿主機。
+---------------------------------------------------+
| Host Machine |
| |
| +------------+ +------------+ |
| | Container1 | | Container2 | |
| | 172.17.0.2 | | 172.17.0.3 | |
| +-----+------+ +-----+------+ |
| | vethXXXX | vethYYYY |
| | | |
| +-----+--------------------+-------+ |
| | docker0 | |
| | (172.17.0.1) | |
| +----------------+-----------------+ |
| | eth0 |
| | |
+-------------------+-------------------------------+|[Physical Network]
docker0
橋接設備:Docker 創建的虛擬以太網橋veth pair
:虛擬以太網設備對,一端在容器內(顯示為 eth0),一端在主機上(連接到 docker0)iptables NAT 規則
:實現容器與外部網絡的通信
端口映射:如果你想讓外部網絡訪問容器內的服務,你需要在運行容器時通過-p
或--publish
選項指定端口映射。這樣,Docker會設置 iptables
規則,將宿主機上的特定端口流量重定向到容器內的對應端口。
2.2、Host 模式
Host 網絡模式是 Docker 中最簡單直接的網絡模式,容器直接使用宿主機的網絡命名空間,與宿主機共享網絡棧。在這種模式下,容器不會獲得獨立的網絡環境,而是直接使用主機的 IP 地址和端口。
網絡架構原理圖:
+-----------------------------------------------------------+
| Host Machine |
| |
| +----------------+ +----------------+ |
| | Container A | | Container B | |
| | (host網絡模式) | | (host網絡模式) | |
| +-------+--------+ +-------+--------+ |
| | | |
| +-------+----------------------+--------+ |
| | Host Network Stack | |
| | (eth0, 所有網絡接口, 路由表, iptables) | |
| +----------------------------------------+ |
| |
| +---------------------+ |
| | Physical Network | |
| | Interface | |
| +---------------------+ |
+-----------------------------------------------------------+
- 容器:在這個例子中,容器直接使用宿主機的網絡棧,包括其 IP 地址和端口。這意味著任何在容器中運行的服務都必須確保使用的端口不與宿主機上的現有服務沖突。
- 宿主機:宿主機提供了一個共享的網絡命名空間給容器使用,使得容器可以直接通過宿主機的網絡接口進行通信。
生成原理
- 共享網絡棧:當容器以host模式運行時,它將直接使用宿主機的網絡棧,這意味著容器內的網絡配置(如IP地址、路由表等)與宿主機完全相同。
- 端口沖突風險:由于容器和宿主機共享相同的網絡視圖,容器中的服務必須小心選擇端口號,以免與宿主機上的其他服務發生沖突。例如,如果宿主機上已經有一個服務在80端口運行,那么容器內就不能再有服務嘗試綁定到這個端口。
- 增強性能:因為沒有額外的網絡地址轉換(NAT)層,host模式下的網絡性能通常優于bridge模式。
- 減少隔離性:雖然host模式提高了網絡性能并簡化了網絡配置,但它也減少了容器之間的網絡隔離。所有容器和宿主機上的服務都在同一個網絡環境中,這可能增加安全風險。
2.3、Container 模式
Container 網絡模式(也稱為"容器共享網絡命名空間"模式)是一種特殊的Docker網絡模式,它允許一個容器共享另一個容器的網絡命名空間。在這種模式下,多個容器共享同一個網絡環境,包括 IP 地址、端口范圍、網絡接口等。
特性
- 共享網絡棧:當使用container模式時,新啟動的容器不會創建自己的網絡命名空間,而是復用已經存在的某個容器的網絡命名空間。這意味著這兩個容器將共享同一個IP地址和端口集合,以及其它網絡資源。
- 減少隔離性:由于兩個容器共享同一個網絡環境,這種設置減少了容器之間的網絡隔離。因此,這種模式通常用于那些需要在容器之間進行直接通信而無需經過外部網絡的情況。
- 簡化網絡配置:因為兩個容器共享網絡配置,所以在其中一個容器中配置的服務可以直接被另一個容器訪問,無需額外的網絡配置或端口映射。
網絡架構原理圖
+-----------------------------------------------------------+
| Host Machine |
| |
| +----------------+ |
| | Primary | |
| | Container | |
| | (擁有獨立網絡棧) | |
| | 172.17.0.2 | |
| +-------+--------+ |
| | vethXXX |
| +-------+--------+ +----------------+ |
| | docker0 | | Secondary | |
| | 172.17.0.1/16 | | Container | |
| +-------+--------+ | (共享Primary容器網絡)| |
| | | 172.17.0.2 | |
| +-------+--------+ +----------------+ |
| | 物理網絡接口 | |
| | eth0 | |
| +----------------+ |
+-----------------------------------------------------------+
關鍵特點
- 網絡棧共享:多個容器共享同一個網絡命名空間
- IP地址共享:所有共享容器使用相同的IP地址
- 端口共享:容器間需要協調端口使用,避免沖突
- 隔離性降低:共享網絡的容器可以互相訪問 localhost 服務
完畢。