Docker入门教程 Part 3 Services

前言

本篇笔记是官方Get Started入门教程的Part3 Services,主要演示如何使用 docker-compose.yml 来定义应用服务,docker-compose 可以很方便地对 app 进行调整,并且很容易地实现负载均衡。

我正在学习Docker容器技术,相关笔记汇总在Docker容器技术 学习笔记汇总
本系列笔记作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/

要求

  • 安装Docker 1.13或更高版本。

  • 安装Docker Compose,在 Docker for Mac 和 Docker for Windows 平台上,都是预装了,linux 系统的话就需要直接安装

  • 阅读第一步的基础知识。

  • 了解Part2如何创建容器。

  • 确保已将 friendlyhello 推送到 registry 仓库,我们将在这里使用它。

  • 通过运行此操作并访问 http://localhost/ 来确保镜像正常工作:docker run -p 80:80 username/repo:tag

介绍

在 Part3 中,我们调整了应用程序容量,并启用了负载均衡。为此,我们必须在分布式应用程序的层次结构中研究更高一层的东西:Services。

关于Services

在分布式应用程序中,应用程序的不同部分称为“Services”。例如,你想做一个视频共享站点,则可能存在 将应用程序数据存储到数据库的服务,用户上传东西后的后台视频转码的服务,以及前端服务等等。

服务就是“生产环境中容器”。一个服务只运行一个镜像,但它定义了镜像运行的方式 - 应该使用哪些端口,应该运行多少容器副本因此服务也有容量要求,等等。 扩展服务会更改运行该软件的容器实例数量,并为该过程中的服务分配更多的计算资源。

幸运的是,使用Docker平台定义,运行和扩展服务非常简单 - 只需编写一个docker-compose.yml文件。

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

docker-compose.yml 文件是一个YAML文件,用于定义 Docker 容器在生产过程中的行为。

docker-compose.yml

将此文件另存为 docker-compose.yml,存在任意地方。确保已将创建的镜像按照第2步推送到 registry 仓库,并使用这个 .yml 文件而不是 username/repo:tag 来描述镜像细节:

version: "3"
services:
  web:
    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执行以下操作:

  • 从远程仓库拉取 Part2中上传的镜像。
  • 运行5个镜像实例作为称为 Web 的服务,限制每个实例使用至多10%的CPU(跨所有内核)和50MB RAM。
  • 一旦任意一个镜像发生故障,立即重新启动容器。
  • 将主机上的端口80映射到 web 服务的端口80。
  • 通知 web 服务相关容器都通过 webnet 这样一个负载均衡网络来共享端口80。(在内部,容器将自身的临时端口发布到 web 服务的80端口。)
  • 定义 webnet 这样一个负载均衡网络来做为默认网络。

运行新的负载均衡app

在我们可以使用docker stack deploy命令之前,我们先运行:

docker swarm init

注意:我们将在 Part4 中介绍该命令的含义。如果不运行 docker swarm init,你将收到一个错误提示“this node is not a swarm manager”。

现在我们来运行它.你必须给你的应用程序一个名字 - 这里设置为 getstartedlab

docker stack deploy -c docker-compose.yml getstartedlab

我们的 service stack 在主机上运行了镜像的5个实例。让我们来研究下。

在 service 中获取 service ID。

docker service ls

你会看到以你的 app 名字为前缀的 web service。如果你按照示例中的命名,那你会看到名字是 getstartedlab_web。同时也会列出 service ID、副本数量、镜像名以及暴露端口。

Docker swarms run tasks that spawn containers. Tasks have state and their own IDs. Let’s list the tasks:

docker service ps <service>

Note: Docker’s support for swarms is built using a project called SwarmKit. SwarmKit tasks do not need to be containers, but Docker swarm tasks are defined to spawn them.

Let’s inspect one of these tasks, and limit the output to container ID:

docker inspect --format='{{.Status.ContainerStatus.ContainerID}}' <task>

Vice versa, you can inspect a container ID, and extract the task ID.

首先运行 docker container ls 来获得容器ID,然后:

docker inspect --format="{{index .Config.Labels \"com.docker.swarm.task.id\"}}" <container>

现在列出了所有5个容器:

docker container ls -q

你可以续多次运行 curl -4 http://localhost 或者在浏览器中转到该URL,并点击刷新几次。

无论哪种方式,可以看到容器ID发生变化,这就是负载均衡;随着每次请求,从五个副本中轮询选择一个来进行响应。容器ID会和之前 (docker container ls -q) 命令得到的结果相一致。

twowinter注:Round Robin (轮询调度) 是一种以轮询的方式依次将一个域名解析到多个IP地址的调度不同服务器的计算方法。

调整 app 容量

你可以调整 app ,通过更改 docker-compose.yml 中的 replicas 值,保存更改并重新运行 docker stack deploy 命令:

docker stack deploy -c docker-compose.yml getstartedlab

Docker将进行就地更新,无需关掉 stack 和 任何容器。

现在,重新运行 docker container ls -q,将会看到部署实例重新配置了。如果你是增加副本,将会启动更多的tasks、hence、容器。

关闭 app 和 swarm

  • 使用 docker stack rm 关闭 app :
docker stack rm getstartedlab
  • 关闭 swarm。
docker swarm leave --force
这样就移除了 swarm,这样做的目的是为了准备下一步操作时能有个纯净的状态,具体是你用相同的命令行shell直接再创建一个 swarm。保证 Docker 主机会清晰地知道你正在使用哪个 swarm。

使用 Docker 来给 app 增减容变得特别方便。现在你已经大体掌握了如何将容器运行于生产环境。接下来你会学习如何利用 Docker 机器集群 上的 bonafide swarm 来运行你的app。

注意:Compose files 可用于使用Docker定义应用程序,并可以使用 Docker Cloud 上传到云提供商,也可以使用Docker Enterprise Edition选择的任何硬件或云提供商。

End


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值