3. Services
介绍
在本部分,我们伸缩我们的应用,并且完成负载均衡功能。为了完成这个,我们必须在前面提到的层级结构中上移一层:service。
- stack
- service
- container
什么是服务?
在一个分布式应用中,应用的不同功能部分被称为服务。例如如果你想像一个视频分享网站,它可能包含存储数据在数据库的服务,视频转码的后台服务以及前段用户上传视频的服务。
在docker情景中,简单来说__服务就是生产环境中运行的容器__。一个服务仅仅运行一个镜像,但是它组织镜像如何运行,使用哪个端口,运行多少个副本等等。伸缩一个服务,仅仅需要指定更多的计算资源到每个进程中的服务,从而改变容器实例的数量。
在docker平台上,很容易定义、运行和伸缩服务,通过使用docker-compose.yml文件。
docker-compose.ymls文件
一个docker-compose.yml文件是一个YAML文件,用来定义生产环境中容器的运行方式。
新建一个docker-compose.yml文件:
1 | version: "3" |
上面的docker-compose.yml文件描述了:
- 从什么地方去拉取需要的镜像文件
- 运行含有5个实例的镜像作为一个web服务,限制每个实例使用的cpu比例和内存大小
- 重启策略:如果容器fail,立即重启该容器。
- 端口映射:宿主机的4000端口到容器的80端口
- 构建web服务的容器们共享80端口,通过一个被称为webnet的负载均衡的网络。
- 使用默认配置定义webnet网络。
运行可负载均衡的app
在使用docker stack deploy命令之前,先运行:
1 | docker swarm init |
现在运行app
1 | docker stack deploy -c docker-compose.yml getstartedlab |
这个服务stack正在一个宿主机上运行我们部署的镜像的5个容器实例。
查看服务列表:
1 | docker service ls |
上面的输出是关于web服务的信息,分别是服务ID,服务名字,模式,副本的数量,镜像以及暴露的端口信息。
运行服务里面的单个容器叫做task。每一个task有一个递增的数字ID。
列出服务包含的tasks。
1 | docker service ps getstarted_web |
同样的查看容器列表也能观察到web服务包m含的task:1
docker container ls
测试效果:
可以看到每次访问对应的hostname都不相同,因此部署的web服务已经具有负载均衡的能力。
扩容on-the-fly
修改docker-compose.yml文件中的replicas的值,重新运行:
1 | docker stack deploy -c docker-compose.yml getstartedlab |
docker执行一个in-place的更新,没必要停止stack或者停止任何容器。
现在重新查看容器列表:
1 | docker container ls -q |
同样的,如果我们扩容了,除了容器增加了,服务包含的task也会相应的增加。
停止app和swarm
- 停止app
1 | docker stack rm getstartedlab |
- 停止swarm
1
docker swarm leave --force
使用Docker很容易构建app和扩缩容。
1 | docker stack ls # List stacks or apps |