Part 3: Services

介绍

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

  1. Stackweb

  2. Services (你在这里)docker

  3. Container (涵盖在第2部分中)数据库

关于服务

在分布式应用程序中,应用程序的不一样部分被称为“服务”。例如,若是你想象一个视频分享网站,它可能包括一个用于在数据库中存储应用程序数据的服务,一个在用户上传某个东西后在后台进行视频转换的服务,一个为前端服务的服务,等等。浏览器

服务实际上只是“生产中的容器”。一个服务只运行一个镜像,但它将以镜像的方式运行——它应该使用的端口,容器应该运行多少个副本,这样服务具备它须要的容量等等——的方式进行了编码。扩展服务会改变运行该软件的容器实例的数量,为流程中的服务分配更多的计算资源。网络

幸运的是,使用Docker平台定义、运行和扩展服务很容易——只需编写docker-compose.yml文件。app

你的第一个docker-compose.yml文件

docker-compose.yml文件是一个YAML文件,它定义了Docker容器在生产中的行为。负载均衡

docker-compose.yml

将此文件保存为docker-compose.yml不管什么位置。确保您已经将在第2部分中建立的镜像推送到注册中心,更新这个yml文件,用你镜像中的内容替换username/repo:tagcurl

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机器集群上运行这个应用程序。

相关文章
相关标签/搜索