Docker跨服務(wù)器通信Overlay解決方案(上)之 Consul單實(shí)例
場(chǎng)景
公司微服務(wù)快上線(xiàn)了,微服務(wù)都是用Docker容器進(jìn)行部署的,在同一臺(tái)主機(jī)下,把服務(wù)都部署上,注冊(cè)到Nacos的IP與PORT都是內(nèi)網(wǎng)的IP與Dockerfile中定義的端口號(hào),看起來(lái)好像也沒(méi)什么問(wèn)題,通過(guò)網(wǎng)關(guān)去調(diào)用也是可以調(diào)通的,請(qǐng)注意這有一個(gè)大前提:
必須把所有服務(wù)容器部署在同一臺(tái)主機(jī)上時(shí)才可以!
當(dāng)服務(wù)實(shí)例沒(méi)有部署在同一主機(jī)上,比如網(wǎng)關(guān)服務(wù)在A服務(wù)器,服務(wù)a在B服務(wù)器上,同樣注冊(cè)到Nacos (或其它注冊(cè)中心) ,此時(shí)上報(bào)上來(lái)的都是內(nèi)網(wǎng)的IP,那么當(dāng)外部有請(qǐng)求進(jìn)來(lái)的時(shí)候,網(wǎng)關(guān)通過(guò)Nacos的服務(wù)列表,找到了對(duì)應(yīng)的服務(wù)a的內(nèi)網(wǎng)IP,一調(diào)用發(fā)現(xiàn)調(diào)用不通
ps:內(nèi)網(wǎng)怎么會(huì)通……
任務(wù)
微服務(wù)容器可以不在同一臺(tái)服務(wù)器上,互相調(diào)用
想法
- 既然上報(bào)的是內(nèi)網(wǎng)的IP,我直接讓他上報(bào)宿主機(jī)的IP和端口唄
- 使用Docker的host網(wǎng)絡(luò)模式
- 修改部署腳本,通過(guò)shell部署容器時(shí),獲取宿主機(jī)IP與設(shè)置的映射端口號(hào)
- 讓Docker的網(wǎng)絡(luò)互通
分析
以下分別按上邊的“想法”部分來(lái)進(jìn)行說(shuō)明下問(wèn)題
1.翻遍官方文檔與Github,得出的方案又有兩個(gè):
- 固定IP端口,把宿主機(jī)IP與端口寫(xiě)死在配置文件中:看起來(lái)是解決了,但是問(wèn)題是無(wú)法水平擴(kuò)展了 ——勉強(qiáng)能用
- 固定網(wǎng)卡,防止因多網(wǎng)卡環(huán)境上報(bào)錯(cuò)誤IP端口:沒(méi)有用的,進(jìn)入容器中
ifconfig發(fā)現(xiàn)內(nèi)部網(wǎng)卡只有兩個(gè),分別是eth0與lo,對(duì)應(yīng)網(wǎng)卡的IP就是內(nèi)網(wǎng)IP ——還是沒(méi)用
2.使用Docker的Host網(wǎng)絡(luò)模式,你會(huì)發(fā)現(xiàn)IP這回上報(bào)的的確是宿主機(jī)IP,但是端口號(hào)不對(duì)啊……如果自己去通過(guò)shell使用Java參數(shù)傳入待映射的端口號(hào)的話(huà),這種情況理論上是可行的,唯一缺點(diǎn)是docker ps 再也直接看不到端口號(hào)了,需要額外去docker inspect ——可以用
3.映射端口號(hào)可以獲取,但是主機(jī)的網(wǎng)卡名稱(chēng)不同,寫(xiě)死后不靈活,如果有的是eth0,有的是ens33呢?還有更多不可測(cè)的情況! ——或許可用
4.通過(guò)一些成熟的Docker容器網(wǎng)絡(luò)共享,但是會(huì)有一定的性能損耗 ——完全可用
概念與選型
最穩(wěn)妥的辦法——使用Docker網(wǎng)絡(luò)共享,在搜索引擎的幫助下,我決定用Overlay的方式來(lái)實(shí)現(xiàn)效果
以下簡(jiǎn)單說(shuō)下Overlay:
容器在兩個(gè)跨主機(jī)進(jìn)行通信的時(shí)候,是使用overlay network這個(gè)網(wǎng)絡(luò)模式進(jìn)行通信;如果使用host也可以實(shí)現(xiàn)跨主機(jī)進(jìn)行通信,直接使用這個(gè)物理的ip地址就可以進(jìn)行通信。overlay它會(huì)虛擬出一個(gè)網(wǎng)絡(luò)比如10.0.2.3這個(gè)ip地址。在這個(gè)overlay網(wǎng)絡(luò)模式里面,有一個(gè)類(lèi)似于服務(wù)網(wǎng)關(guān)的地址,然后把這個(gè)包轉(zhuǎn)發(fā)到物理服務(wù)器這個(gè)地址,最終通過(guò)路由和交換,到達(dá)另一個(gè)服務(wù)器的ip地址。

想要實(shí)現(xiàn)Overlay網(wǎng)絡(luò),需要引入一個(gè)K-V數(shù)據(jù)庫(kù),來(lái)保存網(wǎng)絡(luò)狀態(tài)信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的K-V數(shù)據(jù)庫(kù)
我們這里使用 Consul,相比其它K-V數(shù)據(jù)庫(kù),Consul提供的界面化方便管理,所以這里使用Consul實(shí)現(xiàn)Overlay

通過(guò)讓每個(gè)服務(wù)器的Docker daemon將自己的IP注冊(cè)到Consul中,來(lái)共享Docker內(nèi)網(wǎng),這里共享的內(nèi)網(wǎng)是Overlay網(wǎng)絡(luò)模式的,也只有在注冊(cè)的Docker環(huán)境下使用同overlay網(wǎng)絡(luò)的容器,才能互相通訊
ps: 創(chuàng)建完成后,不使用overlay網(wǎng)絡(luò)的跨服務(wù)器容器,不能ping通
小試身手
單節(jié)點(diǎn)的Consul實(shí)現(xiàn)Overlay網(wǎng)絡(luò),使用Docker鏡像
環(huán)境說(shuō)明
| 服務(wù)器OS | 主機(jī)IP | Docker版本 | 網(wǎng)卡名 |
|---|---|---|---|
| Ubuntu Server 18.04 LTS | 192.168.87.133 | 18.09.6 | ens33 |
| Ubuntu Server 18.04 LTS | 192.168.87.139 | 18.09.7 | ens33 |
本測(cè)試環(huán)境適用于Systemd管理的Linux發(fā)行版
Consul沒(méi)有使用非官方的progrium/consul,主要是因?yàn)檫@個(gè)鏡像實(shí)在太老了,四年前的如果有漏洞也沒(méi)能及時(shí)修復(fù),所以自己去<hub.docker.com>去趟了遍官方的坑!??
注意事項(xiàng)
每臺(tái)運(yùn)行docker的主機(jī)都不能同hostname,可以使用
$ sudo hostnamectl set-hostname your-new-hostname
同hostname會(huì)導(dǎo)致同名的主機(jī)docker無(wú)法互相通信
動(dòng)手做
準(zhǔn)備Consul使用鏡像在133服務(wù)器上啟動(dòng),所以可以先配置下Docker daemon的啟動(dòng)參數(shù)指向133服務(wù)器
分別修改133、139兩臺(tái)服務(wù)器的docker.service
$ ifconfig
#已經(jīng)去除干擾網(wǎng)卡,記錄網(wǎng)卡名為ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.87.133 netmask 255.255.255.0 broadcast 192.168.87.255
inet6 fe80::20c:29ff:fe02:e00a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:02:e0:0a txqueuelen 1000 (Ethernet)
RX packets 156739 bytes 233182466 (233.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 45173 bytes 2809606 (2.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ vim /etc/docker/daemon.json

保存退出.
cluster-store:配置的Consul的leader地址,單體直接寫(xiě),其它軟件注意協(xié)議cluster-advertise: 指定監(jiān)聽(tīng)的網(wǎng)卡和端口,也可以指定接收訂閱消息的IP:PORT
還有一種是直接修改docker.service的,參考如下:
$ cd /etc/systemd/system/multi-user.target.wants $ sudo vim docker.service
找到ExecStart= 字眼,在此行末尾添加如下代碼
--cluster-store=consul://192.168.87.133:8500 --cluster-advertise=ens33:2375
效果如下:

操作效果與以上方法保持一致
接著執(zhí)行命令,重啟docker服務(wù),另一臺(tái)服務(wù)器操作方式相同,注意網(wǎng)卡名稱(chēng)
$ sudo systemctl daemon-reload && sudo systemctl restart docker
在133服務(wù)器啟動(dòng)Consul服務(wù)
docker run -d --network host -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2
用主機(jī)模式的原因是防止有些端口沒(méi)有映射出來(lái),還有就是想讓Consul識(shí)別外部網(wǎng)卡的方式只能host模式,下面給個(gè)非host的方式
$ docker run -di -h consul -p 8500:8500 --name=consul consul:1.5.2
創(chuàng)建Docker overlay共享網(wǎng)絡(luò)
$ docker network create -d overlay my_overlay
這里與普通創(chuàng)建網(wǎng)絡(luò)不同在于指定了overlay模式的網(wǎng)絡(luò),-d也可以寫(xiě)為--driver
訪(fǎng)問(wèn)Consul的頁(yè)面,如我的是192.168.87.133:8500

我們的配置在Key/Value處,

點(diǎn)擊docker -> nodes


出現(xiàn)上邊的兩個(gè)節(jié)點(diǎn),分別是兩個(gè)docker daemon (守護(hù)進(jìn)程) 注冊(cè)的值
測(cè)試
新建兩個(gè)centos的容器分別在兩臺(tái)服務(wù)器上,使用overlay 我們剛才創(chuàng)建的網(wǎng)絡(luò)
133服務(wù)器
$ docker run -di --network my_overlay --name mycentos1 centos:7
139服務(wù)器
$ docker run -di --network my_overlay --name mycentos2 centos:7
--net全拼為--network,--開(kāi)頭的可不加=
查看133服務(wù)器mycentos1容器的IP
$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos1
10.0.1.2
查看139服務(wù)器mycentos2容器的IP
$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos2
10.0.1.3
分別從133服務(wù)器ping 139服務(wù)器的mycentos2的內(nèi)網(wǎng)IP

反過(guò)來(lái)ping也是一樣的,但是并不是讓我們通過(guò)外部去訪(fǎng)問(wèn)的,通過(guò)同一overlay網(wǎng)絡(luò)的容器就可以,不信我們作如下嘗試
133服務(wù)器
$ docker exec -it mycentos1 bash # ping 10.0.1.3

訪(fǎng)問(wèn)得通,沒(méi)有丟包,反過(guò)來(lái)也是一樣的,篇幅有限就不試驗(yàn)了
這起碼說(shuō)明,現(xiàn)在的服務(wù)的確已經(jīng)網(wǎng)絡(luò)互通了,下篇文章我們來(lái)搞下生產(chǎn)用的集群方式
引文
技術(shù)漫談 | docker overlay網(wǎng)絡(luò)實(shí)現(xiàn)
Docker跨主機(jī)網(wǎng)絡(luò)——overlay
本文系Hellxz學(xué)習(xí)與實(shí)踐文章,禁止布布扣、碼迷等第三方爬蟲(chóng)網(wǎng)站爬取
到此這篇關(guān)于Docker跨服務(wù)器通信Overlay解決方案(上)之 Consul單實(shí)例的文章就介紹到這了,更多相關(guān)Docker Overlay網(wǎng)絡(luò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- docker overlay2 文件夾比較大處理步驟
- 如何清理docker的overlay2 目錄
- docker overlay擴(kuò)容問(wèn)題
- Docker深度清除鏡像緩存overlay2的實(shí)現(xiàn)
- Docker Overlay2磁盤(pán)空間占用過(guò)大清理的方法實(shí)現(xiàn)
- Docker容器跨主機(jī)通信overlay網(wǎng)絡(luò)的解決方案
- docker overlay實(shí)現(xiàn)跨主機(jī)的容器互通的方法
- docker容器間跨宿主機(jī)通信-基于overlay的實(shí)現(xiàn)方法
- docker清理大殺器/docker的overlay文件占用磁盤(pán)太大的解決
- docker中Overlay網(wǎng)絡(luò)的使用小結(jié)
相關(guān)文章
國(guó)內(nèi)服務(wù)器配置Docker國(guó)內(nèi)源(極限加速)
本文主要介紹了國(guó)內(nèi)服務(wù)器配置Docker國(guó)內(nèi)源,用戶(hù)可以在CentOS服務(wù)器上成功安裝并使用國(guó)內(nèi)鏡像加速器來(lái)提升Docker的使用,感興趣的可以了解一下2025-02-02
docker安裝Adminer并支持mysql和mongodb的詳細(xì)步驟
這篇文章主要介紹了docker安裝Adminer并支持mysql和mongodb,通過(guò)查找并拉取Adminer鏡像,啟動(dòng)docker,支持mysq,本文分步驟給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10
Docker部署XXL-JOB分布式任務(wù)調(diào)度中心的完整指南
XXL-Job是一個(gè)開(kāi)源的分布式任務(wù)調(diào)度中心,它提供了一個(gè)可視化的任務(wù)管理界面,可以方便地創(chuàng)建,編輯和監(jiān)控任務(wù),本文小編就來(lái)和大家詳細(xì)講講Docker如何部署XXL-JOB吧2025-06-06
docker安裝redis 5.0.7并掛載外部配置和數(shù)據(jù)問(wèn)題
Redis 是一個(gè)開(kāi)源的使用 ANSI C 語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value 的 NoSQL 數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的 API。這篇文章主要介紹了docker安裝redis 5.0.7并掛載外部配置和數(shù)據(jù),需要的朋友可以參考下2019-12-12
Idea通過(guò)docker compose?發(fā)布項(xiàng)目的過(guò)程
這篇文章主要介紹了Idea結(jié)合docker-compose發(fā)布項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
docker修改容器內(nèi)存大小的實(shí)現(xiàn)方式
我們使用docker時(shí),經(jīng)常會(huì)遇到docker容器使用內(nèi)存大于docker宿主機(jī)內(nèi)存,導(dǎo)致宿主機(jī)奔潰,從而影響其他宿主機(jī)上容器的運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于docker修改容器內(nèi)存大小的相關(guān)資料,需要的朋友可以參考下2022-09-09

