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

原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
原文連接地址:『中級篇』overlay網絡和etcd實現多機的容器通訊(31)node

前面的課程主要集中在同一個docker,同一個linux機器,不一樣的容器以前是如何通訊。此次主要說的不一樣機器以前如何通訊。這篇的源碼在:github.com/limingios/d… 中的docke/No.2/labs/flask-redis/linux

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


此次按照上次講解,作個多機器以前的通訊 flask-redis 和redis 在不一樣的機器上

以前創建的docker-node1 和docker-node2 如今啓動他們 看看他們以前是否能夠ping通git

  • 啓動2個窗口,查看各自的ip 信息
  1. docker-node1
vagrant ssh docker-node1
ip a
複製代碼

  1. docker-node2
vagrant ssh docker-node2
ip a
複製代碼

  • 互相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個機器是互通的。github


  • 如今我用docker內部的ip 互相ping

也就是docker1的172.17.0.2 ping一下docker2的172.17.0.3 實際上是ping不通的,由於他們不在同一個網絡,若是想通訊有沒有方式,其實暴露端口的方式-p 也是能夠的,還有一個更好的方式 就是經過vxlan的方式。redis

  • 什麼是VXLAN?
    VXLAN-Virtual eXtensible Local Area Network(虛擬化可擴展局域網)
    VXLAN是NVO3(Network Virtualization over Layer3)中的一種網絡虛擬化技術,經過將VM或物理服務器發出的數據包封裝在UDP中,並使用物理網絡的IP/MAC做爲報文頭進行封裝,而後在IP網絡上傳輸,到達目的地後由隧道終結點解封裝並將數據發送給目標虛擬機或物理服務器。

這裏不講解VXLAN啦,我也不太熟悉,如今說的分佈式存儲的方式來完成docker1內部的容器和docker2內部的容器之間的通訊。經過的技術是:etcd的分佈式存儲方式來完成。docker

etcd的2臺機器安裝

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

  • 分佈式主要就是爲了多臺機器,每一個機器裏面的容器分到的ip都不相同,這樣讓這些容器組織成一個網絡的話,他們以前就能夠進行通訊了,由於ip和名稱都是惟一的。不會帶來衝突。
  1. 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
複製代碼

#注意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&
複製代碼

  1. 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
複製代碼

#注意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&
複製代碼

  1. docker-node1 和 docker-node2 共同操做查看狀態
./etcdctl cluster-heallth
sudo service docker stop
複製代碼


  1. 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-node1
sudo docker network create -d overlay demo
sudo docker network ls
複製代碼
  • docker-node2
#docker-node1建立了overlay網絡後,node2也建立了。這是爲何呢?其實這就是etcd幫我們作的。
sudo docker network ls
複製代碼

  • docker-node1 查看網絡信息
sudo docker network inspect demo
複製代碼

建立鏈接demo網絡的容器
  • 建立docker-node1內部的容器tes11t1
sudo docker run -d --name tes11t1--net demo busybox sh -c "while true; do sleep 3600; done"
sudo docker ps
複製代碼
image.png
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-node1中的容器,查看tes11t1的ip地址
sudo docker exec tes11t1 ip a
複製代碼
  • docker-node2中的容器,查看tes11t1的ip地址
sudo docker exec test111 ip a
複製代碼
image.png
image.png
  • 查看下demo的network
sudo docker network inspect demo
複製代碼

  • 試試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
複製代碼

PS:本次經過第三方工具etcd分佈式的方式完成2臺機器,2個容器組件網絡,實現相互的訪問,這裏只是經過ping的方式,若是按照上次說的 flask-redis,能夠一臺是redis 一臺是flask 應該也是能夠通訊的。多機的方式基本就是這樣。bash

相關文章
相關標籤/搜索