介绍

在第3部分中,我们将扩展应用程序并启用负载平衡。为此,我们必须在分布式应用程序的层次结构中提升一个级别:服务。

  1. Stack

  2. Services (你在这里)

  3. 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 details
    image: username/repo: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服务运行,限制每个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并点击刷新几次。

clipboard.png

无论如何,您将看到容器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机器集群上运行这个应用程序。


NickBoyer
12 声望0 粉丝