我们将扩展应用并启用负载均衡。在分布式应用中,应用的不同部分称为“服务”。例如,假设有一个视频共享网站,它可能提供用于在数据库中存储应用程序数据的服务、用于在用户上传一些内容后在后台进行视频转码的服务、用于前端的服务等。
服务实际上是“生产中的容器”。一项服务仅运行一个镜像,但它会编制镜像的运行方式 - 它应使用的端口、容器的多少个从节点应运行才能使服务的容量满足其需求等。扩展服务将更改运行该软件的容器实例数,并将多个计算资源分配给进程中的服务。
幸运的是,很容易使用 Docker 平台定义、运行和扩展服务 – 只需编写一个 docker-compose.yml
文件即可。
docker-compose.yml是一个YAML文件,用于定义Docker容器在生产中的行为方式,编排应用以及其中服务的方式。
以下为docker-compose.yml文件的一个样例,通过将username/repository:tag替换为自己的镜像详细信息来更新此文件
version: "3"
services:
web:
# 将 username/repo:tag 替换为您的名称和镜像详细信息
# image: waldenz/imagesample:v1
image: username/repository:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
#memory:50M
restart_policy:
condition: on-failure
ports:
- "1002:5003"
networks:
- webnet
networks:
webnet:
yml文件解析:
1. 从waldenz/imagesample:v1镜像库中拉取镜像;
2. 将该镜像的五个实例作为服务web运行,并将每个实例限制为最多10%的cpu以及50M RAM;
3. restart_policy: 重启策略, 如果某个容器发生故障,立即重启容器;
4. 将主机上的1002端口映射到web容器中的5003;
5. 指示web容器通过负载均衡的网络 webnet 共享端口1002;
6. 使用默认设置定义 webnet网络(此为负载均衡的overlay网络)
首先需要运行一下命令,才可以使用 docker stack deploy
docker swarm init
为应用指定一个名称。例子中取名为 myapp0416
docker stack deploy -c docker-compose.yml myappname
查看启动的该应用下的所有容器的列表,
docker stack ps myappname
您可以多次在一行中运行 curl http://localhost:1002
,也可以在浏览器中转至该 URL 并多次点击“刷新”。无论采用哪种方式,您都将看到容器 ID 更改,从而说明负载均衡;借助每项请求,将以循环方式选择五个从节点之一做出响应。
更改docker-compose.yml中的replicas值,保存更改并重新运行 docker stack deploy 命令来扩展应用。如下图
docker将执行原地更新,而无需先清除技术栈或终止任何容器。将之前文件中 replicas 由5改为7,重新运行 docker stack deploy 可以发现节点67是刚启动的。
水平扩展副本,用 docker service scale命令。
举例: 服务名为myapp_web,即myappname应用下的web服务,扩展为5个副本,相当于修改yml文件中的replicas个数。
docker service scale myappname_web=5
docker stack rm myappname
docker stack ls #列出docker主机上所有正在运行的应用
docker stack deploy -c
docker stack services
docker stack ps
docker stack rm