云原生之Docker容器跨主機(jī)指定IP通信
??想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:??
一、前言
1、使用場景
對開發(fā)者而言,隨著容器的普遍使用,開發(fā)者可以很方便的搭建項(xiàng)目的簡易測試環(huán)境。有時(shí)候?yàn)榱隧?xiàng)目可以在任意機(jī)器一鍵運(yùn)行,不用配置連接IP等信息。所以希望可以提前固定容器的IP地址,而且一個(gè)項(xiàng)目有時(shí)候涉及多個(gè)容器,可能還會(huì)部署在多臺(tái)機(jī)器上。所以如果容器間可以固定IP跨機(jī)器通信的話,會(huì)有很大方便。
2、docker網(wǎng)絡(luò)
- docker容器默認(rèn)是一個(gè)有自己獨(dú)立網(wǎng)絡(luò)空間的虛擬系統(tǒng)。
- docker安裝后自動(dòng)創(chuàng)建3中網(wǎng)絡(luò):bridge、host、none。
- bridge:網(wǎng)橋模式,默認(rèn)創(chuàng)建docker0網(wǎng)橋,172.17.0.0/16,宿主機(jī)可訪問,外部機(jī)器不可見。
- host:共享宿主機(jī)網(wǎng)絡(luò)模式,外部主機(jī)與容器直接通信,容器缺少了隔離性。
- none:禁用網(wǎng)絡(luò)模式。
- docker自定義網(wǎng)絡(luò)
docker提供了三種自定義網(wǎng)絡(luò)驅(qū)動(dòng):bridge、overlay、macvlan。
- bridge驅(qū)動(dòng)類似默認(rèn)的bridge網(wǎng)絡(luò)模式。
- overlay和macvlan是用于創(chuàng)建跨主機(jī)網(wǎng)絡(luò)。
- 支持自定義網(wǎng)段、網(wǎng)關(guān),docker network create --subnet 172.77.0.0/24 --gateway 172.77.0.1 my_net。
- docker創(chuàng)建容器使用默認(rèn)docker0網(wǎng)絡(luò)不支持自定義固定IP,都是動(dòng)態(tài)的。
3、自定義網(wǎng)絡(luò)使用
- 自定義創(chuàng)建網(wǎng)段。docker network create --subnet=172.18.0.0/16 spark-net。
- 指定網(wǎng)絡(luò)驅(qū)動(dòng)docker network create -d overlay --subnet 10.22.1.0/24 --gateway 10.22.1.1 spark-net-0。
- 創(chuàng)建容器固定IP。
docker run --name cloud1 \
--net spark-net --ip 172.18.0.2 \
-h cloud1 \
-it ubuntu
docker run --name cloud1_0 \
--network spark-net-0 --ip 10.22.1.26 \
-h cloud1 \
-it ubuntu
二、實(shí)踐操作
1、Overlay網(wǎng)絡(luò)模式詳解
- Overlay網(wǎng)絡(luò)是目前比較主流的跨節(jié)點(diǎn)容器間數(shù)據(jù)傳輸和路由方案。
- Overlay網(wǎng)絡(luò)模式在主機(jī)網(wǎng)絡(luò)之上,在多個(gè)Docker主機(jī)之間實(shí)現(xiàn)分布式網(wǎng)絡(luò),允許跨容器之間的交互。
- Overlay網(wǎng)絡(luò)是指在不改變現(xiàn)有網(wǎng)絡(luò)基礎(chǔ)設(shè)施的前提下,通過某種約定通信協(xié)議,把二層報(bào)文封裝在IP報(bào)文之上的新的數(shù)據(jù)格式。
2、Consul服務(wù)發(fā)現(xiàn)
- Consul是一個(gè)分布式、高可用性和多數(shù)據(jù)中心感知工具,用于服務(wù)發(fā)現(xiàn)、配置和編排。Consul 支持大規(guī)模快速部署、配置和維護(hù)面向服務(wù)的架構(gòu)。
- 部署單節(jié)點(diǎn)的consul服務(wù)(可選擇公網(wǎng)服務(wù)器,或者能與其他部署容器通信的主機(jī))。
# 拉取鏡像
docker pull progrium/consul
# 運(yùn)行consul容器
docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
# -h:表示consul的主機(jī)名
# --name consul:表示為該容器名
# --restart=always表示可以隨著docker服務(wù)的啟動(dòng)而啟動(dòng);
# 運(yùn)行consul容器,該服務(wù)的默認(rèn)端口是8500;-p:表示將容器的8500端口映射到宿主機(jī)的8500端口
# -serve -bootstarp:表示當(dāng)在群集中,加上這兩個(gè)選項(xiàng)可以使其以master的身份出現(xiàn)
- 管理訪問地址
http://IP:8500/ui/#/dc1/kv/docker/nodes/。
3、修改docker配置
# 所有需要通信的機(jī)器都需要修改
vim /etc/docker/daemon.json
# 增加 cluster-store、cluster-advertise兩個(gè)參數(shù)
{
"registry-mirrors": ["https://xxxx.xxxx.aliyuncs.com","https://registry.docker-cn.com"],
"cluster-store": "consul://IP:8500",
"cluster-advertise": "ens33:2376"
}
# cluster-store,是配置sonsul集群的訪問地址
# cluster-advertise,是廣播通信地址和端口
# 重啟docker
systemctl daemon-reload
systemctl restart docker
#如果有端口拒絕訪問問題,可直接關(guān)掉防火墻
#停止firewall
systemctl stop firewalld.service
#禁止firewall開機(jī)啟動(dòng)
systemctl disable firewalld.service
#查看開放端口列表
firewall-cmd --list-ports
4、實(shí)踐機(jī)器規(guī)劃
本文實(shí)踐創(chuàng)建了3臺(tái)虛機(jī):192.168.17.150 192.168.17.151 192.168.17.152。
5、創(chuàng)建overlay網(wǎng)絡(luò)
- 選其中一臺(tái)機(jī)器執(zhí)行,例如在192.168.17.150執(zhí)行
# 創(chuàng)建overlay網(wǎng)絡(luò),并自定義制定網(wǎng)段以及網(wǎng)關(guān)
# 可以通過制定不同的網(wǎng)段,以隔離不同的服務(wù)
docker network create -d overlay --subnet 10.22.1.0/24 --gateway 10.22.1.1 spark-net
# 每臺(tái)機(jī)器查看創(chuàng)建的網(wǎng)絡(luò)
docker network ls
# 查看具體信息
docker network inspect spark-net
- 刪除網(wǎng)絡(luò)命令
# 刪除自定義網(wǎng)絡(luò)
docker network rm spark-net
# 如果有已連接的,先斷開連接
docker network disconnect -f net-spark con1
- 注意
例如:在cloud1機(jī)器上,可以執(zhí)行docker network disconnect -f spark-net cloud2但是執(zhí)行docker network disconnect -f spark-net cloud1就無效,必須跨機(jī)器執(zhí)行斷連。
6. 跨主機(jī)創(chuàng)建容器驗(yàn)證
本文依賴上篇文章創(chuàng)建了3個(gè)容器, 可查看 ??Docker搭建大數(shù)據(jù)平臺(tái)之Hadoop,Spark,Hive初探??。
192.168.17.150機(jī)器上執(zhí)行。
docker run --name cloud1 \
-p 50070:50070 \
-p 8088:8088 \
-p 8080:8080 \
-p 7077:7077 \
-p 9000:9000 \
-p 16010:16010 \
--network net-spark --ip 10.22.1.26 \
-h cloud1 \
--add-host cloud1:10.22.1.26 \
--add-host cloud2:10.22.1.27 \
--add-host cloud3:10.22.1.28 \
-it spark:v4
192.168.17.151機(jī)器上執(zhí)行。
docker run --name cloud2 \
--network net-spark --ip 10.22.1.27 \
-h cloud2 \
--add-host cloud1:10.22.1.26 \
--add-host cloud2:10.22.1.27 \
--add-host cloud3:10.22.1.28 \
-it spark:v4
192.168.17.152機(jī)器上執(zhí)行。
docker run --name cloud3 \
--network net-spark --ip 10.22.1.28 \
-h cloud3 \
--add-host cloud1:10.22.1.26 \
--add-host cloud2:10.22.1.27 \
--add-host cloud3:10.22.1.28 \
-it spark:v4
可分別在三個(gè)容器內(nèi)互相ping IP10.22.1.26、10.22.1.27、10.22.1.28驗(yàn)證。
三、常見問題
1、如遇錯(cuò)誤常用命令
- 如果網(wǎng)絡(luò)改動(dòng),需要重啟docker
systemctl daemon-reload
systemctl restart docker
- 關(guān)掉防火墻
# 停止firewall
systemctl stop firewalld.service
# 禁止firewall開機(jī)啟動(dòng)
systemctl disable firewalld.service
# 查看開放端口列表
firewall-cmd --list-ports
# 開放端口
firewall-cmd --zone=public --add-port=2379/tcp --permanent
# 重新載入
firewall-cmd --reload
2、將容器以指定IP鏈接到自定義網(wǎng)絡(luò)中
#容器cloud3以IP10.22.1.28鏈接到overlay網(wǎng)絡(luò)spark-net
docker network connect --ip 10.22.1.28 spark-net cloud3
3、將容器從自定義網(wǎng)絡(luò)中刪除
# 注意不可在當(dāng)前容器里執(zhí)行斷連
# 例如 需要斷連容器cloud2,則需要在容器cloud1中執(zhí)行如下命令
docker network disconnect -f spark-net cloud2
4、manager節(jié)點(diǎn)無法接入
docker.service配置 -H tcp://0.0.0.0:2376 --cluster-store=consul://121.4.138.199:8500 --cluster-advertise=ens33:2376 并不能正確執(zhí)行,原理暫未知。