第3部分:服务 | Part 3: Services
- 1:概况介绍
- 2:集装箱
- 3:服务
- 4:成群
- 5:堆叠
- 6:部署应用程序
先决条件
- 安装Docker版本1.13或更高版本...
- 获取Docker撰写。在Docker for Mac和Docker for Windows中,它已预先安装,所以你很好用。在Linux系统上,您需要直接安装它。在没有Hyper-V的 Windows 10系统之前,使用Docker Toolbox。
- 阅读第1部分中的方向。
- 了解如何在第二部分...
- 确保您已经发布了
friendlyhello
你创造的形象将其推送到注册表.我们将在这里使用这个共享的图像。
- 确保你的图像作为一个部署的容器。运行此命令,在您的信息开槽
username
,repo
和tag
:docker run -p 80:80 username/repo:tag
,然后访问http://localhost/
。
导言
在第3部分中,我们扩展了我们的应用程序并启用了负载平衡。要做到这一点,我们必须在分布式应用程序的层次结构中提升一级:服务...
- 堆叠
- 服务你在这里
- 容器(第2部分涵盖)
关于服务
在分布式应用程序中,应用程序的不同部分被称为“服务”。例如,如果您想象一个视频共享站点,它可能包括一个用于将应用程序数据存储在数据库中的服务,一个用于在用户上传某些内容后在后台进行视频转换的服务,以及一个用于前端的服务,等等。
服务实际上只是“生产中的容器”。服务只运行一个映像,但它编码了映像的运行方式--应该使用哪些端口,应该运行多少个容器副本,以便服务具有所需的容量,等等。扩展服务会改变运行该软件的容器实例的数量,为流程中的服务分配更多的计算资源。
幸运的是,使用Docker平台定义、运行和扩展服务非常容易--只需编写一个docker-compose.yml
档案。
你的第一次docker-compose.yml
档案
阿docker-compose.yml
文件是一个YAML文件,它定义了Docker容器在生产中的行为方式。
docker-compose.yml
将此文件保存为docker-compose.yml
你想去哪里都行。确保你有推送图像你在第二部分到注册表,并更新以下内容.yml
通过替换username/repo:tag
还有你的图像细节。
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执行以下操作:
- 拉我们在第2步上传的图像从登记处。
- 运行该图像的5个实例作为所调用的服务
web
,限制每个实例使用最多10%的CPU(跨所有核心)和50MB的RAM。
- 如果容器失败,立即重新启动容器。
- 将主机上的端口80映射到
web
是80号港口。
web
通过称为负载平衡的网络指示容器共享端口80webnet
。(在内部,容器本身将web
在临时端口上发布到80端口。)
webnet
使用默认设置定义网络(这是一个负载平衡覆盖网络)。
想知道撰写文件版本,名称和命令吗?请注意,我们将撰写文件设置为
version: "3"
。这基本上使得群集模式兼容。我们可以使用部署密钥(仅适用于Compose文件格式版本3.x或更高版本)及其子选项,以便为每个服务(例如web
)负载均衡和优化性能。我们可以使用该docker stack deploy
命令运行该文件(也仅在Compose文件版本3.x及更高版本上受支持)。您可以使用docker-compose up
运行非swarm配置的版本3文件,但我们正在关注堆栈部署,因为我们正在构建一个swarm示例。您可以将撰写文件命名为任何您想使其对您具有逻辑意义的内容;docker-compose.yml
只是一个标准名称。我们可以轻松地调用此文件docker-stack.yml
或者对我们的项目更具体的东西。
运行您的新负载平衡应用程序。
之前,我们可以使用docker stack deploy
命令我们将首先运行:
docker swarm init
注::我们会理解这个命令的意思第4部分.如果你不跑
docker swarm init
您将得到一个错误,即“此节点不是群集管理器”。
现在让我们运行它。你必须给你的应用程序一个名字。在这里,它被设置为getstartedlab
*
docker stack deploy -c docker-compose.yml getstartedlab
我们的单个服务堆栈正在一个主机上运行我们部署的映像的5个容器实例。让我们调查一下。
获取应用程序中的一个服务的服务ID:
docker service ls
码头工人成群运行的任务,产生容器。任务有状态和它们自己的ID:
docker service ps <service>
注:Docker对Swarms的支持是使用一个名为SwarKit的项目构建的。SwarkKit任务不需要是容器,但是Docker群集任务被定义为生成它们。
让我们检查一个任务,并将输出限制在容器ID上:
docker inspect --format='{{.Status.ContainerStatus.ContainerID}}' <task>
反之亦然,检查容器ID,并提取任务ID:
docker inspect --format="{{index .Config.Labels \"com.docker.swarm.task.id\"}}" <container>
现在列出所有5个容器:
docker container ls -q
你可以跑curl http://localhost
连续几次,或者转到浏览器中的那个URL,然后点击刷新几次。无论哪种方式,您都会看到容器ID的变化,演示负载平衡;对于每个请求,将以循环的方式选择5个副本中的一个来响应。
注在此阶段,容器可能需要30秒才能响应HTTP请求。这并不表示Docker或S批的性能,而是一个未满足的Redis依赖关系,我们将在本教程后面讨论。
缩放应用程序
您可以通过更改replicas
价值docker-compose.yml
,保存更改,并重新运行docker stack deploy
指挥:
docker stack deploy -c docker-compose.yml getstartedlab
Docker将进行就地更新,无需先拆下堆栈或杀死任何容器。
现在,重新运行docker container ls -q
若要重新配置已部署的实例,请执行以下操作。如果您扩展副本,那么会启动更多的任务,从而启动更多的容器。
把应用程序和蜂群取下来
用docker stack rm
*
docker stack rm getstartedlab
这会删除应用程序,但我们的单节点群仍在运行(如图所示docker node ls
)。拿下群落docker swarm leave --force
。
站起来和用Docker扩展你的应用程序一样容易。您已经在学习如何在生产中运行容器方面迈出了一大步。接下来,您将学习如何在一组Docker机器上运行这个应用程序。
关于“第四部分”
简述和备忘单(可选)
这是本页所涵盖内容的终端记录*
总而言之,在打字docker run
很简单的情况下,生产中容器的真正实现将其作为服务运行。服务在Compose文件中编写容器的行为,此文件可用于缩放,限制和重新部署我们的应用程序。可以在运行时使用与启动服务相同的命令对服务进行更改:docker stack deploy
。
在此阶段需要研究的一些命令:
docker stack ls # List stacks or apps
docker stack deploy -c <composefile> <appname> # Run the specified Compose file
docker service ls # List running services associated with an app
docker service ps <service> # List tasks associated with an app
docker inspect <task or container> # Inspect task or container
docker container ls -q # List container IDs
docker stack rm <appname> # Tear down an application
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com