PRF&PUB:20161005 Docker Engine swarm mode - Intro tutorial.md

@vizv
This commit is contained in:
wxy 2017-09-21 08:13:12 +08:00
parent 9844d4f4c0
commit cc73901bed

View File

@ -1,7 +1,7 @@
Docker 引擎的 Swarm 模式 - 入门教程
Docker 引擎的 Swarm 模式入门教程
============================
听起来像是一个朋克摇滚乐队。但它确实是个新的编排机制,抑或者是,一个 [Docker][1] 现有编排体制的改进。简单来讲,如果你在用一个旧版本的 Docker你必须手动配置 Swarm 来创建 Docker 集群。从 [1.12 版][2]开始Docker 引擎集成了一个原生的实现(译注:见下文)来支持无缝的集群设置。也就是为什么会有这篇文章。
Swarm听起来像是一个朋克摇滚乐队。但它确实是个新的编排机制,抑或者是,一个 [Docker][1] 现有编排体制的改进。简单来讲,如果你在用一个旧版本的 Docker你必须手动配置 Swarm 来创建 Docker 集群。从 [1.12 版][2]开始Docker 引擎集成了一个原生的实现(LCTT 译注:见下文)来支持无缝的集群设置。也就是为什么会有这篇文章。
在这篇教程中,我将带你体验一下编排后的 Docker 将能做的事情。这篇文章并不是包含所有细节(如 BnB 一般)或是让你对其全知全能,但它能带你踏上你的集群之路。在我的带领下开始吧。
@ -9,19 +9,19 @@ Docker 引擎的 Swarm 模式 - 入门教程
### 技术概要
如果把 Docker 详细而又好用的文档照搬到这里那将太丢人了,所以我将简要概括下这个技术的概要。我们已经有了 Docker对吧。现在你想要更多的服务器作为 Docker 主机,但同时你希望们属于同一个逻辑上的实体。也就是说,你想建立一个集群。
如果把 Docker 详细而又好用的文档照搬到这里那将太丢人了,所以我将简要概括下这个技术的概要。我们已经有了 Docker对吧。现在你想要更多的服务器作为 Docker 主机,但同时你希望们属于同一个逻辑上的实体。也就是说,你想建立一个集群。
我们先从一个主机组成的集群开始。当你在一个主机上初始化一个 Swarm 集群这台主机将成为这个集群的管理者manager。从技术角度来讲它成为了共识组consensus group中的一个结点。其背后的数学逻辑建立在 [Raft][3] 算法之上。管理者manager负责调度任务。而具体的任务则会委任给各个加入了 Swarm 集群的工作者worker点。这些操作将由 Node API 所管理。虽说我讨厌 API 这个词汇,但我必须在这里用到它。
我们先从一个主机组成的集群开始。当你在一个主机上初始化一个 Swarm 集群这台主机将成为这个集群的管理者manager。从技术角度来讲它成为了共识组consensus group中的一个<ruby>节点<rt>node</rt></ruby>。其背后的数学逻辑建立在 [Raft][3] 算法之上。管理者manager负责调度任务。而具体的任务则会委任给各个加入了 Swarm 集群的工作者worker点。这些操作将由 Node API 所管理。虽说我讨厌 API 这个词汇,但我必须在这里用到它。
Service API 是这个实现中的第二个组件。它允许管理者manager结点在所有的 Swarm 集群结点上创建一个分布式的服务。这个服务可以被复制replicated也就是说他们译者注:指这些服务)会由平衡机制被分配到集群中(译注:指 replicated 模式,多个容器实例将会自动调度任务到集群中的一些满足条件的结点),或者可以分配给全局(译者注:指 global 模式),也就是说每个结点都会运行一个容器实例。
Service API 是这个实现中的第二个组件。它允许管理者manager节点在所有的 Swarm 集群节点上创建一个分布式的服务。这个服务可以被复制replicated也就是说它们LCTT 译注:指这些服务)会由平衡机制被分配到集群中(LCTT 译注:指 replicated 模式,多个容器实例将会自动调度任务到集群中的一些满足条件的节点或者可以分配给全局LCTT 译注:指 global 模式),也就是说每个节点都会运行一个容器实例。
此外还有更多的功课需要做,但这些信息已经足够你上路了。现在,我们开始整些实际的。我们的目标平台是 [CentOS 7.2][4],有趣的是在我写这篇教程的时候,它的软件仓库中只有 1.10 版的 Docker也就是说我必须手动更新以使用 Swarm。我们将在另一教程中讨论这个问题。接下来我们还有一个跟进的指南,其中涵盖了如何将新的结点加入我们现有的集群(译者注:指刚刚建立的单结点集群),并且我们将使用 [Fedora][5] 进行一个非对称的配置。至此,请确保正确的配置已经就位,并有一个工作的集群启动并正在运行(译者注:指第一个结点的 Docker 已经安装并已进入 Swarm 模式,但到这里笔者并没有介绍如何初始化 Swarm 集群,不过别担心下章会讲)。
此外还有更多的功课需要做,但这些信息已经足够你上路了。现在,我们开始整些实际的。我们的目标平台是 [CentOS 7.2][4],有趣的是在我写这篇教程的时候,它的软件仓库中只有 1.10 版的 Docker也就是说我必须手动更新以使用 Swarm。我们将在另一教程中讨论这个问题。接下来我们还有一个跟进的指南,其中涵盖了如何将新的节点加入我们现有的集群LCTT 译注:指刚刚建立的单节点集群),并且我们将使用 [Fedora][5] 进行一个非对称的配置。至此,请确保正确的配置已经就位,并有一个工作的集群启动并正在运行(LCTT 译注:指第一个节点的 Docker 已经安装并已进入 Swarm 模式,但到这里笔者并没有介绍如何初始化 Swarm 集群,不过别担心下章会讲)。
### 配置镜像和服务
我将尝试配置一个负载均衡的 [Apache][6] 服务,并使用多个容器实例通过唯一的 IP 地址提供页面内容。挺标准的吧(译注:指这个负载均衡的网页服务器)。这个例子同时也突出了你想要使用集群的大多数原因:可用性、冗余、横向扩展以及性能。当然,你同时需要考虑[网络][7]和[储存][8]这两块,但它们超出了这篇指南所涉及的范围了。
我将尝试配置一个负载均衡的 [Apache][6] 服务,并使用多个容器实例通过唯一的 IP 地址提供页面内容。挺标准的吧(LCTT 译注:指这个负载均衡的网页服务器)。这个例子同时也突出了你想要使用集群的大多数原因:可用性、冗余、横向扩展以及性能。当然,你同时需要考虑[网络][7]和[储存][8]这两块,但它们超出了这篇指南所涉及的范围了。
这个 Dockerfile 模板其实可以在官方镜像仓库下的 httpd 中找到。你只需一个最简单的设置来起步。至于如何下载或创建自己的镜像,请参考我的入门指南,链接可以在这篇教程的顶部可以找到。
这个 Dockerfile 模板其实可以在官方镜像仓库里的 httpd 下找到。你只需一个最简单的设置来起步。至于如何下载或创建自己的镜像,请参考我的入门指南,链接可以在这篇教程的顶部可以找到。
```
docker build -t my-apache2 .
@ -44,7 +44,7 @@ Step 2 : COPY ../public-html/ /usr/local/apache2/htdocs/
![Image created](http://www.dedoimedo.com/images/computers-years/2016-2/docker-swarm-image-created.png)
在你继续下面的步骤之前,你应该确保你能无错误的启动一个容器实例并能链接到这个网页服务器上(译注:使用下面的命令)。一旦你确保你能连上,我们就可以开始着手创建一个分布式的服务。
在你继续下面的步骤之前,你应该确保你能无错误的启动一个容器实例并能链接到这个网页服务器上(LCTT 译注:使用下面的命令)。一旦你确保你能连上,我们就可以开始着手创建一个分布式的服务。
```
docker run -dit --name my-running-app my-apache2
@ -60,14 +60,14 @@ docker run -dit --name my-running-app my-apache2
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
```
这里我们做了什么?我们创建了一个叫做 `frontent` 的服务,它有五个容器实例。同时我们还将主机的 80 端口和容器的 80 端口相绑定。我们将使用刚刚新创建的 Apache 镜像来做这个测试。然而,当你在自己的电脑上直接键入上面的指令时,你将看到下面的错误:
这里我们做了什么?我们创建了一个叫做 `frontent` 的服务,它有五个容器实例。同时我们还将主机的 80 端口和这些容器的 80 端口相绑定。我们将使用刚刚新创建的 Apache 镜像来做这个测试。然而,当你在自己的电脑上直接键入上面的指令时,你将看到下面的错误:
```
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
```
这意味着你没有将你的主机(点)配置成一个 Swarm 管理者manager。你可以在这台主机上初始化 Swarm 集群或是让它加入一个现有的集群。由于我们目前还没有一个现成的集群,我们将初始化它(译者注:指初始化 Swarm 集群并使当前结点成为 manager
这意味着你没有将你的主机(点)配置成一个 Swarm 管理者manager。你可以在这台主机上初始化 Swarm 集群或是让它加入一个现有的集群。由于我们目前还没有一个现成的集群,我们将初始化它(LCTT 译注:指初始化 Swarm 集群并使当前节点成为 manager
```
docker swarm init
@ -83,9 +83,9 @@ docker swarm join \
10.0.2.15:2377
```
为了向这个 Swarm 集群添加一个管理者manager请执行 'docker swarm join-token manager' 并按照指示操作。
为了向这个 Swarm 集群添加一个管理者manager请执行 `docker swarm join-token manager` 并按照指示操作。
操作后的输出不用解释已经很清楚明了。我们成功的创建了一个 Swarm 集群。新的点们将需要正确的令牌token来加入这个 Swarm 集群。如果你需要配置防火墙,你还需找到它的 IP 地址和端口(译注:指 Docker 的 Swarm 模式通讯所需的端口,默认 2377。此外你还可以向 Swarm 集群中添加管理者点。现在,重新执行刚刚的服务创建指令:
操作后的输出不用解释已经很清楚明了。我们成功的创建了一个 Swarm 集群。新的点们将需要正确的令牌token来加入这个 Swarm 集群。如果你需要配置防火墙,你还需找到它的 IP 地址和端口(LCTT 译注:指 Docker 的 Swarm 模式通讯所需的端口,默认 2377。此外你还可以向 Swarm 集群中添加管理者点。现在,重新执行刚刚的服务创建指令:
```
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
@ -94,7 +94,7 @@ docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:lates
### 测试连通性
现在,我们来验证下我们的服务是否真的工作了。从某些方面讲,这很像我们在 [Vagrant][9] 和 [coreOS][10] 中做的事情那样。毕竟它们的原理几乎相同。指示相同思想的不同实现罢了(译注:笔者观点,无法苟同)。首先需要确保 `docker ps` 能够给出正确的输出。你应该能看到所创建服务的多个容器副本。
现在,我们来验证下我们的服务是否真的工作了。从某些方面讲,这很像我们在 [Vagrant][9] 和 [coreOS][10] 中做的事情那样。毕竟它们的原理几乎相同。相同指导思想的不同实现罢了(LCTT 译注:笔者观点,无法苟同)。首先需要确保 `docker ps` 能够给出正确的输出。你应该能看到所创建服务的多个容器副本。
```
docker ps
@ -120,49 +120,45 @@ eda01569181d        my-apache2:latest   "httpd-foreground"  
### 可能会遇到的问题
你可能会在把玩 Docker 和 Swarm 时遇到一些小的问题(也许没那么小)。比如 SELinux 也许会抱怨你正在执行一些非法的操作(译注:指在强制访问控制策略中没有权限的操作)。然而,这些错误和警告应该不会对你造成太多阻碍。
你可能会在把玩 Docker 和 Swarm 时遇到一些小的问题(也许没那么小)。比如 SELinux 也许会抱怨你正在执行一些非法的操作(LCTT 译注:指在强制访问控制策略中没有权限的操作)。然而,这些错误和警告应该不会对你造成太多阻碍。
![SELinux alert](http://www.dedoimedo.com/images/computers-years/2016-2/docker-swarm-selinux-alert.png)
### `docker service` 不是一条命令(`docker service is not a docker command`
- `docker service` 不是一条命令(`docker service is not a docker command`
当你尝试执行必须的命令去创建一个复制模式replicated的服务时你可能会遇到一条错误说 `docker: 'service' is not a docker command`(译注:见下面的例子)。这表示你的 Docker 版本不对(使用 `-v` 选项来检查)。我们将在将来的教程讨论如何修复这个问题。
当你尝试执行必须的命令去创建一个复制模式replicated的服务时你可能会遇到一条错误说 `docker: 'service' is not a docker command`LCTT 译注:见下面的例子)。这表示你的 Docker 版本不对(使用 `-v` 选项来检查)。我们将在将来的教程讨论如何修复这个问题。
```
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
docker: 'service' is not a docker command.
```
```
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
docker: 'service' is not a docker command.
```
### `docker tag` 无法识别(`docker tag not recognized`
- `docker tag` 无法识别(`docker tag not recognized`
你也许会看到下面的错误:
你也许会看到下面的错误:
```
docker service create -name frontend -replicas 5 -p 80:80/tcp my-apache2:latest
Error response from daemon: rpc error: code = 3 desc = ContainerSpec: "-name" is not a valid repository/tag
```
```
docker service create -name frontend -replicas 5 -p 80:80/tcp my-apache2:latest
Error response from daemon: rpc error: code = 3 desc = ContainerSpec: "-name" is not a valid repository/tag
```
关于这个错误已经有多个相关的[讨论][11]和[帖子][12]了。其实这个错误也许相当无辜。你也许是从浏览器粘贴的命令,在浏览器中的横线也许没被正确解析(笔者注:应该用 `--name` 而不是 `-name`)。就是这么简单的原因所导致的。
关于这个错误已经有多个相关的[讨论][11]和[帖子][12]了。其实这个错误也许相当无辜。你也许是从浏览器粘贴的命令,在浏览器中的横线也许没被正确解析(笔者注:应该用 `--name` 而不是 `-name`)。就是这么简单的原因所导致的。
### 扩展阅读
关于这个话题还有很多可谈的,包含 1.12 版之前的 Swarm 集群实现(笔者注:旧的 Swarm 集群实现,下文亦作`独立版本`,需要 Consul 等应用提供服务发现),以及当前的 Docker 版本提供的(笔者注:新的 Swarm 集群实现,亦被称为 Docker 引擎的 Swarm 模式)。也就是说,请别偷懒花些时间阅读以下内容:
Docker Swarm [概述][13](独立版本的 Swarm 集群安装)
[构建][14]一个生产环境的 Swarm 集群(独立版本安装)
[安装并创建][15]一个 Docker Swarm 集群(独立版本安装)
Docker 引擎 Swarm [概述][16](对于 1.12 版)
[Swarm][17] 模式入门(对于 1.12 版)
- Docker Swarm [概述][13](独立版本的 Swarm 集群安装)
- [构建][14]一个生产环境的 Swarm 集群(独立版本安装)
- [安装并创建][15]一个 Docker Swarm 集群(独立版本安装)
- Docker 引擎 Swarm [概述][16](对于 1.12 版)
- [Swarm][17] 模式入门(对于 1.12 版)
### 总结
你总算看到这里了。到这里仍然无法保证你学到了什么,但我相信你还是会觉得这篇文章有些用的。它涵盖了一些基础的概念,以及一个 Swarm 集群模式是如何工作的以及它能做什么的概述,与此同时我们也成功的下载了并创建了我们的网页服务器的镜像并且在之后基于它运行了多个集群式的容器实例。虽然我们目前只在单一结点做了以上实验,但是我们会在将来解释清楚(笔者注:以为解释清楚多结点的 Swarm 集群操作)。并且我们解决了一些常见的问题。
你总算看到这里了。到这里仍然无法保证你学到了什么,但我相信你还是会觉得这篇文章有些用的。它涵盖了一些基础的概念,以及一个 Swarm 集群模式是如何工作的以及它能做什么的概述与此同时我们也成功的下载了并创建了我们的网页服务器的镜像并且在之后基于它运行了多个集群式的容器实例。虽然我们目前只在单一节点做了以上实验但是我们会在将来解释清楚LCTT 译注:以便解释清楚多节点的 Swarm 集群操作)。并且我们解决了一些常见的问题。
我希望你能认为这篇指南足够有趣。结合着我过去所写的关于 Docker 的文章,这些文章应该能给你一个像样的解释包含:怎么样操作镜像、网络栈、储存、以及现在的集群。就当热身吧。的确,请享受并期待在新的 Docker 教程中与你见面。我控几不住我记几啊。
我希望你能认为这篇指南足够有趣。结合着我过去所写的关于 Docker 的文章,这些文章应该能给你一个像样的解释,包括:怎么样操作镜像、网络栈、储存、以及现在的集群。就当热身吧。的确,请享受并期待在新的 Docker 教程中与你见面。我控几不住我记几啊。
祝你愉快。
@ -170,9 +166,9 @@ Docker 引擎 Swarm [概述][16](对于 1.12 版)
via: http://www.dedoimedo.com/computers/docker-swarm-intro.html
作者:[Dedoimedo ][a]
作者:[Dedoimedo][a]
译者:[Viz](https://github.com/vizv)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出