原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『中级篇』集群服务间通信之RoutingMesh(47)
上次讲了通过service create 部署了wordpress,我们的这个wordpress有2个service组成一个wordpress,一个mysql。这2个service运行在不同的机器上边,并且他们之前是可以进行通信的,可以通过servicename的方式通信。先创建mysql,wordpress查找mysql就是通过servicename这种方式。懂网络的老铁应该就知道了,这里面肯定有DNS的功劳在里面。
![](https://img.haomeiwen.com/i11223715/33bae27d7eaea342.png)
实验的方式了解这个网络
- 必须创建overlay的network
sudo docker network create -d overlay demo
![](https://img.haomeiwen.com/i11223715/d50a7cd250fad185.png)
- 创建一个service,这个service 使用whoami,这个image,这个image的作用,就是访问后,返回当前访问的主机名称
docker service create --name whoami -p 8000:8000 --network demo jwilder/whoami
#查看service 里面的服务
docker service ls
#查看whoami的信息
docker service ps whoami
#因为service ps whoami 在manager上运行,直接在manager查看ps下
docker ps
![](https://img.haomeiwen.com/i11223715/bbf51e8515336e04.png)
![](https://img.haomeiwen.com/i11223715/5b02c66db2ad6b20.png)
#访问下本地manager的whoami
curl 127.0.0.1:8000
![](https://img.haomeiwen.com/i11223715/20990e094781c7ea.png)
- 创建一个service,这个service 使用busybox,之前创建过是一个比较简单的image,这个是为了当客户端service之间的访问。
docker service create --name client -d --network demo busybox sh -c "while true;do sleep 3600;done"
docker service ls
#运行在swam-worker1机器上
docker service ps client
![](https://img.haomeiwen.com/i11223715/3d1ecfecf4b070a4.png)
#在swam-work1上进行运行 172.28.128.4
docker exec -it busybox的容器ID sh
ping whoami
![](https://img.haomeiwen.com/i11223715/325e8923d21a90fb.png)
![](https://img.haomeiwen.com/i11223715/b16a09319e6829e7.png)
ping whoami ip地址是10.0.0.247
- 测试whoami的ip是否发生变化
在manager下进行scale 扩展为2个,查看到一个在worker2上边,并在worker2的ps上可以查看到whoami的运行,尝试继续ping whoami,结果ip不发生变化。
#manager机器上进行扩展
docker service scale whoami=2
#worker2 上运行 查看whoami 是否存在
docker ps
#worker1 上ping whoami发现ip没有发生变化10.0.0.247
ping whoami
![](https://img.haomeiwen.com/i11223715/f3ba28ed105b8b58.png)
为什么呢 ip不发生变化,其实我们ping的地址是一个虚拟的ip,docker 集群默认使用 Overlay 网络驱动,Overlay 驱动实现了跨主机集群内部虚拟网络。它的作用:将运行的多个容器(不同主机),附加(attach to)到一个网络默认情况下,服务发现为群集中的每个服务分配虚拟IP地址(VIP)和 动态 DNS,使其可以通过服务名称将其提供给同一网络上的容器。即在一个 Overlay 虚拟网络内,使用服务名称访问,将实现任务级别的负载均衡在群集中使用覆盖网络,需要在群集节点之间打开以下端口:
端口7946 TCP / UDP用于容器网络发现。
端口4789 UDP用于容器覆盖网络。
机器进行迁移的时候有一套map<k,v>关系,虚拟ip 和实际的ip 有个对应的关系,
- 轮训的负载机制
wget whoami:8000
more index.html
#因为目前就有2个whoami,
#所以可以看到第三次执行wget获取的时候发现id重复了也变成了65beb6796165
![](https://img.haomeiwen.com/i11223715/2e7016ea9bb8c3bd.png)
Routing Mesh的体验
- Internal --- Container 和Container 之间的访问通过overlay网络(通过VIP虚拟IP)
- Ingress---- 如果服务有绑定接口,则此服务可以通过任意swarm节点的响应接口访问
Load Balancing
现在有3台机器1个client,2个web,他们3个连通在同一个swam下,当client访问web的时候其实,其实是访问10.0.9.4,然后通过负载的方式映射到10.0.9.5或者10.0.9.6上面。
![](https://img.haomeiwen.com/i11223715/32f153f00bb17cd3.png)
![](https://img.haomeiwen.com/i11223715/5f5da26edeeae2b7.png)
PS:内部负载均衡
当在docker swarm集群模式下创建一个服务时,会自动在服务所属的网络上给服务额外的分配一个虚拟IP,当解析服务名字时就会返回这个虚拟IP。对虚拟IP的请求会通过overlay网络自动的负载到这个服务所有的健康任务上。这个方式也避免了客户端的负载均衡,因为只有单独的一个虚拟IP会返回到客户端,docker会处理虚拟IP到具体任务的路由,并把请求平均的分配给所有的健康任务。
往期精彩
- 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)
- overlay网络和etcd实现多机的容器通信(31)
- docker的数据持久化存储和数据共享(32)
- windows下vagrant 通过SecureCRT连接centos7(33)
- 数据持久化之Data Volume(34)
- 数据持久化之bind Mounting(35)
- docker 使用bind Mounting实战(36)
- docker容器安装wordpress(37)
- docker Compose到底是什么(38)
- Docker Compose的安装和基本使用(39)
- Docker 水平扩展和负载均衡(40)
- Docker compose 部署一个复杂的应用(41)
- 容器编排Docker Swarm介绍(42)
- docker-swarm创建一个多节点集群(43)
- play with docker 的使用(44)
- docker-swarm中的Service创建维护和水平扩展(45)
-
在docker-swarm集群里通过serivce部署wordpress(46)
网友评论
/ # ping 10.0.0.15
PING 10.0.0.15 (10.0.0.15): 56 data bytes
64 bytes from 10.0.0.15: seq=0 ttl=64 time=0.870 ms
64 bytes from 10.0.0.15: seq=1 ttl=64 time=1.103 ms
64 bytes from 10.0.0.15: seq=2 ttl=64 time=1.102 ms
64 bytes from 10.0.0.15: seq=3 ttl=64 time=1.194 ms
^C
--- 10.0.0.15 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.870/1.067/1.194 ms
/ # ping whoami
ping: bad address 'whoami'
/ #