Docker的網絡介紹

網絡簡單介紹

在介紹 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.x192.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]
  1. docker0 橋接設備:Docker 創建的虛擬以太網橋
  2. veth pair:虛擬以太網設備對,一端在容器內(顯示為 eth0),一端在主機上(連接到 docker0)
  3. 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 地址和端口。這意味著任何在容器中運行的服務都必須確保使用的端口不與宿主機上的現有服務沖突。
  • 宿主機:宿主機提供了一個共享的網絡命名空間給容器使用,使得容器可以直接通過宿主機的網絡接口進行通信。

生成原理

  1. 共享網絡棧:當容器以host模式運行時,它將直接使用宿主機的網絡棧,這意味著容器內的網絡配置(如IP地址、路由表等)與宿主機完全相同。
  2. 端口沖突風險:由于容器和宿主機共享相同的網絡視圖,容器中的服務必須小心選擇端口號,以免與宿主機上的其他服務發生沖突。例如,如果宿主機上已經有一個服務在80端口運行,那么容器內就不能再有服務嘗試綁定到這個端口。
  3. 增強性能:因為沒有額外的網絡地址轉換(NAT)層,host模式下的網絡性能通常優于bridge模式。
  4. 減少隔離性:雖然host模式提高了網絡性能并簡化了網絡配置,但它也減少了容器之間的網絡隔離。所有容器和宿主機上的服務都在同一個網絡環境中,這可能增加安全風險。

2.3、Container 模式

Container 網絡模式(也稱為"容器共享網絡命名空間"模式)是一種特殊的Docker網絡模式,它允許一個容器共享另一個容器的網絡命名空間。在這種模式下,多個容器共享同一個網絡環境,包括 IP 地址、端口范圍、網絡接口等。

特性

  1. 共享網絡棧:當使用container模式時,新啟動的容器不會創建自己的網絡命名空間,而是復用已經存在的某個容器的網絡命名空間。這意味著這兩個容器將共享同一個IP地址和端口集合,以及其它網絡資源。
  2. 減少隔離性:由于兩個容器共享同一個網絡環境,這種設置減少了容器之間的網絡隔離。因此,這種模式通常用于那些需要在容器之間進行直接通信而無需經過外部網絡的情況。
  3. 簡化網絡配置:因為兩個容器共享網絡配置,所以在其中一個容器中配置的服務可以直接被另一個容器訪問,無需額外的網絡配置或端口映射。

網絡架構原理圖

+-----------------------------------------------------------+
|                        Host Machine                       |
|                                                           |
|   +----------------+                                      |
|   |  Primary       |                                      |
|   |  Container     |                                      |
|   |  (擁有獨立網絡棧) |                                     |
|   |  172.17.0.2    |                                      |
|   +-------+--------+                                      |
|           | vethXXX                                       |
|   +-------+--------+    +----------------+                |
|   | docker0        |    | Secondary      |                |
|   | 172.17.0.1/16  |    | Container      |                |
|   +-------+--------+    | (共享Primary容器網絡)|            |
|           |             | 172.17.0.2     |                |
|   +-------+--------+    +----------------+                |
|   | 物理網絡接口     |                                      |
|   | eth0           |                                      |
|   +----------------+                                      |
+-----------------------------------------------------------+

關鍵特點

  1. 網絡棧共享:多個容器共享同一個網絡命名空間
  2. IP地址共享:所有共享容器使用相同的IP地址
  3. 端口共享:容器間需要協調端口使用,避免沖突
  4. 隔離性降低:共享網絡的容器可以互相訪問 localhost 服務

完畢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82589.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Netty學習專欄(六):深度解析Netty核心參數——從參數配置到生產級優化

文章目錄 前言一、核心參數全景解析1.1 基礎網絡層參數1.2 內存管理參數1.3 水位線控制1.4 高級參數與系統級優化 二、生產級優化策略2.1 高并發場景優化2.2 低延遲場景優化 總結 前言 在分布式系統和高并發場景中,Netty作為高性能網絡通信框架的核心地位無可替代。…

計算機網絡學習(六)——UDP

一、UDP UDP(User Datagram Protocol,用戶數據報協議)是傳輸層的一種協議,和 TCP 并列。與 TCP 不同,UDP 是無連接、不可靠、面向報文的協議,它的設計目標是追求更快的數據傳輸速度和更小的開銷。 UDP 為…

vue3文本超出三行顯示省略號,點擊查看更多顯示全部文本

只有一行時&#xff08;不顯示展開按鈕&#xff09;&#xff1a; 話不多說&#xff0c;上碼 ~template <el-col :span"24"><el-form-item :label"$t(warningOrgNames_)"><div class"content-box" ref"contanierRef"…

手寫Tomcat(一)

一、Tomcat簡介 Tomcat 服務器是一個免費的開放源代碼的Web應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試JSP 程序的首選。 1.1 Tomcat基本架構 Servlet接口文件中定義的方法有以下…

第三節_PySide6中Qt Designer 的基礎使用_上篇

文章目錄 前言一、Qt Designer簡介1.什么是 Qt Designer&#xff1f;2.核心功能3.核心優勢 二、Qt Designer界面介紹1.主窗口的創建2.窗口五大區域的簡單介紹 三、界面布局 Layout1.窗口布局方式介紹2.UI布局技巧概述3.UI布局實戰應用 總結 前言 第二節_PySide6項目創建流程介…

行列式的線性性質(僅限于單一行的加法拆分)

當然可以&#xff0c;以下是經過排版優化后的內容&#xff0c;保持了原始內容不變&#xff0c;僅調整了格式以提升可讀性&#xff1a; 行列式的線性性質&#xff08;加法拆分&#xff09; 這個性質說的是&#xff1a;如果行列式的某一行&#xff08;或某一列&#xff09;的所有…

Git使用說明

配置Git 確定已經安裝了Git, 通過以下的命令配置全局的郵箱和用戶名 git config --global user.email "your@xx.com" git config --global user.name "yourname" 初始化本地倉庫 首先,打開終端并切換到存放你代碼的項目目錄。接著執行以下命令,將該…

【后端高階面經:緩存篇】36、如何保證Redis分布式鎖的高可用和高性能?

一、分布式鎖核心挑戰:從單機到分布式的跨越 (一)分布式鎖的本質需求 互斥性:同一時刻僅一個客戶端持有鎖容錯性:節點故障時鎖仍有效(避免單點)原子性:加鎖/釋放鎖操作原子完成可重入性:支持同一客戶端多次獲取同一把鎖(二)Redis天然優勢 單線程模型保證操作原子性…

【后端高階面經:MongoDB篇】40、怎么優化MongoDB的查詢性能?

一、索引優化&#xff1a;構建高效查詢的基石 &#xff08;一&#xff09;索引類型與適用場景 1. 五大核心索引類型 索引類型適用場景示例代碼性能影響單字段索引單條件查詢&#xff08;如用戶ID、狀態字段&#xff09;db.users.createIndex({ user_id: 1 })低復合索引多條件…

Linux wget 常用命令詳解

目錄 1.1 工具定位 基礎下載示例 二、高效下載參數詳解 2.1 下載控制類 2.2 文件管理類 2.3 網絡優化類 三、高級應用場景 3.1 遞歸下載與整站鏡像 3.2 自動化下載實踐 3.3 安全下載配置 四、參數速查手冊 4.1 常用參數匯總 1.1 工具定位 基礎下載語法 wget [選項…

Pytorch中文文本分類

本文為&#x1f517;365天深度學習訓練營內部文章 原作者&#xff1a;K同學啊 將對中文文本進行分類&#xff0c;示例如下&#xff1a; 文本分類流程圖 1.加載數據 import time import pandas as pd import torch from torch.utils.data import DataLoader, random_split impo…

13.「極簡」扣子(coze)教程 | 小程序UI設計進階(三)讓界面動起來,實操講透“聚焦”事件

前一期大師兄介紹了扣子平臺組件的兩種狀態“禁用”和“加載”。這兩種方法使控件可以通過簡單設置表示出更多的運行狀態。今天大師兄將詳細介紹控件的一種事件“聚焦”。 扣子&#xff08;coze&#xff09;編程 「極簡」扣子(coze)教程 | 小程序UI設計進階 II&#xff01;讓…

劍指offer11_矩陣中的路徑

矩陣中的路徑 請設計一個函數&#xff0c;用來判斷在一個矩陣中是否存在一條路徑包含的字符按訪問順序連在一起恰好為給定字符串。 路徑可以從矩陣中的任意一個格子開始&#xff0c;每一步可以在矩陣中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移動一個格子。 如…

騰訊2025年校招筆試真題手撕(三)

一、題目 今天正在進行賽車車隊選拔&#xff0c;每一輛賽車都有一個不可以改變的速度。現在需要選取速度差距在10以內的車隊&#xff08;車隊中速度的最大值減去最小值不大于10&#xff09;&#xff0c;用于迎賓。車隊的選拔按照的是人越多越好的原則&#xff0c;給出n輛車的速…

《三維點如何映射到圖像像素?——相機投影模型詳解》

引言 以三維投影介紹大多比較分散&#xff0c;不少小伙伴再面對諸多的坐標系轉換中容易弄混&#xff0c;特別是再寫代碼的時候可能搞錯&#xff0c;所有這篇文章幫大家完整的梳理3D視覺中的投影變換的全流程&#xff0c;一文弄清楚這個過程&#xff0c;幫助大家搞清坐標系轉換…

Ini配置文件讀寫,增加備注功能

1.增加備注項寫入 例: #節點備注 [A] #項備注 bbb1 ccc2 [B] bbb1 IniConfig2 ic new IniConfig2(); //首次寫入 if (!ic.CanRead()) { ic.AddSectionReMarke("A", "節點備注"); ic.SetValue("A&qu…

OpenHarmony 5.0中狀態欄添加以太網狀態欄圖標以及功能實現

目錄 1.前置條件 2.方案 1.前置條件 首先以太網接口是有問題的,如下按照如下流程將以太網接口進行修復 OpenHarmony 以太網卡熱插拔事件接口無效-CSDN博客 然后上述的接口可以了就可以通過這個接口獲取以太網是否連接狀態 要注意wifi連接的干擾和預置虛擬網口干擾 2.方案…

RNN GRU LSTM 模型理解

一、RNN 1. 在RNN中&#xff0c; 2. RNN是一個序列模型&#xff0c;與非序列模型不同&#xff0c;序列中的元素互相影響&#xff1a; 是由 計算得來的。 在前向傳播中&#xff1a; 用于計算 和 用于計算 和 因此&#xff0c;當進行反向鏈式法則求導時候&#xf…

多路徑傳輸(比如 MPTCP)控制實時突發

實時突發很難控制&#xff0c;因為 “實時” 和 “突發” 相互斥。實時要求避免排隊&#xff0c;而突發必然要排隊&#xff0c;最終的解決方案都指向找一個公說公有理&#xff0c;婆說婆有理的中間點&#xff0c;這并沒解決問題&#xff0c;只是權衡了問題。 這種局部解決問題的…

函數式編程思想詳解

函數式編程思想詳解 1. 核心概念 不可變數據 (Immutable Data) 數據一旦創建&#xff0c;不可修改。任何操作均生成新數據&#xff0c;而非修改原數據。 優點&#xff1a;避免副作用&#xff0c;提升并發安全&#xff0c;簡化調試。 Java實現&#xff1a;使用final字段、不可變…