Docker 網絡原理

Linux 常見網絡虛擬化

虛擬網卡:tun/tap

虛擬網卡(又稱虛擬網絡適配器),即用軟件模擬網絡環境,模擬網絡適配器。
在計算機網絡中,tun tap 是操作系統內核中的虛擬網絡設備。不同于普通靠硬件網絡適配器實現的設備,這些虛擬的網絡設備全部用軟件實現,并向運行于操作系統上的軟件提供與硬件的網絡設備完全相同的功能。
tun 是網絡層的虛擬網絡設備,可以收發第三層數據報文包,如 IP 封包,因此常用于一些點對點 IP 隧道,例如 OpenVPNIPSec 等。
tap 是鏈路層的虛擬網絡設備,等同于一個以太網設備,它可以收發第二層數據報文包,如以太網數據幀。Tap 最常見的用途就是做為虛擬機的網卡,因為它和普通的物理網卡更加相近,也經常用作普通機器的虛擬網卡。
  • 添加網卡
# 創建 tap 
ip tuntap add dev tap0 mode tap 
# 創建 tun
ip tuntap add dev tun0 mode tun
  • 刪除網卡
# 刪除 tap
ip tuntap del dev tap0 mode tap
# 刪除 tun
ip tuntap del dev tun0 mode tun
  • 激活網卡
ip link set tun0 up
  • 設置 ip
ip addr add 10.5.0.1/24 dev tun0
  • 查看幫助
ip tuntap help
使用 tun/tap 設備的目的是實現把來自協議棧的數據包先交由某個打開了 /dev/net/tun 字符設備的用戶進程處理后,再把數據包重新發回到鏈路中。你可以通俗地將它理解為這塊虛擬化網卡驅動一端連接著網絡協議棧,另一端連接著用戶態程序,而普通的網卡驅動則是一端連接著網絡協議棧,另一端連接著物理網卡。
最典型的 VPN 應用程序為例,程序發送給 tun 設備的數據包。
應用程序通過 tun 設備對外發送數據包后,tun 設備便會把數據包通過字符設備發送給 VPN 程序,VPN 收到數據包,會修改后重新封裝成新報文,然后通過協議棧發送到物理網卡發送出去。
使用 tun/tap 設備傳輸數據需要經過兩次協議棧,不可避免地會有一定的性能損耗,所以引入了新的網卡實現方式 veth.

虛擬網卡:veth

Linux Kernel 2.6 版本,Linux 開始支持網絡名空間隔離同時也提供了專門的虛擬以太網(Virtual Ethernet,習慣簡寫做 veth)讓兩個隔離的網絡名稱空間之間可以互相通信。直接把veth 比喻成是虛擬網卡其實并不十分準確,如果要和物理設備類比,它應該相當于由交叉網線連接的一對物理網卡。形象化的理解如下:
veth 實際上不是一個設備,而是一對設備,因而也常被稱作 veth pair。要使用 veth,必須在兩個獨立的網絡名稱空間中進行才有意義,因為 veth pair 是一端連著協議棧,另一端彼此相連的,在 veth 設備的其中一端輸入數據,這些數據就會從設備的另外一端原樣不變地流出.
  • veth 操作
# 添加 veth
ip link add <veth name> type veth peer name <peer name>
# 刪除 veth
ip link delete <veth name>
# 查看 veth
ip link show
# 將 veth 移到網絡空間
ip link set <veth name> netns <netns name>
  • 命名空間操作
#添加 ns
ip netns add <name>
#刪除 ns
ip netns del <name>
#執行命令
ip netns exec <name> <cmd>
#遍歷 ns
ip netns list
veth 通信不需要反復多次經過網絡協議棧,這讓 veth 比起 tap/tun 具有更好的性能。veth 實現了點對點的虛擬連接,可以通過 veth 連接兩個 namespace,如果我們需要將多個 namespace 接入同一個二層網絡時,就不能只使用 veth 了在物理網絡中,如果需要連接多個主機,我們會使用網橋,或者又稱為交換機。Linux 也提供了網橋的虛擬實現。

虛擬交換機

使用 veth pair 將兩個隔離的 netns 連接在了一起,在現實世界里等同于用一根網線把兩臺電腦連接在了一起,但是在現實世界里往往很少會有人這樣使用。因為一臺設備不僅僅只需要和另一臺設備通信,它需要和很多很多的網絡設備進行通信,如果還使用這樣的方式,需要十分復雜的網絡接線,并且現實世界中的普通網絡設備也沒有那么多網絡接口。
那么,想要讓某一臺設備和很多網絡設備都可以通信需要如何去做呢?在我們的日常生活中,除了手機和電腦,最常見的網絡設備就是路由器了,我們的手機連上 WI-FI,電腦插到路由器上,等待從路由器的 DHCP 服務器上獲取到 IP,他們就可以相互通信了,這便是路由器的二層交換功能在工作。Linux Bridge 最主要的功能就是二層交換,是對現實世界二層交換機的模擬.
Linux Bridge ,由 brctl 命令創建和管理。Linux Bridge 創建以后,真實的物理設備(如 eth0)或是虛擬的設備(veth 或者 tap)都能與 Linux Bridge 配合工作。
  • 安裝方式
# centos
yum install -y bridge-utils
# ubuntu
apt-get install -y bridge-utils
  • 新建一個網橋
brctl addbr <bridge>
  • 添加一個設備(例如 eth0)到網橋
brctl addif <bridge> eth0
  • 顯示當前存在的網橋及其所連接的網絡端口
brctl show
  • 啟動網橋
ip link set <bridge> up
  • 刪除網橋
ip link del <bridge>
增加 Linux Bridge 時會自動增加一個同名虛擬網卡在宿主機器上,因此我們可以通過 ip link 命令操作這個虛擬網卡,實際上也就是操作網橋,并且只有當這個虛擬網卡狀態處于 up 的時候,網橋才會轉發數據。

虛擬組網

物理網絡的拓撲結構是相對固定的。云原生時代的分布式系統的邏輯拓撲結構變動頻率,譬如服務的擴縮、斷路、限流,等等,都可能要求網絡跟隨做出相應的變化。正因如此,軟件定義網絡(Software Defined NetworkSDN)的需求在云計算和分布式時代變得前所未有地迫切,SDN 的核心思路是在物理的網絡之上再構造一層虛擬化的網絡。SDN 里位于下層的物理網絡被稱為 Underlay,它著重解決網絡的連通性與可管理性,位于上層的邏輯網絡被稱為 Overlay,它著重為應用提供與軟件需求相符的傳輸服務和網絡拓撲。

vlan

交換機是一個 L2 設備,插在同一個交換機的網絡設備組成了一個 L2 網絡,L2 網絡之間通過MAC 地址通信,同時這個 L2 網絡也是一個廣播域。同屬于一個廣播域的兩個設備想要通信,一設備須得向網絡中的所有設備發送請求信息,只有對應 MAC 地址的設備才是真正的接收方,但實際上卻是數據幀傳遍整個網絡,所有設備都會收到,且直接丟棄。如此一來,將造成一系列不好的后果:網絡整體帶寬被占用、潛在的信息安全風險、占用 CPU 資源……因此,VLAN 應運而生!
Vlan(Virtual Local Area Network)即虛擬局域網,是一個將物理局域網在邏輯上劃分成多個廣播域技術。通過在交換機上配置 Vlan,可以實現在同一 Vlan 用戶可以進行二層互訪,在不同 Vlan 間的用戶被二層隔離,這樣既能夠隔離廣播域,又可以提升網絡安全性。
VLAN 究竟能夠解決什么問題?
  • 限制廣播域。廣播域被限制在一個局域網內,節省了帶寬,提高了網絡處理能力。
  • 增強局域網的安全性。不同局域網內的報文在傳輸時是相互隔離的,即一個 VLAN 內的用戶不能和其它 VLAN 內的用戶直接通信,如果不同 VLAN 要進行通信,則需要通過路由器或三層交換機等三層設備。
  • 靈活構建虛擬工作組。用局域網可以劃分不同的用戶到不同的工作組,同一工作組的用戶也不必局限于某一固定的物理范圍,網絡構建和維護更方便靈活。
不過 VLAN 也并非沒有缺點。
1、隨著虛擬化技術的發展,一臺物理服務器往往承載了多臺虛擬機,公有云或其它大
型虛擬化云數據中心動輒需容納上萬甚至更多租戶,VLAN 技術最多支持 4000 多個
VLAN,逐漸無法滿足需求。
2、公有云提供商的業務要求將實體網絡租借給多個不同的用戶,這些用戶對于網絡的
要求有所不同,而不同用戶租借的網絡有很大的可能會出現 IP 地址、MAC 地址的重
疊。傳統的 VLAN 并沒有涉及這個問題,因此需要一種新的技術來保證在多個租戶網
絡中存在地址重疊的情況下依舊能有效通信的技術。
3、虛擬化技術使得單臺主機可以虛擬化出多臺虛擬機同時運行,而每臺虛擬機都會有
其唯一的 MAC 地址。這樣,為了保證集群中所有虛機可以正常通信,交換機必須保存
每臺虛機的 MAC 地址,這樣就導致了交換機中的 MAC 表異常龐大,從而影響交換機
的轉發性能。

vxlan

VXLAN 是另一種網絡虛擬化技術,有點類似于 VLAN,但功能更強大。在傳統的 VLAN 網絡中,共享同一底層 L2 網段的 VLAN 不能超過 4096 個。只有 12 比特用于對 Ethernet Frame 格式中的 VLAN ID 字段進行編碼。VXLAN 協議定義了 8 個字節的 VXLAN Header,引入了類似 VLAN ID 的網絡標識,稱為 VNIVXLAN Network ID),由 24 比特組成,這樣總共是 1600 多萬個,從而滿足了大規模不同租戶之間的標識、隔離需求。
VXLAN 是基于 L3 網絡構建的虛擬 L2 網絡,是一種 Overlay 網絡。VXLAN 不關心底層物理網絡拓撲,它將 Ethernet Frame 封裝在 UDP 包中,只要它能承載 UDP 數據包,就可以在遠端網段之間提供以太網 L2 連接。
每個 VXLAN 節點上的出站 L2 Ethernet Frame 都會被捕獲,然后封裝成 UDP 數據包,并通過 L3 網絡發送到目標 VXLAN 節點。當 L2 Ethernet Frame 到達 VXLAN 節點時,就從 UDP 數據包中提取(解封裝),并注入目標設備的網絡接口。這種技術稱為隧道。因此,VXLAN 節點會創建一個虛擬 L2 網段,從而創建一個 L2 廣播域。

MacVLan

MACVLAN 允許對同一個網卡設置多個 IP 地址,還允許對同一張網卡上設置多個 MAC 地址,這也是 MACVLAN 名字的由來。原本 MAC 地址是網卡接口的身份證,應該是嚴格的一對一關系,而 MACVLAN 打破這層關系,方法是在物理設備之上、網絡棧之下生成多個虛擬的 Device,每個 Device 都有一個 MAC 地址,新增 Device 的操作本質上相當于在系統內核中注冊了一個收發特定數據包的回調函數,每個回調函數都能對一個 MAC 地址的數據包進行響應,當物理設備收到數據包時,會先根據 MAC 地址進行一次判斷,確定交給哪個 Device 來處理。

IPVLan

Ipvlan macvlan 非常相似,但又存在顯著不同。Ipvlan 的子接口上并不擁有獨立的 MAC 地址。所有共享父接口 MAC 地址的子接口擁有各自獨立的 IP
共享 MAC 地址會影響 DHCP 相關的操作。如果虛擬機、容器需通過 DHCP 獲取網絡配置,請確保它們在 DHCP 請求中使用各自獨立的 ClientIDDHCP 服務器會根據請求中的 ClientID 而非 MAC 地址來分配 IP 地址。某些設備不支持分配多個 ip 地址所以 IPVlan 也沒有實際大規模推廣。

docker 網絡分類

docker 常見的網絡的分類如下,其中 bridge 網絡、host 網絡、container 網絡、none 網絡、overlay 網絡、macvlan 網絡、ipvlan 網絡。其中 overlay 網絡往往配合 swarm 和 k8s 來使用。

bridge 網絡

bridge 驅動會在 Docker 管理的主機上創建一個 Linux 網橋。默認情況下,網橋上的容器可以相互通信。也可以通過 bridge 驅動程序配置,實現對外部容器的訪問。橋接網絡如下:
創建命令如下:
docker network create -d bridge bridgenet1

host 網絡

如果啟動容器的時候使用 host 模式,那么這個容器將不會獲得一個獨立的 Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬出自己的網卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。host 網絡結構如下:
host 網絡創建命令如下
docker run --name <container name> --network=host <image file>

container 網絡

這個模式指定新創建的容器和引進存在的一個容器共享一個 network namespace ,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 ip,而是和一個指定的容器共享 ip,端口等,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。容器網絡原理如下:
容器網絡創建命令參考如下:
docker run --name netcontainer2 --network container:netcontainer1?<image file>

none 網絡

Docker 容器擁有自己的 Network Namespace,但是,并不為 Docker 容器進行任何網絡配置。也就是說,這個 Docker 容器沒有網卡、IP、路由等信息。需要我們自己為 Docker 容器添加網卡、配置 IP 等。
docker run --name <container name> --network none <image file>

overlay 網絡

Overlay 驅動創建一個支持多主機網絡的覆蓋網絡。在不改變現有網絡基礎設施的前提下,通過某種約定通信協議,把二層報文封裝在 IP 報文之上的新的數據格式。Overlay 網絡實際上是目前最主流的容器跨節點數據傳輸和路由方案,底層原理為 VXLAN。
Overlay 網絡將多個 Docker 守護進程連接在一起,允許不同機器上相互通訊,同時支持對消息進行加密,實現跨主機的 docker 容器之間的通信,Overlay 網絡將多個 Docker 守護進程連接在一起,使 swarm 服務能夠相互通信。這種策略消除了在這些容器之間進行操作系統級路由的需要。下圖是個典型的 overlay 網絡:
overlay 網絡的創建命令如下
docker network create -d overlay ovnet1

macvlan 網絡

為每個容器的虛擬網絡接口分配一個 MAC 地址,使其看起來是直接連接到物理網絡的物理網絡接口。需要在 Docker 主機上指定一個物理接口用于 macvlan 以及子網和網關 macvlan。您甚至可以 macvlan 使用不同的物理網絡接口隔離您的網絡。
macvlan 典型的拓撲如下:
macvlan 的創建命令如下
docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=eth0 mac1

ipvlan 網絡

ipvlan overlay 都可以實現不同主機上的容器之間的通訊,但是 ipvlan 是所有容器都在一個網段,相當于在一個 vlan 里面,然后可以通過不同的子接口對應不同網段,實現不同容器之間的通訊。而 overlay 可以實現不同網段之間的通訊。ipvlan l2 網絡示例如下:
ipvlan 的創建命令參考如下:
docker network create -d ipvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o ipvlan_mode=l2 -o parent=eth0 pub_net

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

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

相關文章

【通識】PCB文件

1. PCB文件的導入 在PORTEL99 PCB編輯器的文件菜單中選擇導入先前繪制的CAD文件。導入成功后&#xff0c;編輯器將顯示出元件封裝的基本圖形&#xff0c;為后續操作奠定基礎。將需要抄板的PCB放置于掃描儀中隨后啟動掃描儀&#xff0c;之后啟動AUTO CAD軟件&#xff0c;之后插入…

分布式彈性故障處理框架——Polly(1)

1 前言之服務雪崩 在我們實施微服務之后&#xff0c;服務間的調用變得異常頻繁&#xff0c;多個服務之前可能存在互相依賴的關系&#xff0c;當某個服務出現故障或者是因為服務間的網絡出現故障&#xff0c;導致服務調用的失敗&#xff0c;進而影響到某個業務服務處理失敗&…

【機器學習深度學習】大模型推理速度與私有化部署的價值分析

目錄 前言 一、主流推理框架速度對比 二、為什么 HuggingFace 框架更適合微調驗證&#xff1f; 三、大模型私有化部署的必要性分析 ? 私有化部署的主要動因 1. 數據隱私與業務安全 2. 可控性與性能保障 ? 哪些情況不建議私有部署&#xff1f; 四、總結與選型建議 &…

elementui-admin構建

1、vue-element-admin vue-element-admin是基于element-ui 的一套后臺管理系統集成方案。 功能&#xff1a;介紹 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide/# GitHub地址&#xff1a;https://github.com/PanJia…

深入排查:編譯環境(JDK)與運行環境(JRE/JDK)不一致時的常見 Java 錯誤及解決方案

深入排查&#xff1a;編譯環境&#xff08;JDK&#xff09;與運行環境&#xff08;JRE/JDK&#xff09;不一致時的常見 Java 錯誤及解決方案 在后端 Java 項目中&#xff0c;編譯環境&#xff08;JDK&#xff09; 與 運行環境&#xff08;JRE/JDK&#xff09; 版本不一致&…

[JS逆向] 微信小程序逆向工程實戰

博客配套代碼與工具發布于github&#xff1a;微信小程序 &#xff08;歡迎順手Star一下?&#xff09; 相關爬蟲專欄&#xff1a;JS逆向爬蟲實戰 爬蟲知識點合集 爬蟲實戰案例 逆向知識點合集 前言&#xff1a; 微信小程序對于很多嘗試JS逆向的人群來說&#xff0c;都是一個…

基于5G系統的打孔LDPC編碼和均勻量化NMS譯碼算法matlab性能仿真

目錄 1.引言 2.算法仿真效果演示 3.數據集格式或算法參數簡介 4.算法涉及理論知識概要 4.1打孔技術 4.2 均勻量化NMS譯碼 5.參考文獻 6.完整算法代碼文件獲得 1.引言 在5G通信系統中&#xff0c;信道編碼技術是保障高速率、高可靠性數據傳輸的核心支撐&#xff0c;而低…

基于Java標準庫讀取CSV實現天地圖POI分類快速導入PostGIS數據庫實戰

目錄 前言 一、天地圖POI分類簡介 1、數據表格 2、分類結構 二、從CSV導入到PG數據庫 1、CSV解析流程 2、數據轉換及入庫 3、入庫成果及檢索 三、總結 前言 在之前的博客中&#xff0c;曾經對高德地圖和百度地圖的POI分類以及使用PostGIS數據庫來進行管理的模式進行了詳…

人-AI交互中的信息論不同于傳統的信息論,其信息的增量≠不確定性的減量

在人機交互&#xff08;Human-AI Interaction, HAI&#xff09;領域&#xff0c;信息論的應用確實與傳統的信息論有所不同。這種差異主要源于人機交互HAI中信息的復雜性、動態性以及人類認知的特點。1. 傳統信息論的核心概念傳統信息論由克勞德香農&#xff08;Claude Shannon&…

K8s 通過 Scheduler Extender 實現自定義調度邏輯

1. 為什么需要自定義調度邏輯 什么是所謂的調度? 所謂調度就是指給 Pod 對象的 spec.nodeName 賦值 待調度對象則是所有 spec.nodeName 為空的 Pod 調度過程則是從集群現有的 Node 中為當前 Pod 選擇一個最合適的 實際上 Pod 上還有一個平時比較少關注的屬性&#xff1a;…

7.19 換根dp | vpp |滑窗

lcr147.最小棧通過兩個棧 維護實現class MinStack { public:stack<int> A, B;MinStack() {}void push(int x) {A.push(x);if(B.empty() || B.top() > x)B.push(x);}void pop() {if(A.top() B.top())B.pop();A.pop();}int top() {return A.top();}int getMin() {retur…

以太坊的心臟與大腦:詳解執行客戶端(EL)與共識客戶端(CL)

好的&#xff0c;各位技術同道&#xff0c;歡迎再次光臨我的博客。在上一篇文章中&#xff0c;我們聊了如何搭建一個以太坊測試節點&#xff0c;并提到了節點需要同時運行“執行客戶端”和“共識客戶端”。很多朋友對此表示了濃厚興趣&#xff0c;想深入了解這兩者究竟是什么&a…

Debian-10,用glibc二進制預編譯包,安裝Mysql-5.7.44 筆記250716

Debian-10,用glibc二進制預編譯包,安裝Mysql-5.7.44 筆記250716 &#x1f4e6; 一步腳本 #!/bin/bash### 安裝依賴 apt install -y libaio1 libnuma1 libncurses5### 下載MySQL-5.7.44 的 glib二進制包: mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz ,(如果不存在) mkdir…

用邏輯回歸(Logistic Regression)處理鳶尾花(iris)數據集

# 導入必要的庫 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from…

華大北斗TAU1201-1216A00高精度雙頻GNSS定位模塊 自動駕駛專用

在萬物互聯的時代&#xff0c;您還在為定位不準、信號丟失而煩惱嗎&#xff1f;TAU1201-1216A00華大北斗高精度定位模塊TAU1201是一款高性能的雙頻GNSS定位模塊&#xff0c;搭載了華大北斗的CYNOSURE III GNSS SoC 芯片&#xff0c;該模塊支持新一代北斗三號信號體制&#xff0…

堅持繼續布局32位MCU,進一步完善產品陣容,96Mhz主頻CW32L012新品發布!

在全球MCU市場競爭加劇、國產替代加速的背景下&#xff0c;嵌入式設備對核心控制芯片的性能、功耗、可靠性及性價比提出了前所未有的嚴苛需求。為適應市場競爭&#xff0c;2025年7月16日&#xff0c;武漢芯源半導體正式推出基于CW32L01x系列低功耗微控制器家族的全新成員&#…

用線性代數推導碼分多址(CDMA)

什么是碼分多址 碼分多址&#xff1a;CDMA允許多個用戶同時、在同一頻率上傳輸數據。它通過給每個用戶分配唯一的、相互正交的二進制序列來實現區分。用戶的數據比特被這個碼片序列擴展成一個高速率的信號&#xff0c;然后在接收端通過相同的碼片序列進行相關運算來回復原數據 …

mac 配置svn

1.查看brew的版本&#xff1a;brew install subversion2.安裝brew命令&#xff1a;bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"3.把路徑添加到path環境變量&#xff1a;echo export PATH"/opt/homebrew/b…

使用 .NET Core 的原始 WebSocket

在 Web 開發中&#xff0c;后端存在一些值得注意的通信協議&#xff0c;用于將更改通知給已連接的客戶端。所有這些協議都用于處理同一件事。但鮮為人知的協議很少&#xff0c;鮮為人知的協議也很少。今天&#xff0c;將討論 WebSocket&#xff0c;它在開發中使用最少&#xff…

編程實現Word自動排版:從理論到實踐的全面指南

在現代辦公環境中&#xff0c;文檔排版是一項常見但耗時的工作。特別是對于需要處理大量文檔的專業人士來說&#xff0c;手動排版不僅費時費力&#xff0c;還容易出現不一致的問題。本文將深入探討如何通過編程方式實現Word文檔的自動排版&#xff0c;從理論基礎到實際應用&…