037.集群網路-Docker網路實現

来源:https://www.cnblogs.com/itzgr/archive/2020/03/22/12547403.html
-Advertisement-
Play Games

一 Docker網路 1.1 Docker網路類型 標準的Docker支持以下4類網路模式: host模式:使用--net=host指定。 container模式:使用--net=container:NAME_or_ID指定。 none模式:使用--net=none指定。 bridge模式:使用-- ...


一 Docker網路

1.1 Docker網路類型

標準的Docker支持以下4類網路模式:
  • host模式:使用--net=host指定。
  • container模式:使用--net=container:NAME_or_ID指定。
  • none模式:使用--net=none指定。
  • bridge模式:使用--net=bridge指定,為預設設置。
在Kubernetes管理模式下通常只會使用bridge模式,如下介紹在bridge模式下Docker是如何支持網路的。 提示:更多Docker網路參考《006.Docker網路管理》。

二 bridge模式

2.1 bridge模型

在bridge模式下,Docker Daemon第1次啟動時會創建一個虛擬的網橋,預設的名稱是docker0,然後在私有網路空間中給這個網橋分配一個子網。針對由Docker創建的每一個容器,都會創建一個虛擬的乙太網設備(Veth設備對),其中一端關聯到網橋上,另一端使用Linux的網路命名空間技術,映射到容器內的eth0設備,然後從網橋的地址段內給eth0介面分配一個IP地址。 如圖所示為Docker的預設橋接網路模型: clipboard 其中ip1是網橋的IP地址,Docker Daemon會在幾個備選地址段里給它選一個地址,通常是以172開頭的一個地址。這個地址和主機的IP地址是不重疊的。ip2是Docker在啟動容器時,在這個地址段選擇的一個沒有使用的IP地址分配給容器。相應的MAC地址也根據這個IP地址,在02:42:ac:11:00:00和02:42:ac:11:ff:ff的範圍內生成,這樣做可以確保不會有ARP衝突。 啟動後,Docker還將Veth對的名稱映射到eth0網路介面。ip3就是主機的網卡地址。 通常,ip1、ip2和ip3是不同的IP段,所以在預設不做任何特殊配置的情況下,在外部是看不到ip1和ip2的。 這樣做的結果就是,在同一臺機器內的容器之間可以相互通信,不同主機上的容器不能相互通信,實際上它們甚至有可能在相同的網路地址範圍內(不同主機上的docker0的地址段可能是一樣的)。 為了讓它們跨節點互相通信,就必須在主機的地址上分配埠,然後通過這個埠路由或代理到容器上。這種做法顯然意味著一定要在容器之間小心謹慎地協調好埠的分配,或者使用動態埠的分配技術。 在不同應用之間協調好埠分配是十分困難的事情,特別是集群水平擴展時。而動態的埠分配也會帶來高度複雜性,例如:每個應用程式都只能將埠看作一個符號(因為是動態分配的,所以無法提前設置)。 而且API Server要在分配完後,將動態埠插入配置的合適位置,服務也必須能互相找到對方等。這些都是Docker的網路模型在跨主機訪問時面臨的問題。 註意:更多跨主機的Docker通信方案,可參考《006.Docker網路管理》。

2.2 網路規則

  • 查看Docker啟動後的系統情況
Docker網路中,在bridge模式下Docker Daemon啟動時創建docker0網橋,併在網橋使用的網段為容器分配IP。 Docker Daemon剛啟動並且還沒有啟動任何容器時,網路協議棧的配置情況如下: [root@docker ~]# ip addr [root@docker ~]# iptables-save clipboard clipboard Docker創建了docker0網橋,並添加了iptables規則。docker0網橋和iptables規則都處於root命名空間中。對這些規則的說明如下:
  1. 在NAT表中有3條記錄,前兩條匹配生效後,都會繼續執行DOCKER鏈,而此時DOCKER鏈為空,所以前兩條只是做了一個框架,並沒有實際效果。
  2. NAT表第3條的含義是,若本地發出的數據包不是發往docker0的,即是發往主機之外的設備的,則都需要進行動態地址修改(MASQUERADE),將源地址從容器的地址(172段)修改為宿主機網卡的IP地址,之後就可以發送給外面的網路了。
  3. 在FILTER表中,第1條也是一個框架,因為後繼的DOCKER鏈是空的。
  4. 在FILTER表中,第3條是說,docker0發出的包,如果需要Forward到非docker0的本地IP地址的設備,則是允許的。這樣,docker0設備的包就可以根據路由規則中轉到宿主機的網卡設備,從而訪問外面的網路。
  5. FILTER表中,第4條是說,docker0的包還可以被中轉給docker0本身,即連接在docker0網橋上的不同容器之間的通信也是允許的。
  6. FILTER表中,第2條是說,如果接收到的數據包屬於以前已經建立好的連接,那麼允許直接通過。這樣接收到的數據包自然又走回docker0,並中轉到相應的容器。
除瞭如上Netfilter的設置,Linux的ip_forward功能也被Docker Daemon打開了: [root@docker ~]# cat /proc/sys/net/ipv4/ip_forward 1 [root@docker ~]# ip route default via 172.24.9.1 dev eth0 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.24.9.0/24 dev eth0 proto kernel scope link src 172.24.9.138
  • 查看容器啟動後的情況(容器無埠映射)
首先啟動一個容器,如Registry容器(不使用任何埠鏡像參數),看一下網路堆棧部分相關的變化: [root@docker ~]# docker run --name register -d registry #運行容器 [root@docker ~]# ip addr [root@docker ~]# iptables-save [root@docker ~]# ip route clipboard
  1. 宿主機器上的Netfilter和路由表都沒有變化,說明在不進行埠映射時,Docker的預設網路是沒有特殊處理的。相關的NAT和FILTER這兩個Netfilter鏈還是空的。
  2. 宿主機上的Veth對已經建立,並連接到容器內。
[root@docker ~]# docker exec -ti register /bin/sh #容器內查看相關信息 / # ip route / # ip addr clipboard 如上預設停止的迴環設備lo已經被啟動,外面宿主機連接進來的Veth設備也被命名成了eth0,並且已經配置了地址172.17.0.2。路由信息表包含一條到docker0的子網路由和一條到docker0的預設路由。 查看容器啟動後的情況(容器有埠映射) [root@docker ~]# docker run --name register -d -p 1180:5000 registry #帶埠映射啟動registry [root@docker ~]# iptables-save clipboard 如上新增的規則可以看出,Docker服務在NAT和FILTER兩個表內添加的兩個DOCKER子鏈都是給埠映射用的。在本例中我們需要把外面宿主機的1180埠映射到容器的5000埠。 通過分析可知,無論是宿主機接收到的還是宿主機本地協議棧發出的,目標地址是本地IP地址的包都會經過NAT表中的DOCKER子鏈。Docker為每一個埠映射都在這個鏈上增加了到實際容器目標地址和目標埠的轉換。經過這個DNAT的規則修改後的IP包,會重新經過路由模塊的判斷進行轉發。由於目標地址和埠已經是容器的地址和埠,所以數據自然就被轉發到docker0上,從而被轉發到對應的容器內部。 當然在Forward時,也需要在DOCKER子鏈中添加一條規則,如果目標埠和地址是指定容器的數據,則允許通過。在Docker按照埠映射的方式啟動容器時,主要的不同就是上述iptables部分。而容器內部的路由和網路設備,都和不做埠映射時一樣,沒有任何變化。

三 Docker網路局限

3.1 Docker的網路局限

從Docker對Linux網路協議棧的示例可知,Docker一開始沒有考慮到多主機互聯的網路解決方案。Docker一直以來的理念都是“簡單為美”。通常,虛擬化技術中最為複雜的部分就是虛擬化網路技術。 多主機互聯相關方案有Libnetwork,Libnetwork針對目前Docker的網路實現,Docker使用的Libnetwork組件只是將Docker平臺中的網路子系統模塊化為一個獨立庫的簡單嘗試,離成熟和完善還有一段距離。 提示:更多Docker網路實現方案參考:《007.基於Docker的Etcd分散式部署》、《008.Docker Flannel+Etcd分散式網路部署》。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C# Net 使用 openxml 寫入 對象 到 Excel 中 C# Net 使用openxml寫入對象到Excel中 文尾看效果 效果一(模板文件寫入集合對象) 效果二(新建文件寫入集合對象) 加入包:OpenXml 創建文件:ExcelWrite.cs 複製下麵全部代碼到文件 ExcelWr ...
  • 1、下載插件fiddler 獲取代碼,方式:https:////www.cnblogs.com/my2020/p/12458110.html 將左側拖入右側,點擊“Run Code”運行查看是否可行 2、打開VS,新建操作台程式 3、將fiddler中的代碼粘貼進行修改調試 4、進入“屬性”將“控制 ...
  • 在構思完系統思維腦圖後,小墨回到家中,便摩拳擦掌開始了開發工作。要想迅速完成系統開發,前期系統設計和準備尤其重要,因為小墨做過太多大大小小的業務系統,準備工作也是十分順利。 系統結構 整個系統工程結構如上,基於傳統的三層架構模式(不太懂的快去惡補一下) Web: 基於MVC工程模板搭建,系統模型,視 ...
  • 前面已經分析了伙伴管理演算法的釋放實現,接著分析一下伙伴管理演算法的記憶體申請實現。 伙伴管理演算法記憶體申請和釋放的入口一樣,其實並沒有很清楚的界限表示這個函數是入口,而那個不是,所以例行從稍微偏上一點的地方作為入口分析。於是選擇了alloc_pages()巨集定義作為分析切入口: 而alloc_pages_ ...
  • 我是一個學OI的高一蒟蒻QAQ Win10已經裝了幾個星期了,以前一直沒裝Microsoft office,用的WPS,感覺不行,今天花了一個多小時裝了一下免費office 2016 win10: 1.官網製作系統盤(具體見官網提示) 2.備份C盤 3.重啟,主板調到USB優先(重啟後瘋狂按F12或 ...
  • 我們經常會遇到新裝機器或者用別人的linux機器的時候找不到某個命令出自哪個軟體包而不知道如何安裝的情況,用如下命令可以解決 yum provides TARGET 舉例說明: 這裡因為我已經安裝了,所以提示了我文件位置(安裝了找不到也可以這樣找) 最重要的是如這行 說明是這個redhat lsb ...
  • 1.網卡文件位置 centos網卡配置文件一般位於:/etc/sysconfig/network scripts/ 文件名一般為:ifcfg eno或者ifcfg eth0類似的文件,可以先用ip addr 命令或者是ifconfig命令查看網卡信息 如果是新機器沒有配置文件一般也會有ifcfg l ...
  • 一 Kubernetes網路實現 1.1 Kubernetes網路優勢 在實際的業務場景中,業務組件之間的關係十分複雜,微服務的理念更是讓應用部署的粒度更加細小和靈活。為了支持業務應用組件的通信,Kubernetes網路的設計主要致力於解決以下問題。 容器到容器之間的直接通信。 抽象的Pod到Pod ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...