一,概述
本章通过搭建wordpress(依赖mysql)来演示,还是基于上篇文章中的集群进行搭建。我们把上篇文章中用到的服务都删除。
二,搭建
之前说过Overlay网络,不在同一台机器也可以完成正常的通信。这里就通过overlay网络的方式。
2.1 创建overlay的网络
docker network create -d overlay wordpress-overlay
2.2 创建mysql
docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network wordpress-overlay --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7
2.3 创建wordpress
docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network wordpress-overlay wordpress
三,查看
访问 http://192.168.1.50 http://192.168.1.51 http://192.168.1.52
同上一篇说到的结果都是一样的。
查看服务实例
what?发现他们两个并不在一个节点上。但是已经实现了通信。前面文章说docker的多机网络的时候,多机的overlay网络的时候,使用的第三方的kv的外置的第三方的存储etcd。我们在用了swarm就不需要这个第三方了,整个这块是swarm自己来维护的,swarm的底层机制会同步网络的创建。最后对于所有的clus节点都可以可以访问service的wordpress的问题。
我们分别取51(worker1)和52(worker2)去查看overlay 网络wordpress-overlay
发现都有这个网络。
四,服务发现和负载均衡
4.1 创建overlay的network
docker network create -d overlay demo
4.2 创建一个service
切换到50(manager1)这个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 在manager1上运行,直接在manager查看ps下
docker ps
创建一个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
#运行在worker1机器上
docker service ps client
我们进入51(worker1)
#在worker1上进行
docker exec -it busybox的容器ID sh
ping whoami
我们发现ping whoami ip地址是10.0.2.2
下面我们把在50(manager1)下进行scale 扩展为2个,查看到一个在manager1上边,并在manager1的ps上可以查看到whoami的运行,尝试继续ping whoami,结果ip不发生变化。
#manager1机器上进行扩展
docker service scale whoami=2
为什么呢 ip不发生变化,其实我们ping的地址是一个虚拟的ip,docker 集群默认使用 Overlay 网络驱动,Overlay 驱动实现了跨主机集群内部虚拟网络。它的作用:将运行的多个容器(不同主机),附加(attach to)到一个网络默认情况下,服务发现为群集中的每个服务分配虚拟IP地址(VIP)和 动态 DNS,使其可以通过服务名称将其提供给同一网络上的容器。即在一个 Overlay 虚拟网络内,使用服务名称访问,将实现任务级别的负载均衡在群集中使用覆盖网络,需要在群集节点之间打开以下端口:
端口7946 TCP / UDP用于容器网络发现。端口4789 UDP用于容器覆盖网络。机器进行迁移的时候有一套map<k,v>关系,虚拟ip 和实际的ip 有个对应的关系。
4.3 轮训的负载机制
多次访问 http://192.168.1.50/51/52:8000/ 发现再进行轮训
当在docker swarm集群模式下创建一个服务时,会自动在服务所属的网络上给服务额外的分配一个虚拟IP,当解析服务名字时就会返回这个虚拟IP。对虚拟IP的请求会通过overlay网络自动的负载到这个服务所有的健康任务上。这个方式也避免了客户端的负载均衡,因为只有单独的一个虚拟IP会返回到客户端,docker会处理虚拟IP到具体任务的路由,并把请求平均的分配给所有的健康任务。