设为首页 收藏本站
查看: 1567|回复: 0

[经验分享] 『中级篇』overlay网络和etcd实现多机的容器通信(31)

[复制链接]

尚未签到

发表于 2019-1-31 11:43:16 | 显示全部楼层 |阅读模式
  >原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
>原文链接地址:『中级篇』overlay网络和etcd实现多机的容器通信(31)
  前面的课程主要集中在同一个docker,同一个linux机器,不同的容器之前是如何通信。这次主要说的不同机器之前如何通信。这篇的源码在:https://github.com/limingios/docker.git 中的docke/No.2/labs/flask-redis/
  覆盖网络(overlay network [1]  )简单说来覆盖网络就是应用层网络,它是面向应用层的,不考虑或很少考虑网络层,物理层的问题,说白了就是2个不在一起的网络组成对应的网络,方便通信的方式。

DSC0000.jpg


这次按照上次讲解,做个多机器之前的通信 flask-redis  和redis 在不同的机器上

  之前建立的docker-node1 和docker-node2 现在启动他们 看看他们之前是否可以ping通


  • 启动2个窗口,查看各自的ip 信息



  • docker-node1
    vagrant ssh docker-node1
    ip a
DSC0001.jpg



  • docker-node2
    vagrant ssh docker-node2
    ip a
DSC0002.jpg



  • 互相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个机器是互通的。


DSC0003.jpg



  •   现在我用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
DSC0004.jpg


#注意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&
DSC0005.jpg



  • 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
    DSC0006.jpg



#注意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&
DSC0007.jpg



  • docker-node1 和 docker-node2 共同操作查看状态
    ./etcdctl cluster-heallth
    sudo service docker stop
DSC0008.jpg

DSC0009.jpg



  • 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

DSC00010.jpg

DSC00011.jpg

DSC00012.jpg

DSC00013.jpg



  •   docker-node1

    sudo docker network create -d overlay demo
    sudo docker network ls
  • docker-node2
    #docker-node1创建了overlay网络后,node2也创建了。这是为什么呢?其实这就是etcd帮咱们做的。
    sudo docker network ls
DSC00014.jpg



  • docker-node1 查看网络信息
    sudo docker network inspect demo
    DSC00015.jpg



创建连接demo网络的容器


  • 创建docker-node1内部的容器tes11t1
    sudo docker run -d --name tes11t1--net demo busybox sh -c "while true; do sleep 3600; done"
    sudo docker ps
DSC00016.jpg



  • 创建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


![](https://upload-images.jianshu.io/upload_images/11223715-8ee050cbc2aabcb4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-6ad6fca0ede688d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* docker-node1中的容器,查看tes11t1的ip地址
``` bash
sudo docker exec tes11t1 ip a

  • docker-node2中的容器,查看tes11t1的ip地址
    sudo docker exec test111 ip a
DSC00017.jpg



  •   查看下demo的network

    sudo docker network inspect demo
    DSC00018.jpg


  • 试试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
DSC00019.jpg

  PS:本次通过第三方工具etcd分布式的方式完成2台机器,2个容器组件网络,实现相互的访问,这里只是通过ping的方式,如果按照上次说的 flask-redis,可以一台是redis 一台是flask 应该也是可以通信的。多机的方式基本就是这样。

往期精彩


  • docker导学(一)
  • 容器的技术概述(二)
  • docker的魅力初体验-5分钟安装wordpress不走弯路(三)
  • docker官网介绍(四)
  • 如何在mac上安装docker(五)
  • 如何在window上安装docker(六)
  • 如何在mac上通过vagrant安装虚拟机(七)
  • 如何在window上通过vagrant安装虚拟机(八)
  • docker-Machine的本地使用(九)
  • docker-Machine的本地使用(十)
  • 在linux/mac下通过Docker-Machine在阿里云上的使用(11)
  • docker架构和底层技术(12)
  • docker Image概述(13)
  • 手动建立一个base Image(14)
  • 什么是Container(15)
  • 构建自己的Docker镜像(16)
  • Dockerfile详解(17)
  • 镜像的发布(18)
  • Dockerfile实战(19)
  • 容器的操作(20)
  • Dockerfile实战CMD和ENTRTYPOINT的配合(21)
  • 容器的资源限制(22)
  • docker网络(23)
  • docker学习必会网络基础(24)
  • Linux网络命名空间(25)
  • Docker Bridge详解(26)
  • 容器之间的Link(27)
  • 容器的端口映射(28)
  • 容器网络之host和none(29)
  • 多容器复杂应用的部署(30)
DSC00020.jpg





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670007-1-1.html 上篇帖子: etcd选举机制 下篇帖子: 深入浅出etcd系列Part 1 – etcd架构和代码框架
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表