首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

  • 1:概况介绍
  • 2:集装箱
  • 3:服务
  • 4:成群
  • 5:堆叠
  • 6:部署应用程序

先决条件

  • 安装Docker版本1.13或更高版本...
  • 阅读第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还有你的图像细节。

代码语言:javascript
复制
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命令我们将首先运行:

代码语言:javascript
复制
docker swarm init

::我们会理解这个命令的意思第4部分.如果你不跑docker swarm init您将得到一个错误,即“此节点不是群集管理器”。

现在让我们运行它。你必须给你的应用程序一个名字。在这里,它被设置为getstartedlab*

代码语言:javascript
复制
docker stack deploy -c docker-compose.yml getstartedlab

我们的单个服务堆栈正在一个主机上运行我们部署的映像的5个容器实例。让我们调查一下。

获取应用程序中的一个服务的服务ID:

代码语言:javascript
复制
docker service ls

码头工人成群运行的任务,产生容器。任务有状态和它们自己的ID:

代码语言:javascript
复制
docker service ps <service>

:Docker对Swarms的支持是使用一个名为SwarKit的项目构建的。SwarkKit任务不需要是容器,但是Docker群集任务被定义为生成它们。

让我们检查一个任务,并将输出限制在容器ID上:

代码语言:javascript
复制
docker inspect --format='{{.Status.ContainerStatus.ContainerID}}' <task>

反之亦然,检查容器ID,并提取任务ID:

代码语言:javascript
复制
docker inspect --format="{{index .Config.Labels \"com.docker.swarm.task.id\"}}" <container>

现在列出所有5个容器:

代码语言:javascript
复制
docker container ls -q

你可以跑curl http://localhost连续几次,或者转到浏览器中的那个URL,然后点击刷新几次。无论哪种方式,您都会看到容器ID的变化,演示负载平衡;对于每个请求,将以循环的方式选择5个副本中的一个来响应。

在此阶段,容器可能需要30秒才能响应HTTP请求。这并不表示Docker或S批的性能,而是一个未满足的Redis依赖关系,我们将在本教程后面讨论。

缩放应用程序

您可以通过更改replicas价值docker-compose.yml,保存更改,并重新运行docker stack deploy指挥:

代码语言:javascript
复制
docker stack deploy -c docker-compose.yml getstartedlab

Docker将进行就地更新,无需先拆下堆栈或杀死任何容器。

现在,重新运行docker container ls -q若要重新配置已部署的实例,请执行以下操作。如果您扩展副本,那么会启动更多的任务,从而启动更多的容器。

把应用程序和蜂群取下来

docker stack rm*

代码语言:javascript
复制
docker stack rm getstartedlab

这会删除应用程序,但我们的单节点群仍在运行(如图所示docker node ls)。拿下群落docker swarm leave --force

站起来和用Docker扩展你的应用程序一样容易。您已经在学习如何在生产中运行容器方面迈出了一大步。接下来,您将学习如何在一组Docker机器上运行这个应用程序。

:编写这样的文件用于使用Docker定义应用程序,并且可以使用码头云,或者在您选择的任何硬件或云提供商上。码头企业版...

关于“第四部分”

简述和备忘单(可选)

总而言之,在打字docker run很简单的情况下,生产中容器的真正实现将其作为服务运行。服务在Compose文件中编写容器的行为,此文件可用于缩放,限制和重新部署我们的应用程序。可以在运行时使用与启动服务相同的命令对服务进行更改:docker stack deploy

在此阶段需要研究的一些命令:

代码语言:javascript
复制
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

扫码关注腾讯云开发者

领取腾讯云代金券