您當前的位置:首頁 > 書法

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

作者:由 IT架構圈 發表于 書法時間:2018-11-25

前面的課程主要集中在同一個docker,同一個linux機器,不同的容器之前是如何通訊。這次主要說的不同機器之前如何通訊。這篇的原始碼在:

https://

github。com/limingios/do

cker。git

中的docke/No。2/labs/flask-redis/

覆蓋網路(overlay network [1] )簡單說來覆蓋網路就是應用層網路,它是面向應用層的,不考慮或很少考慮網路層,物理層的問題,說白了就是2個不在一起的網路組成對應的網路,方便通訊的方式。

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

這次按照上次講解,做個多機器之前的通訊 flask-redis 和redis 在不同的機器上

之前建立的docker-node1 和docker-node2 現在啟動他們 看看他們之前是否可以ping通

啟動2個視窗,檢視各自的ip 資訊

docker-node1

vagrant ssh docker-node1

ip a

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

docker-node2

vagrant ssh docker-node2

ip a

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

互相ping下

#docker-node1 裡面ping 172。28。128。4 直接訪問node2

ping 172。28。128。4

#docker-node2 裡面ping 172。28。128。3 直接訪問node1

ping 172。28。128。3

說明這2個機器是互通的。

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

現在我用docker內部的ip 互相ping

也就是docker1的172。17。0。2 ping一下docker2的172。17。0。3 其實是ping不通的,因為他們不在同一個網路,如果想通訊有沒有方式,其實暴露埠的方式-p 也是可以的,還有一個更好的方式 就是透過vxlan的方式。

什麼是VXLAN?

VXLAN-Virtual eXtensible Local Area Network(虛擬化可擴充套件區域網)

VXLAN是NVO3(Network Virtualization over Layer3)中的一種網路虛擬化技術,透過將VM或物理伺服器發出的資料包封裝在UDP中,並使用物理網路的IP/MAC作為報文頭進行封裝,然後在IP網路上傳輸,到達目的地後由隧道終結點解封裝並將資料傳送給目標虛擬機器或物理伺服器。

這裡不講解VXLAN啦,我也不太熟悉,現在說的分散式儲存的方式來完成docker1內部的容器和docker2內部的容器之間的通訊。透過的技術是:etcd的分散式儲存方式來完成。

etcd的2臺機器安裝

隨著CoreOS和Kubernetes等專案在開源社群日益火熱,它們專案中都用到的etcd元件作為一個高可用、強一致性的服務發現儲存倉庫,漸漸為開發人員所關注。在雲計算時代,如何讓服務快速透明地接入到計算叢集中,如何讓共享配置資訊快速被叢集中的所有機器發現,更為重要的是,如何構建這樣一套高可用、安全、易於部署以及響應快速的服務叢集,已經成為了迫切需要解決的問題。etcd為解決這類問題帶來了福音。

分散式主要就是為了多臺機器,每個機器裡面的容器分到的ip都不相同,這樣讓這些容器組織成一個網路的話,他們之前就可以進行通訊了,因為ip和名稱都是唯一的。不會帶來衝突。

docker-node1上安裝etcd

sudo yum -y install wget

wget https://github。com/coreos/etcd/releases/download/v3。0。12/etcd-v3。0。12-linux-amd64。tar。gz

tar zxvf etcd-v3。0。12-linux-amd64。tar。gz

cd etcd-v3。0。12-linux-amd64

#檢視ip地址 172。28。128。3

ip a

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

#注意ip地址的修改,不同的機器可能不相同。透過ip a檢視

nohup 。/etcd ——name docker-node1 ——initial-advertise-peer-urls http://172。28。128。3:2380 \

——listen-peer-urls http://172。28。128。3:2380 \

——listen-client-urls http://172。28。128。3:2379,http://127。0。0。1:2379 \

——advertise-client-urls http://172。28。128。3:2379 \

——initial-cluster-token etcd-cluster \

——initial-cluster docker-node1=http://172。28。128。3:2380,docker-node2=http://172。28。128。4:2380 \

——initial-cluster-state new&

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

docker-node2 上安裝etcd

sudo yum -y install wget

wget https://github。com/coreos/etcd/releases/download/v3。0。12/etcd-v3。0。12-linux-amd64。tar。gz

tar zxvf etcd-v3。0。12-linux-amd64。tar。gz

cd etcd-v3。0。12-linux-amd64

#檢視ip地址 172。28。128。4

ip a

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

#注意ip地址的修改,不同的機器可能不相同。透過ip a檢視

nohup 。/etcd ——name docker-node1 ——initial-advertise-peer-urls http://172。28。128。4:2380 \

——listen-peer-urls http://172。28。128。4:2380 \

——listen-client-urls http://172。28。128。4:2379,http://127。0。0。1:2379 \

——advertise-client-urls http://172。28。128。4:2379 \

——initial-cluster-token etcd-cluster \

——initial-cluster docker-node1=http://172。28。128。3:2380,docker-node2=http://172。28。128。4:2380 \

——initial-cluster-state new&

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

docker-node1 和 docker-node2 共同操作檢視狀態

。/etcdctl cluster-heallth

sudo service docker stop

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

docker-node1 和docker-node2 分別操作

docker-node1

sudo /usr/bin/dockerd -H tcp://0。0。0。0:2375 -H unix:///var/run/docker。sock ——cluster-store=etcd://172。28。128。3:2379 ——cluster-advertise=172。28。128。3:2375&

exit

vagrant ssh docker-node1

sudo docker network ls

docker-node2

sudo /usr/bin/dockerd -H tcp://0。0。0。0:2375 -H unix:///var/run/docker。sock ——cluster-store=etcd://172。28。128。4:2379 ——cluster-advertise=172。28。128。4:2375&

exit

vagrant ssh docker-node2

sudo docker network ls

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

docker-node1

sudo docker network create -d overlay demo

sudo docker network ls

docker-node2

#docker-node1建立了overlay網路後,node2也建立了。這是為什麼呢?其實這就是etcd幫咱們做的。

sudo docker network ls

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

docker-node1 檢視網路資訊

sudo docker network inspect demo

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

建立連線demo網路的容器

建立docker-node1內部的容器tes11t1

sudo docker run -d ——name tes11t1——net demo busybox sh -c “while true; do sleep 3600; done”

sudo docker ps

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

image。png

建立docker-node2內部的容器tes11t1

#說有相同容器已經存在了,不允許建立。如果在同一臺docker機器上不允許名稱一樣的,說明這2個docker-node1 和docker-node2 已經在同一個網路空間內了

sudo docker run -d ——name tes11t1——net demo busybox sh -c “while true; do sleep 3600; done”

#更改一個名稱,可以成功建立

sudo docker run -d ——natme test111——net demo busybox sh -c “while true; do sleep 3600; done”

sudo docker ps

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

docker-node1中的容器,檢視tes11t1的ip地址

sudo docker exec tes11t1 ip a

docker-node2中的容器,檢視tes11t1的ip地址

sudo docker exec test111 ip a

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

檢視下demo的network

sudo docker network inspect demo

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

試試2個容器能否互相ping通

docker-node2

sudo docker exec test111 ping 10。0。0。2

sudo docker exec test111 ping tes11t1

docker-node1

sudo docker exec tes11t1 ping 10。0。0。3

sudo docker exec tes11t1 ping test111

『中級篇』docker之overlay網路和etcd實現多機的容器通訊(31)

PS:本次透過第三方工具etcd分散式的方式完成2臺機器,2個容器元件網路,實現相互的訪問,這裡只是透過ping的方式,如果按照上次說的 flask-redis,可以一臺是redis 一臺是flask 應該也是可以通訊的。多機的方式基本就是這樣。

標簽: docker  172  28  128  etcd