十五、使用服务栈
Docker Swarm 模式是 Docker 1.12 版的 Docker 原生模式,用于为开发 Docker 应用创建分布式和可扩展的服务。
问题
虽然单个 Docker 映像应用也很常用,但绝大多数 Docker 企业应用都由多个映像组成,这些映像之间存在依赖关系。Docker Compose(在 v1 和 v2 中是独立的) 可以通过使用 links 和 depends_on 选项来声明微服务之间的依赖关系,但是 Compose(独立的) 是过时的,不同于在群模式服务的上下文中定义服务的格式。
解决方案
Docker Swarm mode 引入了服务栈来定义服务的集合(Swarm mode services ),这些服务彼此自动链接,以提供服务之间存在依赖关系的逻辑分组。栈使用的栈文件是 YAML 文件,其格式非常类似于 docker-compose.yml 格式。有一些不同之处,比如缺少了用于定义 Docker Compose (standalone) 中微服务之间依赖关系的 links 和 depends_on 选项。YAML ( http://www.yaml.org/ ) 是配置文件常用的一种数据序列化格式。
从 Docker v1.13 开始,已经引入了命令的 docker stack 子集来创建 Docker 栈。使用一个定义多个服务的栈文件,包括服务的配置,如环境变量、标签、容器数量和卷,一个 docker stack deploy 命令创建一个服务栈,如图 15-1 所示。这些服务会自动相互链接。

图 15-1。
Service stack created with the docker stack deploy command
Docker Compose v3.x 及更高版本完全兼容 Docker Swarm 模式,这意味着 Docker Compose v3.x docker-compose.yml 文件可以用作栈文件,但栈文件中不支持的几个子选项(包括 build 、 container_name 、 external_links 和 links ) 除外。Docker Compose 3.x 仍然可以独立使用来开发非群模式服务,但这些微服务无法与 Docker 群模式 docker service 命令组一起使用或扩展。
要使用栈来管理群模式服务,必须满足以下要求。
- Docker 版本必须是 1.13 或更高版本
- 必须启用群组模式
- 栈文件 YAML 格式必须基于 Docker Compose v3.x 文件格式
要使用服务栈,可以使用 Docker Compose 第 3 版 YAML 文件格式,但不需要安装 Docker Compose。
使用 Docker Swarm 模式时,对 Swarm 模式的 Docker 版本要求是 1.12 或更高版本。在开发管理群模式服务的栈之前,验证 Docker 版本至少是 1.13。本章使用的 Docker 版本是 17.0x。表 15-1 中列出的 docker stack 组命令在 Docker v1.13 和更高版本中可用。
表 15-1。
The docker stack Commands
| 命令 | 描述 | | `deploy` | 部署服务栈或更新现有栈 | | `ls` | 列出栈 | | `ps` | 列出栈中的群组模式任务 | | `rm` | 移除栈 | | `services` | 列出栈中的群组模式服务 |
运行 docker --version 命令列出 Docker 版本。要列出栈使用的命令,请运行 docker stack 命令。
[root@localhost ∼]# ssh -i "docker.pem" docker@34.205.43.53
Welcome to Docker!
∼ $ docker --version
Docker version 17.06.0-ce, build 02c1d87
∼ $ docker stack
Usage: docker stack COMMAND
Manage Docker stacks
Options:
--help Print usage
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
要使用栈,请使用以下过程。
- 安装 Docker 版本 1.13 或更高版本(不是 Docker 版本 1.12,它在前面的几章中使用)。
- 启用 Swarm 模式。
- 使用 Docker Compose(3 . x 版)YAML 格式创建一个栈文件。
- 使用
docker stack组命令创建和管理栈。
本章创建了一个由两个服务组成的服务栈,一个用于 WordPress 博客,另一个用于 MySQL 数据库,以存储 WordPress 博客中的数据。
设置环境
我们使用位于 https://docs.docker.com/docker-for-aws/ 的 Docker for AWS 来启动一个 Docker Swarm 模式的节点集群。Docker for AWS 使用 AWS CloudFormation 模板创建 Docker Swarm 模式集群。点击 Deploy Docker Community Edition(stable),如图 15-2 所示,启动 Create CloudFormation Stack 向导创建 Docker Swarm mode 集群。

图 15-2。
Deploying the Docker Community Edition for AWS (stable)
如第 3 章所述,使用创建栈向导配置一个群组。您可以指定群组管理器的数量为 1、3 或 5,群组工作节点的数量为 1-1000。我们使用了一个群管理器节点和两个群工作者节点,如图 15-3 所示。

图 15-3。
Configuring a CloudFormation stack
云形成栈被创建,如图 15-4 所示。

图 15-4。
CloudFormation Stack for Docker on AWS
启动三个 EC2 实例 - 一个用于 Docker Swarm manager 节点,两个用于 Swarm worker 节点,如图 15-5 所示。CloudFormation 栈使用的 Linux 发行版是莫比 Linux,如图 15-5 所示。

图 15-5。
The Moby Linux AMI used for Docker on AWS
在能够在 AWS 上使用 Docker 之前,在 EC2 实例使用的安全组中启用 EC2 实例之间的所有入站/出站流量。在图 15-6 中显示了群管理器节点实例入站规则的安全组。

图 15-6。
The security group inbound rules are enabled for all traffic
SSH 登录 Swarm manager EC2 实例,从 AWS 管理控制台获取公共 IP 地址,如图 15-7 所示。

图 15-7。
Public IP address
使用用于创建云形成栈的密钥对 SSH 登录到 Swarm manager 实例。
ssh -i "docker.pem" docker@54.205.48.154
将显示群管理器节点的命令提示符。
[root@localhost ∼]# ssh -i "docker.pem" docker@54.205.48.154 Welcome to Docker!
列出 Swarm 模式中的节点。
docker node ls
列出了三个节点,一个经理和两个工人。
∼ $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS bf4ifhh86sivqp03ofzhk6c46 ip-172-31-21-175.ec2.internal Ready Active ozdhl0jtnricny1y95xbnhwtq ip-172-31-37-108.ec2.internal Ready Active ud2js50r4livrqf3f4l30fv9r * ip-172-31-19-138.ec2.internal Ready Active Leader
通过创建并列出 Hello World 服务来测试 Swarm 模式。
docker service create --replicas 2 --name helloworld alpine ping docker.com docker service ls
docker service 命令输出表明 Docker Swarm 服务,因此它被创建并列出。
∼ $ docker service create --replicas 2 --name helloworld alpine ping docker.com q05fef2a7cf98cv4r2ziyccnv ∼ $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS q05fef2a7cf9 helloworld replicated 2/2 alpine:latest ∼ $
配置服务栈
要创建由两个服务组成的服务栈,一个用于 WordPress 博客,另一个用于 MySQL 数据库,使用 Docker Compose 版本 3 YAML 格式( https://docs.docker.com/compose/compose-file/ ) 创建一个栈文件。创建一个 docker-cloud.yml 栈文件(文件名是任意的) 来分别使用 Docker 映像 wordpress 和 mysql 指定两个服务( web 和 mysql )。为 Docker 映像设置环境变量。唯一需要设置的环境变量是 mysql Docker 映像的 MYSQL_ROOT_PASSWORD 。 wordpress Docker 映像的 WORDPRESS_DB_PASSWORD 环境变量默认为 MYSQL_ROOT_PASSWORD ,但也可以明确设置为与 MYSQL_ROOT_PASSWORD 相同的值。表 15-2 中列出了 wordpress Docker 映像使用的其他一些环境变量。
表 15-2。
Environment Variables for the Docker Image WordPress
| 环境变量 | 描述 | 缺省值 | | --- | --- | --- | | `WORDPRESS_DB_HOST` | 链接的数据库主机,默认情况下假定为 MySQL 数据库。 | 链接的`mysql` Docker 容器的 IP 和端口 | | `WORDPRESS_DB_USER` | 数据库用户。 | `root` | | `WORDPRESS_DB_PASSWORD` | 数据库密码。 | `MYSQL_ROOT_PASSWORD` | | `WORDPRESS_DB_NAME` | 数据库名称。如果数据库尚不存在,则创建该数据库。 | `wordpress` | | `WORDPRESS_TABLE_PREFIX` | 表格前缀。 | ` ` |
如果我们要用 wordpress 和 mysql 图片和 docker run 命令创建一个 WordPress 博客,我们将为每个 Docker 图片分别创建 Docker 容器,并使用 –link 选项链接这些容器。如果我们要使用 Docker Compose(独立的),我们需要在 Docker Compose 文件中添加一个 links 或 depends_on 子选项。
接下来,将 Docker 映像和环境变量指定到栈文件中,以创建服务栈。要将 Docker Compose YAML 文件格式用于群组模式栈,请将栈文件中的 version 指定为 3 或更高版本,如 3.1 。列出了 docker-cloud.yml 文件:
version: '3' services: web: image: wordpress links: - mysql environment: - WORDPRESS_DB_PASSWORD="mysql" ports: - "8080:80" mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD="mysql" - MYSQL_DATABASE="mysqldb"
8080:80 的 ports 映射将 WordPress Docker 容器端口 80 映射到主机端口 8080。创建栈时,会忽略任何栈文件选项,例如前面列表中包含的 docker stack deploy 不支持的链接。将前面的清单作为 docker-cloud.yml 存储在 Swarm manager EC2 实例中。在 Swarm manager 中列出文件应该会列出 docker-cloud.yml 文件。
∼ $ ls -l total 4 -rwxr-x--- 1 docker docker 265 Jun 17 00:07 docker-cloud.yml
配置了包含两个服务的栈文件后,接下来我们将创建一个服务栈。
创建栈
docker stack deploy 命令用于创建和部署栈。它具有以下语法。
docker stack deploy [OPTIONS] STACK
表 15-3 中讨论了支持的选项。
表 15-3。
Options for the docker stack deploy Command
| [计]选项 | 描述 | 缺省值 | | --- | --- | --- | | `--bundle-file` | 分布式应用包文件的路径。从 Docker 合成文件创建应用包,就像从 Docker 文件创建 Docker 映像一样。应用包可用于创建栈。在开发本章时,应用包是一个试验性的特性,不在本章中讨论。 | | | `--compose-file, -c` | 栈文件的路径。 | | | `--with-registry-` `auth` | 是否向群代理发送注册认证信息。 | 错误的 |
使用栈文件 docker-cloud.yml ,用 docker stack deploy 命令创建一个名为 mysql 的 Docker 栈。
docker stack deploy --compose-file docker-cloud.yml mysql
会创建一个 Docker 栈,并忽略群组模式中不支持的 links 选项。除了网络 mysql_default 之外,还创建了两个群服务 mysql_mysql 和 mysql_web 。
∼ $ docker stack deploy --compose-file docker-cloud.yml mysql Ignoring unsupported options: links Creating network mysql_default Creating service mysql_mysql Creating service mysql_web
列表栈
使用以下命令列出栈。
docker stack ls
列出了 mysql 栈。还列出了栈中的服务数量。
∼ $ docker stack ls NAME SERVICES mysql 2
列表服务
使用 docker stack services 命令列出 mysql 栈中的服务,其语法如下。
docker stack services [OPTIONS] STACK
表 15-4 中列出了支持的选项。
表 15-4。
Options for the docker stack services Command
| [计]选项 | 描述 | 缺省值 | | --- | --- | --- | | `--filter, -f` | 基于提供的过滤器(或条件) 过滤输出 | | | `--quiet, -q` | 是否只显示服务的 id | `false` |
若要列出所有服务,请运行以下命令。
docker stack services mysql
列出了两种服务 - mysql_mysql 和 mysql_web 。
∼ $ docker stack services mysql ID NAME MODE REPLICAS IMAGE ixv0ykhuo14c mysql_mysql replicated 1/1 mysql:latest vl7ph81hfxan mysql_web replicated 1/1 wordpress:latest
要过滤服务,添加 --filter 选项。要过滤多个服务,添加多个 --filter 选项,如下面的命令所示。
docker stack services --filter name=mysql_web --filter name=mysql_mysql mysql
将列出过滤后的栈服务。因为两个服务都是使用 –filter 指定的,所以两个服务都被列出。
∼ $ docker stack services --filter name=mysql_web --filter name=mysql_mysql mysql l ID NAME MODE REPLICAS IMAGE ixv0ykhuo14c mysql_mysql replicated 1/1 mysql:latest vl7ph81hfxan mysql_web replicated 1/1 wordpress:latest
栈创建的服务是群服务,也可以使用以下命令列出。
docker service ls
列出了相同的两种服务。
∼ $ docker service ls ID NAME MODE REPLICAS IMAGE ixv0ykhuo14c mysql_mysql replicated 1/1 mysql:latest sl2jmsat30ex helloworld replicated 2/2 alpine:latest vl7ph81hfxan mysql_web replicated 1/1 wordpress:latest
列出 Docker 容器
docker stack ps 命令用于列出栈中的 Docker 容器,其语法如下:使用 --help 选项输出命令用法。
∼ $ docker stack ps --help
Usage: docker stack ps [OPTIONS] STACK
List the tasks in the stack
Options:
-f, --filter filter Filter output based on conditions provided
--help Print usage
--no-resolve Do not map IDs to Names
--no-trunc Do not truncate output
要列出 mysql 栈中的所有 Docker 容器,运行以下命令。
docker stack ps mysql
默认情况下,为每个服务创建一个副本,因此为栈中的每个服务列出一个 Docker 容器。两个 Docker 容器都运行在一个 Swarm worker 节点上。
∼ $ docker stack ps mysql ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS n9oqwaikd61g mysql_web.1 wordpress:latest ip-172-31-37-108.ec2.internal Running Running 3 minutes ago infzi7kxg9g9 mysql_mysql.1 mysql:latest ip-172-31-37-108.ec2.internal Running Running 3 minutes ago
使用 –f 选项过滤 Docker 容器,只列出 mysql_web.1 容器。
∼ $ docker stack ps -f name=mysql_web.1 mysql ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS n9oqwaikd61g mysql_web.1 wordpress:latest ip-172-31-37-108.ec2.internal Running Running 9 minutes ago
通过将 desired-state 过滤器设置为正在运行,列出所有正在运行的容器。
∼ $ docker stack ps -f desired-state=running mysql ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS n9oqwaikd61g mysql_web.1 wordpress:latest ip-172-31-37-108.ec2.internal Running Running 10 minutes ago infzi7kxg9g9 mysql_mysql.1 mysql:latest ip-172-31-37-108.ec2.internal Running Running 10 minutes ago
使用服务栈
接下来,我们使用这个栈来创建一个 WordPress 博客。可以在 Swarm manager 主机的端口 8080 上访问名为 web 的栈服务。获取群管理器节点 EC2 实例的公共 DNS,如图 15-8 所示。

图 15-8。
Public DNS of Swarm manager
在浏览器中打开 <public dns>:8080 URL。显示 <public dns>:8080/wp-admin/install.php URL 来开始 WordPress 的安装。选择继续。指定副标题、用户名、密码、电子邮件以及是否阻止搜索引擎对网站进行索引。然后点击安装 WordPress,如图 15-9 所示。

图 15-9。
Installing WordPress
安装好 WordPress,如图 15-10 所示。点击登录。

图 15-10。
WordPress is installed
指定用户名和密码,点击登录,如图 15-11 所示。

图 15-11。
Logging in
显示 WordPress 博客仪表盘,如图 15-12 所示。

图 15-12。
The WordPress dashboard
要添加新帖子,请选择帖子并点击 添加新 ,如图 15-13 所示。

图 15-13。
Adding a new post
在 添加新文章 对话框中,指定标题并添加博客条目。点击发布,如图 15-14 所示。

图 15-14。
Publishing a new post
新帖子已添加。点击查看帖子,如图 15-15 所示,显示帖子。

图 15-15。
Viewing the new post
显示博文,如图 15-16 所示。

图 15-16。
Displaying a blog post
向下滚动并添加注释,如图 15-17 所示。

图 15-17。
Adding a comment
添加注释,如图 15-18 所示。

图 15-18。
The comment has been added
移除栈
docker stack rm STACK 命令用于移除栈。使用以下命令移除 mysql 栈。
docker stack rm mysql
删除了 mysql 栈,并且 docker stack service mysql 命令没有列出栈,如该命令的输出所示。
∼$ docker stack rm mysql Removing service mysql_mysql Removing service mysql_web Removing network mysql_default ∼$ docker stack services mysql Nothing found in stack: mysql
摘要
本章介绍了 Docker 1.13 中添加的 Docker 原生特性 stacks。栈是相关服务的集合,使用栈文件创建,栈文件以类似于 Docker Compose v3.x YAML 语法的 YAML 格式定义。本章总结了这本书关于 Docker 管理设计模式的内容。随着 Docker 中新特性的加入,其他设计模式也可以用于开发 Docker 原生应用。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论