在线文档教程

第3部分:服务 | Part 3: Services

开始,第3部分:服务

  • 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你创造的形象将其推送到注册表.我们将在这里使用这个共享的图像。

  • 确保你的图像作为一个部署的容器。运行此命令,在您的信息开槽usernamerepotagdocker 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通过称为负载平衡的网络指示容器共享端口80 webnet。(在内部,容器本身将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定义应用程序,并且可以使用码头云,或者在您选择的任何硬件或云提供商上。码头企业版...

关于“第四部分”

简述和备忘单(可选)

这是本页所涵盖内容的终端记录*

总而言之,在打字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

服务副本规模端口撰写撰写文件堆栈网络