摘要:各項配置如下主機的地址為主機的地址為為主機上的容器分配的子網(wǎng)為主機上的容器分配的子網(wǎng)這樣配置之后,兩個主機上的容器就肯定不會使用相同的地址從而避免了沖突。
就目前Docker自身默認的網(wǎng)絡(luò)來說,單臺主機上的不同Docker容器可以借助docker0網(wǎng)橋直接通信,這沒毛病,而不同主機上的Docker容器之間只能通過在主機上用映射端口的方法來進行通信,有時這種方式會很不方便,甚至達不到我們的要求,因此位于不同物理機上的Docker容器之間直接使用本身的IP地址進行通信很有必要。再者說,如果將Docker容器起在不同的物理主機上,我們不可避免的會遭遇到Docker容器的跨主機通信問題。本文就來嘗試一下。
注: 本文首發(fā)于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓
如下圖所示,我們有兩個物理主機1和主機2,我們在各自宿主機上啟動一個centos容器,啟動成功之后,兩個容器分別運行在兩個宿主機之上,默認的IP地址分配如圖所示,這也是Docker自身默認的網(wǎng)絡(luò)。
此時兩臺主機上的Docker容器如何直接通過IP地址進行通信?
一種直接想到的方案便是通過分別在各自主機中 添加路由 來實現(xiàn)兩個centos容器之間的直接通信。我們來試試吧
由于使用容器的IP進行路由,就需要避免不同主機上的容器使用了相同的IP,為此我們應(yīng)該為不同的主機分配不同的子網(wǎng)來保證。于是我們構(gòu)造一下兩個容器之間通信的路由方案,如下圖所示。
各項配置如下:
主機1的IP地址為:192.168.145.128
主機2的IP地址為:192.168.145.129
為主機1上的Docker容器分配的子網(wǎng):172.17.1.0/24
為主機2上的Docker容器分配的子網(wǎng):172.17.2.0/24
這樣配置之后,兩個主機上的Docker容器就肯定不會使用相同的IP地址從而避免了IP沖突。
我們接下來 定義兩條路由規(guī)則 即可:
所有目的地址為172.17.1.0/24的包都被轉(zhuǎn)發(fā)到主機1上
所有目的地址為172.17.2.0/24的包都被轉(zhuǎn)發(fā)到主機2上
綜上所述,數(shù)據(jù)包在兩個容器間的傳遞過程如下:
從container1 發(fā)往 container2 的數(shù)據(jù)包,首先發(fā)往container1的“網(wǎng)關(guān)”docker0,然后通過查找主機1的路由得知需要將數(shù)據(jù)包發(fā)給主機2,數(shù)據(jù)包到達主機2后再轉(zhuǎn)發(fā)給主機2的docker0,最后由其將數(shù)據(jù)包轉(zhuǎn)到container2中;反向原理相同,不再贅述。
我們心里方案想的是這樣,接下來實踐一下看看是否可行。
0x01. 分別對主機1和主機2上的docker0進行配置
編輯主機1上的 /etc/docker/daemon.json 文件,添加內(nèi)容:"bip" : "ip/netmask"
{ "bip", "172.17.1.252/24" }
編輯主機2上的 /etc/docker/daemon.json 文件,添加內(nèi)容:"bip" : "ip/netmask"
{ "bip", "172.17.2.252/24" }
0x02. 重啟docker服務(wù)
主機1和主機2上均執(zhí)行如下命令重啟docker服務(wù)以使修改后的docker0網(wǎng)段生效
systemctl restart docker
0x03. 添加路由規(guī)則
主機1上添加路由規(guī)則如下:
route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.145.129
主機2上添加路由規(guī)則如下:
route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.145.128
0x04. 配置iptables規(guī)則
主機1上添加如下規(guī)則:
iptables -t nat -F POSTROUTING iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -d 172.17.0.0/16 -j MASQUERADE
主機2上添加如下規(guī)則:
iptables -t nat -F POSTROUTING iptables -t nat -A POSTROUTING -s 172.17.2.0/24 ! -d 172.17.0.0/16 -j MASQUERADE
0x05. 啟動容器
主機1上啟動centos容器:
docker run -it --name container1 centos /bin/bash
主機2上啟動centos容器:
docker run -it --name container2 centos /bin/bash
0x06. 容器間直接通信
好了,現(xiàn)在兩容器可以互ping了
本文探討了局域網(wǎng)中不同宿主機間Docker容器直接通信的一種可能方案。當然現(xiàn)在實現(xiàn)跨主機容器間通信的現(xiàn)成方案也很多,典型的比如flannel這種,我的 個人私有云 也用的是這種方案。
作者更多的原創(chuàng)文章在此,歡迎觀賞
My Personal Blog
作者更多的SpringBt實踐文章在此:
Spring Boot應(yīng)用監(jiān)控實戰(zhàn)
SpringBoot應(yīng)用部署于外置Tomcat容器
ElasticSearch搜索引擎在SpringBt中的實踐
初探Kotlin+SpringBoot聯(lián)合編程
Spring Boot日志框架實踐
SpringBoot優(yōu)雅編碼之:Lombok加持
如果有興趣,也可以抽點時間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:
利用K8S技術(shù)棧打造個人私有云 連載文章
從一份配置清單詳解Nginx服務(wù)器配置
Docker容器可視化監(jiān)控中心搭建
利用ELK搭建Docker容器化應(yīng)用日志中心
RPC框架實踐之:Apache Thrift
RPC框架實踐之:Google gRPC
微服務(wù)調(diào)用鏈追蹤中心搭建
Docker容器跨主機通信
Docker Swarm集群初探
高效編寫Dockerfile的幾條準則
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/27354.html
摘要:容器與主機共享同一,共享同一套網(wǎng)絡(luò)協(xié)議棧路由表及規(guī)則等。基本網(wǎng)絡(luò)配置平臺下,容器網(wǎng)絡(luò)資源通過內(nèi)核的機制實現(xiàn)隔離,不同的有各自的網(wǎng)絡(luò)設(shè)備協(xié)議棧路由表防火墻規(guī)則等,反之,同一下的進程共享同一網(wǎng)絡(luò)視圖。設(shè)計的網(wǎng)絡(luò)模型。 整理自《Docker進階與實戰(zhàn)》 Docker網(wǎng)絡(luò)現(xiàn)狀 為了解決容器網(wǎng)絡(luò)性能低下、功能不足的問題,Docker啟動了子項目Libnetwork。Libnetwork提出了新的...
摘要:從分析可以看出,如果程序如果退出后,容器之間的通信將會中斷,這里需要注意。最后通過寫本地子網(wǎng)文件,通過這個文件設(shè)定的網(wǎng)絡(luò)。細心的讀者可能發(fā)現(xiàn)這里的并不是以太網(wǎng)規(guī)定的,這是因為外層的封包還要占據(jù)。 Flannel是cereos開源的CNI網(wǎng)絡(luò)插件,下圖flannel官網(wǎng)提供的一個數(shù)據(jù)包經(jīng)過封包、傳輸以及拆包的示意圖,從這個圖片中可以看出兩臺機器的docker0分別處于不同的段:10.1....
摘要:容器通過獲取一個與同網(wǎng)段的地址,并默認連接到網(wǎng)橋,并將的地址作為網(wǎng)關(guān)實現(xiàn)容器與宿主機的網(wǎng)絡(luò)互通,另外,同一個宿主機下同樣使用模式的容器可以直接通訊。 【技術(shù)沙龍002期】數(shù)據(jù)中臺:宜信敏捷數(shù)據(jù)中臺建設(shè)實踐|宜信技術(shù)沙龍 將于5月23日晚8點線上直播,點擊報名 一、關(guān)于Docker Docker 是一個開源的應(yīng)用容器引擎,基于 Go 語言 并遵從Apache2.0協(xié)議開源。 Docker...
摘要:是一個專為定制的三層網(wǎng)絡(luò)解決方案,主要用于解決容器的跨主機通信問題。收到的數(shù)據(jù)包被轉(zhuǎn)發(fā)到進程。查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到。然后在網(wǎng)絡(luò)層的源和目的均是容器的,虛擬。默認也是使用容器網(wǎng)絡(luò)方案,其官網(wǎng)也清晰的畫出了的。 前言 我們知道docker官方并沒有提供多主機的容器通信方案,單機網(wǎng)絡(luò)的模式主要有host,container,brige,none。none這種模式,顧名思義就是...
摘要:是一個專為定制的三層網(wǎng)絡(luò)解決方案,主要用于解決容器的跨主機通信問題。收到的數(shù)據(jù)包被轉(zhuǎn)發(fā)到進程。查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到。然后在網(wǎng)絡(luò)層的源和目的均是容器的,虛擬。默認也是使用容器網(wǎng)絡(luò)方案,其官網(wǎng)也清晰的畫出了的。 前言 我們知道docker官方并沒有提供多主機的容器通信方案,單機網(wǎng)絡(luò)的模式主要有host,container,brige,none。none這種模式,顧名思義就是...
閱讀 3398·2023-04-25 22:04
閱讀 2197·2021-11-22 15:29
閱讀 2161·2021-10-11 10:57
閱讀 1402·2021-09-24 09:48
閱讀 3147·2021-09-09 09:34
閱讀 2543·2021-09-02 15:21
閱讀 2393·2019-08-30 15:53
閱讀 1120·2019-08-30 14:07