介绍
在第3部分中,我们将扩展应用程序并启用负载平衡。为此,我们必须在分布式应用程序的层次结构中提升一个级别:服务。
Stack
Services (你在这里)
Container (涵盖在第2部分中)
关于服务
在分布式应用程序中,应用程序的不同部分被称为“服务”。例如,如果你想象一个视频分享网站,它可能包括一个用于在数据库中存储应用程序数据的服务,一个在用户上传某个东西后在后台进行视频转换的服务,一个为前端服务的服务,等等。
服务实际上只是“生产中的容器”。一个服务只运行一个镜像,但它将以镜像的方式运行——它应该使用的端口,容器应该运行多少个副本,这样服务具有它需要的容量等等——的方式进行了编码。扩展服务会改变运行该软件的容器实例的数量,为流程中的服务分配更多的计算资源。
幸运的是,使用Docker平台定义、运行和扩展服务很容易——只需编写docker-compose.yml
文件。
你的第一个docker-compose.yml
文件
docker-compose.yml
文件是一个YAML文件,它定义了Docker容器在生产中的行为。
docker-compose.yml
将此文件保存为docker-compose.yml
无论什么位置。确保您已经将在第2部分中创建的镜像推送到注册中心,更新这个yml文件,用你镜像中的内容替换username/repo:tag
。
version: "3"
services:web:# replace username/repo:tag with your name and image detailsimage: username/repo:tagdeploy:replicas: 5resources:limits:cpus: "0.1"memory: 50Mrestart_policy:condition: on-failureports:- "80:80"networks:- webnet
networks:webnet:
docker-compose.yml
告诉Docker做下面的事情:
从注册表中提取第2步中上传的图像。
将该映像的5个实例作为web服务运行,限制每个CPU使用最多10%的CPU(跨所有内核)和50MB RAM。
如果失败,立即重新启动容器。
将端口80映射到web的端口80。
指示web容器通过一个名为webnet的负载均衡网络共享端口80。(在内部,容器本身将在临时端口上发布到web的端口80。)
用默认设置定义webnet网络(这是一个负载均衡的覆盖网络)。
运行您的新负载平衡应用程序
在我们使用docker stack deploy
命令之前,我们先运行:
docker swarm init
注意:我们将在第4部分中了解该命令的含义。如果你不运行
docker swarm init
,你会得到一个错误,“这个节点不是一个群集管理器。”
现在,让我们来运行它。你必须给你的应用一个名字。在这里,它被设置为getstartedlab
docker stack deploy -c docker-compose.yml getstartedlab
我们的单一服务堆栈在一个主机上运行我们部署映像的5个容器实例。让我们调查。
在我们的应用程序中获得一个服务的服务ID:
docker service ls
您将看到web服务的输出,并以您的应用程序名称为前提。如果您将其命名为与本例中显示的相同,则名称将为getstartedlab_web。服务ID也被列出,以及复制的数量、图像名称和暴露的端口。
在服务中运行的单个容器称为任务。任务被赋予独特的id,replicas
递增,知道达到您在docker-compose.yml
中定义的副本数量。列出服务的任务:
docker service ps getstartedlab_web
如果您将系统上所有的容器列表列出,但这些任务也不会被服务过滤:
docker container ls -q
您可以多次运行curl -4 http://localhost,或者在浏览器中访问该URL并点击刷新几次。
无论如何,您将看到容器ID的更改,显示负载平衡;在每个请求中,选择一个循环模式的5个任务中的一个来响应。容器id将与前面的命令(docker container ls -q
)匹配。
扩大app的规模
您可以通过在docker-compose.yml
中更改replicas
来扩展应用程序,保存更改,并重新运行docker stack deploy
命令:
docker stack deploy -c docker-compose.yml getstartedlab
Docker将做一个就地更新,不需要先拆下堆栈,也不需要杀死任何容器。
现在,重新运行docker container ls -q
,以查看已部署的实例重新配置。如果您将副本按比例放大,就会有更多的任务,因此会有更多的容器。
拿下应用程序和swarm
-
拿下应用程序,用
docker stack rm
docker stack rm getstartedlab
-
拿下swarm
docker swarm leave --force
这就像站起来,和Docker一起扩展你的应用一样简单。您已经向学习如何在生产中运行容器迈出了一大步。接下来,您将学习如何在Docker机器集群上运行这个应用程序。