原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
原文連接地址:『中級篇』overlay網絡和etcd實現多機的容器通訊(31)node
前面的課程主要集中在同一個docker,同一個linux機器,不一樣的容器以前是如何通訊。此次主要說的不一樣機器以前如何通訊。這篇的源碼在:github.com/limingios/d… 中的docke/No.2/labs/flask-redis/linux
覆蓋網絡(overlay network [1] )簡單說來覆蓋網絡就是應用層網絡,它是面向應用層的,不考慮或不多考慮網絡層,物理層的問題,說白了就是2個不在一塊兒的網絡組成對應的網絡,方便通訊的方式。ios
以前創建的docker-node1 和docker-node2 如今啓動他們 看看他們以前是否能夠ping通git
vagrant ssh docker-node1
ip a
複製代碼
vagrant ssh docker-node2
ip a
複製代碼
#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個機器是互通的。github
也就是docker1的172.17.0.2 ping一下docker2的172.17.0.3 實際上是ping不通的,由於他們不在同一個網絡,若是想通訊有沒有方式,其實暴露端口的方式-p 也是能夠的,還有一個更好的方式 就是經過vxlan的方式。redis
這裏不講解VXLAN啦,我也不太熟悉,如今說的分佈式存儲的方式來完成docker1內部的容器和docker2內部的容器之間的通訊。經過的技術是:etcd的分佈式存儲方式來完成。docker
隨着CoreOS和Kubernetes等項目在開源社區日益火熱,它們項目中都用到的etcd組件做爲一個高可用、強一致性的服務發現存儲倉庫,漸漸爲開發人員所關注。在雲計算時代,如何讓服務快速透明地接入到計算集羣中,如何讓共享配置信息快速被集羣中的全部機器發現,更爲重要的是,如何構建這樣一套高可用、安全、易於部署以及響應快速的服務集羣,已經成爲了迫切須要解決的問題。etcd爲解決這類問題帶來了福音。flask
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
複製代碼
#注意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&
複製代碼
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
複製代碼
#注意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&
複製代碼
./etcdctl cluster-heallth
sudo service docker stop
複製代碼
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
複製代碼
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
複製代碼
sudo docker network create -d overlay demo
sudo docker network ls
複製代碼
#docker-node1建立了overlay網絡後,node2也建立了。這是爲何呢?其實這就是etcd幫我們作的。
sudo docker network ls
複製代碼
sudo docker network inspect demo
複製代碼
sudo docker run -d --name tes11t1--net demo busybox sh -c "while true; do sleep 3600; done"
sudo docker ps
複製代碼
#說有相同容器已經存在了,不容許建立。若是在同一臺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
複製代碼
sudo docker exec tes11t1 ip a
複製代碼
sudo docker exec test111 ip a
複製代碼
sudo docker network inspect demo
複製代碼
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
複製代碼
PS:本次經過第三方工具etcd分佈式的方式完成2臺機器,2個容器組件網絡,實現相互的訪問,這裏只是經過ping的方式,若是按照上次說的 flask-redis,能夠一臺是redis 一臺是flask 應該也是能夠通訊的。多機的方式基本就是這樣。bash