入门,第 3 部分:服务

先决条件

  • 安装 Docker 版本 1.13 或更高版本。

  • 获取 Docker Compose。在适用于 Mac 和 Docker 桌面的 Windows 上,它已预安装,因此您可以good-to-go。在 Linux 系统上,您需要直接安装它。在 Windows 10 系统之前上,没有 Hyper-V,请使用 Docker Toolbox。

  • 阅读第 1 部分中的方向。

  • 了解如何在第 2 部分中创建容器。

  • 确保通过将friendlyhello镜像推送到registry来发布您创建的镜像。我们在这里使用共享镜像。

  • 确保镜像用作已部署的容器。运行此命令,在信息中键入usernamerepotag:docker run -p 4000:80 username/repo:tag,然后访问http://localhost:4000/

介绍

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

  • Stack

  • Services(您在这里)

  • Container(第 2 部分涵盖)

关于服务

在分布式应用程序中,应用程序的不同部分称为"服务"。例如,如果您想象一个视频共享站点,它大概包括用于在数据库中存储应用程序数据的服务、用户上传内容后在后台进行视频转码的服务、前端服务等。

服务实际上只是"生产环境中的容器"。服务只运行一个镜像,但它编码了镜像的运行方式 - 它应该使用什么端口,容器应运行多少个副本,以便服务具有所需的容量,等等。缩放服务会更改运行该软件的容器实例数,从而将更多的计算资源分配给进程中的服务。

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

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

docker-compose.yml 文件是一个 YAML 文件,用于定义 Docker 容器在生产中应如何操作。

docker-compose.yml

将此文件保存为 docker-compose.yml,无论您需要。请确保将第 2 部分中创建的镜像推送到registry,并通过将username/repo:tag 替换为镜像详细信息来更新此 .yml

version: ""
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas:
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:

此 docker-compose.yml 文件告诉 Docker 执行以下操作:

  • 从registry中提取我们在步骤 2 中上传的图像。

  • 将该镜像的 5 个实例作为称为 web 的服务运行,限制每个实例最多使用单个 CPU 时间 10%(这也可以例如,"1.5"表示每个内存为 1 和半内核),并且限制 50MB 的 RAM。

  • 如果容器发生故障,立即重启容器。

  • 将主机上的端口 4000 映射到 Web 的端口 80。

  • 指示 web 的容器通过称为 webnet 的负载平衡网络共享端口 80。(在内部,容器本身在临时端口发布到 Web 的端口 80。

  • 使用默认设置(负载平衡覆盖网络)定义 webnet 网络。

运行新的负载平衡应用

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

docker swarm init

注意:我们进入第 4 部分中该命令的含义。如果不运行 docker swarm init,则会收到一个错误,即"this node is not a swarm manager."。

现在让我们运行它。您需要为应用指定名称。在这里,它叫getstartedlab:

docker stack deploy -c docker-compose.yml getstartedlab

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

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

docker service ls

查找 web 服务的输出,并预置应用名称。如果将其命名为与本示例中所示相同,则名称为 getinitlab_web。服务 ID 以及副本、镜像名称和公开端口的数量也列出。

或者,您可以运行 docker stack services,然后是堆栈的名称。以下示例命令允许您查看与 getstartedlab 堆栈关联的所有服务:

docker stack services getstartedlab
ID NAME MODE REPLICAS IMAGE PORTS
bqpve1djnk0x getstartedlab_web replicated / username/repo:tag *:->/tcp

在服务中运行的单个容器称为任务。任务被赋予以数字递增的方式获得的唯一标识,最多于您在 docker-compose.yml 中定义的复制replicas数。列出服务的任务:

docker service ps getstartedlab_web

如果只是列出系统上的所有容器,任务也会显示,尽管未按服务进行筛选:

docker container ls -q

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

无论哪种方式,容器 ID 都发生更改,演示负载平衡;在每个请求中,以循环方式选择 5 个任务之一以响应。容器 ID们 与上面的命令(docker container ls -q)的输出匹配。

要查看堆栈的所有任务,可以运行 docker stack ps 后跟应用名称,如以下示例所示:

docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
uwiaw67sc0eh getstartedlab_web. username/repo:tag docker-desktop Running Running minutes ago
sk50xbhmcae7 getstartedlab_web. username/repo:tag docker-desktop Running Running minutes ago
c4uuw5i6h02j getstartedlab_web. username/repo:tag docker-desktop Running Running minutes ago
0dyb70ixu25s getstartedlab_web. username/repo:tag docker-desktop Running Running minutes ago
aocrb88ap8b0 getstartedlab_web. username/repo:tag docker-desktop Running Running minutes ago

正在运行 Windows 10?

Windows 10 PowerShell 应该已经有卷曲可用, 但如果没有,你可以抓住一个Linux终端模拟器,如Git BASH, 或下载 wget for Windows这是非常类似的.

响应时间慢?

根据环境的网络配置,容器最多可能需要 30 秒才能响应 HTTP 请求。这不是 Docker 或群性能的指示,而是本教程后面讨论未满足的 Redis 依赖项。目前,访问者计数器由于同样的原因无法工作;我们尚未添加用于保留数据的服务。

缩放应用

您可以通过更改 docker-compose.yml 中的replicas值、保存更改并重新运行 docker stack deploy命令来缩放应用:

docker stack deploy -c docker-compose.yml getstartedlab

Docker 执行就地更新,无需先将堆栈撕下或终止任何容器。

现在,重新运行 docker container ls -q 以查看已部署的实例重新配置。如果放大了replicas,将启动更多任务,从而启动更多容器。

下掉应用程序和swarm

使用 docker stack rm 将应用下掉:

docker stack rm getstartedlab

下掉swarm:

docker swarm leave --force

使用 Docker 建立并扩展应用非常简单。您在学习如何在生产环境中运行容器迈出了一大步。接下来,您将学习如何在 Docker 计算机群集上以真正的群形式运行此应用程序。

注意:像这样的Compose文件用于使用 Docker 定义应用程序,并且可以使用 Docker Cloud 上载到云提供商,也可以上载到使用 Docker 企业版选择的任何硬件或云提供商。

回顾和备忘单(可选)

概括地说,虽然键入 docker run非常简单,但生产中的容器的真正实现是作为服务运行它。服务在 Compose 文件中编纂容器的行为,并且此文件可用于扩展、限制和重新部署我们的应用。

在此阶段要探索的一些命令:

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
docker swarm leave --force # Take down a single node swarm from the manager

docker 入门3 - 服务 【翻译】的更多相关文章

  1. Docker入门(四):服务(Services)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  2. Docker入门(七):部署app

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  3. Docker入门(六):Stacks

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  4. Docker入门(五):Swarms

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  5. Docker入门(三):容器(Containers)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  6. Docker入门(二):安装/卸载

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  7. Docker入门(一):简介

    这个<Docker入门>系列文档,是我根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家 ...

  8. 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

    [SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...

  9. 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

    操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...

随机推荐

  1. go语言规范之方法集

    Go语言规范里定义的方法集的规则 Values Methods Receivers ----------------------------------------------- T (t T) *T ...

  2. 使用log4j使某些java类的日志信息输出到指定日志文件中

    Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI 组件.甚至是套接口服务器.NT 的事件记录器.UNIX Syslog ...

  3. 讨论SQLite数据库损坏与修复

      版权声明:博客将逐步迁移到 http://cwqqq.com https://blog.csdn.net/cwqcwk1/article/details/45541409 昨晚,朋友和我反馈SQL ...

  4. arcgis python 获得表字段的唯一值

    #获得唯一值 by gisoracle def getuniqueValue(inTable,inField): rows = arcpy.da.SearchCursor(inTable,[inFie ...

  5. Vue篇之vue 使用Jade模板写html

    // 安装jade包 npm install jade jade-loader --save-dev // 如果使用vue-cli构建项目,则不需要安装stylus相关的包,vue-cli默认已安装 ...

  6. C之自定义类型

    声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字. #include<stdio.h> #include<stdlib.h> typedef int ...

  7. Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能

    Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能  Windows Server 2012 安装 SQL server 2008 出现了如下错误: 解 ...

  8. java泛型中特殊符号的含义

    java泛型中的标记符含义:  E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number ...

  9. html+大文件上传

    前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践. ...

  10. PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)

    1013 Battle Over Cities (25 分)   It is vitally important to have all the cities connected by highway ...