专栏首页twowinterDocker入门教程 Part 3 Services

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


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker Compose笔记 03 CentOS 快速安装 Docker 全家桶

    主要参考:https://docs.docker.com/install/linux/docker-ce/centos/

    twowinter
  • Docker CE for Ubuntu安装笔记

    Docker目前(201709)在windows平台仅支持这两个系统:Windows 10 and on Windows Server 2016。而其他系统则不...

    twowinter
  • Docker入门教程 Part 1 基础概念 - 镜像、容器、仓库

    第一篇笔记,先总体介绍Docker,及它与虚拟机技术的区别,最后再介绍Docker的最基础的三大组件概念。

    twowinter
  • Docker 笔记 1:Docker 基础与搭建第一个 Docker 应用栈

    经典云计算架构包括 IaaS(Infrastructure as a Service,基础设施即服务)、PaaS(Platform as a Service,平...

    苏易北
  • 云原生技术之Docker入门

    做过java的同学可能对上图的架构方式比较了解,我们通常会将一个应用程序生成一个war包,放到一个tomcat容器当中并在一台虚拟机(VM)中启动运行,然后配置...

    HankerCloud
  • Docker提升测试效率之路

    现如今,Docker已经成为了很多公司部署应用、服务的首选方案。依靠容器技术,我们能在不同的体系结构之上轻松部署几乎任何种类的应用。作为测试一方,我们应与时...

    用户5521279
  • Docker学习之入门基础

    Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单。容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止。Docker 帮助系统...

    小柒2012
  • 一文零基础教你学会 Docker 入门到实践

    Docker 自 2013 年发布至今一直备受关注,从招聘面试角度来看有些职位对于了解 Docker、K8S 这些也有一些加分项,同时学习 Docker 也是后...

    五月君
  • Docker 前沿概述

    Docker是基于Go语言实现的开源容器项目。Docker是一个为开发者和系统管理员提供的开发,部署和运行的容器应用程序。Linux使用容器开发应用程序的这种方...

    cxuan
  • Docker学习之CentOS 7安装配置

    Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单。容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止。Docker 帮助系统...

    小柒2012

扫码关注云+社区

领取腾讯云代金券