当前位置: 首页 > news >正文

『中级篇』overlay网络和etcd实现多机的容器通信(31)

原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『中级篇』overlay网络和etcd实现多机的容器通信(31)

前面的课程主要集中在同一个docker,同一个linux机器,不同的容器之前是如何通信。这次主要说的不同机器之前如何通信。这篇的源码在:github.com/limingios/d… 中的docke/No.2/labs/flask-redis/

覆盖网络(overlay network [1] )简单说来覆盖网络就是应用层网络,它是面向应用层的,不考虑或很少考虑网络层,物理层的问题,说白了就是2个不在一起的网络组成对应的网络,方便通信的方式。


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

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

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


  • 现在我用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和名称都是唯一的。不会带来冲突。
  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
  • 创建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
  • 查看下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 应该也是可以通信的。多机的方式基本就是这样。



相关文章:

  • HTTPS协议详解(三):PKI 体系
  • 日志分析方法
  • 2018年最新苹果开发者账号申请流程
  • 【Spark】环境搭建(CentOS7)
  • 指定UIView的某几个角为圆角
  • 内存屏障和 volatile 语义
  • 上传本地代码到github
  • Centos Crontab查看状态和开启
  • dotnet core高吞吐Http api服务组件FastHttpApi
  • 第四十一天
  • 秒级展现的百万级大清单报表怎么做
  • Confluence 6 属性的一个活动
  • 怎样寻回参数错误K盘的资料
  • Hibernate防止setter()方法更新数据库
  • 中国象棋残局库构建[抄]
  • 自己简单写的 事件订阅机制
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ES10 特性的完整指南
  • HashMap剖析之内部结构
  • Hibernate【inverse和cascade属性】知识要点
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Making An Indicator With Pure CSS
  • Python 反序列化安全问题(二)
  • redis学习笔记(三):列表、集合、有序集合
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue.js源码(2):初探List Rendering
  • 从0到1:PostCSS 插件开发最佳实践
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于遗传算法的优化问题求解
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 离散点最小(凸)包围边界查找
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 日剧·日综资源集合(建议收藏)
  • 什么是Javascript函数节流?
  • 实战|智能家居行业移动应用性能分析
  • 收藏好这篇,别再只说“数据劫持”了
  • Hibernate主键生成策略及选择
  • #100天计划# 2013年9月29日
  • #Linux(帮助手册)
  • #stm32驱动外设模块总结w5500模块
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (ZT)出版业改革:该死的死,该生的生
  • (二)WCF的Binding模型
  • (附源码)计算机毕业设计大学生兼职系统
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)【Hibernate总结系列】使用举例
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net core 6.0 升8.0
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)