Docker容器跨主機通訊之 直接路由方式

2021-09-13 17:09:14 字數 2520 閱讀 7766

就目前docker自身預設的網路來說,單台主機上的不同docker容器可以借助docker0網橋直接通訊,這沒毛病,而不同主機上的docker容器之間只能通過在主機上用對映埠的方法來進行通訊,有時這種方式會很不方便,甚至達不到我們的要求,因此位於不同物理機上的docker容器之間直接使用本身的ip位址進行通訊很有必要。再者說,如果將docker容器起在不同的物理主機上,我們不可避免的會遭遇到docker容器的跨主機通訊問題。本文就來嘗試一下。

codesheep,可長按掃瞄下面的小心心來訂閱 ↓ ↓ ↓

如下圖所示,我們有兩個物理主機1和主機2,我們在各自宿主機上啟動乙個centos容器,啟動成功之後,兩個容器分別執行在兩個宿主機之上,預設的ip位址分配如圖所示,這也是docker自身預設的網路。

此時兩台主機上的docker容器如何直接通過ip位址進行通訊?

一種直接想到的方案便是通過分別在各自主機中新增路由來實現兩個centos容器之間的直接通訊。我們來試試吧

由於使用容器的ip進行路由,就需要避免不同主機上的容器使用了相同的ip,為此我們應該為不同的主機分配不同的子網來保證。於是我們構造一下兩個容器之間通訊的路由方案,如下圖所示。

各項配置如下:

為主機1上的docker容器分配的子網:172.17.1.0/24

為主機2上的docker容器分配的子網:172.17.2.0/24

這樣配置之後,兩個主機上的docker容器就肯定不會使用相同的ip位址從而避免了ip衝突。

我們接下來定義兩條路由規則即可:

綜上所述,資料報在兩個容器間的傳遞過程如下:

我們心裡方案想的是這樣,接下來實踐一下看看是否可行。

主機1和主機2上均執行如下命令重啟docker服務以使修改後的docker0網段生效

systemctl restart docker
主機1上新增路由規則如下:

route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.145.129
主機2上新增路由規則如下:

route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.145.128
主機1上新增如下規則:

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上新增如下規則:

iptables -t nat -f postrouting

iptables -t nat -a postrouting -s 172.17.2.0/24 ! -d 172.17.0.0/16 -j masquerade

主機1上啟動centos容器:

docker run -it --name container1 centos /bin/bash
主機2上啟動centos容器:

docker run -it --name container2 centos /bin/bash
好了,現在兩容器可以互ping了

本文**了區域網中不同宿主機間docker容器直接通訊的一種可能方案。當然現在實現跨主機容器間通訊的現成方案也很多,典型的比如flannel這種,我的 個人私有雲 也用的是這種方案。

如果有興趣,也可以抽點時間看看作者一些關於容器化、微服務化方面的文章:

Docker容器跨主機通訊

兩台主機上的docker容器直接通過ip位址進行通訊 各項配置如下 docker version 1.13.1 ip資訊根據個人需求部署 主機1的ip位址為 192.168.1.128 主機2的ip位址為 192.168.1.129 為主機1上的docker容器分配的子網 172.17.1.0 24...

docker跨主機容器通訊

docker 網路模式詳解 路由器位址192.168.1.1用route n檢視 parent enp7s0的乙太網名用ifcofig查詢 apt install net tools iputils ping ydocker network create driver macvlan subnet ...

Docker容器跨主機通訊

預設情況下docker容器需要跨主機通訊兩個主機節點都需要在同乙個網段下,這時只要兩個docker容器的宿主機能相互通訊並且該容器使用net網路模式,改實現方式為網橋模式通訊 除此之外我們還可以通過使用第三方工具為不同主機間建立乙個覆蓋網路,使之能夠跨節點通訊,這裡將使用flanneld實現 建立 ...