前面的课程主要集中在同一个docker,同一个linux机器,不同的容器之前是如何通信。这次主要说的不同机器之前如何通信。这篇的源码在:https://github.com/limingios/docker.git 中的docke/No.2/labs/flask-redis/ 覆盖网络(overlay network [1] )简单说来覆盖网络就是应用层网络,它是面向应用层的,不考虑或很少考虑网络层,物理层的问题,说白了就是2个不在一起的网络组成对应的网络,方便通信的方式。
之前建立的docker-node1 和docker-node2 现在启动他们 看看他们之前是否可以ping通
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个机器是互通的。
也就是docker1的172.17.0.2 ping一下docker2的172.17.0.3 其实是ping不通的,因为他们不在同一个网络,如果想通信有没有方式,其实暴露端口的方式-p 也是可以的,还有一个更好的方式 就是通过vxlan的方式。
这里不讲解VXLAN啦,我也不太熟悉,现在说的分布式存储的方式来完成docker1内部的容器和docker2内部的容器之间的通信。通过的技术是:etcd的分布式存储方式来完成。
随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用、强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。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&
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 应该也是可以通信的。多机的方式基本就是这样。