docker使用第三部分,我们将要对上一节生成的容器进行扩展并启用负载均衡,这里就是用到一个更高级的分布式应用:服务。
什么是服务:
在分布式应用程序中,应用程序的不同部分叫做服务,例如,如一个视频共享站点,它可能包括存储应用程序数据的数据库服务,后台转码服务和上传服务及前端服务等。
服务仅仅只是”生产中的容器”,一个服务只运行一个镜像,但是它管理着镜像运行的方式:哪个端口可以使用,程序可以运行多少副本来达到服务所需要的容量等等。扩展服务将会更改运行容器实例的数量,并控制在服务过程中分配更多的计算机资源。
而docker的运行和扩展服务非常简单,只需要编写一个docker-compose.yml文件,这个文件用来定义docker容器在生产过程中的行为。
docker-compose.yml
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repository:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
该docker-compose.yml文件告诉docker执行以下操作:
1. 得到要运行的docker镜像
2. 运行5个实例来调用web服务,并限制每个服务最多使用10%的CPU和50M的内存
3. 如果发生故障,则重启容器
4. 将容器端口80映射到主机的80端口
5. 设置web容器通过webnet方式共享80端口来实现负载均衡
6. 使用webnet的默认设置来定义网络
运行加入负载均衡方式的应用程序,在运行之前,我们需要对它进行初始化:
docker swarm init
如果不运行初始化命令,将会报 “this node is not a swarm manager.”的错误。
然后运行 docker stack deploy -c docker-compose.yml getstartedlab 命令,等待执行结束,然后运行docker stack ps getstartedlab命令,可以查看到5个服务处于运行状态。
在这个过程中我遇到一个问题,就是我的docker版本是1.12的,根据docker官方文档说明,需要1.13以上版本,在升级的过程中,怎么都不能找到1.13的版本,无奈只能按照官方提示升级到17.03-ce版本。需要先卸载1.12版本,安装17版本链接https://store.docker.com/editions/community/docker-ce-server-centos。
然后在浏览器中输入http://192.168.83.129/来查看得到的结果,可以看到hostname的变化随机出现上图中列出的ID,表示服务运行正常,但是这个HTTP请求需要30s左右来得到响应。这并不代表docker或群组性能的问题,而是因为redis依赖关系的问题,将在后面介绍。
这里用curl方式查看hostname的变化。
停止负载均衡服务器的运行,输入命令:
docker stack rm getstartedlab