十四、在 Docker Cloud 中使用 Swarm 模式
Docker for AWS 是 Docker Swarm 基于定制 Linux 发行版的托管服务,托管在 AWS 上,具有与 AWS 云平台集成的所有固有优势,如 CloudWatch 的集中式日志记录、定制调试、自动扩展组、弹性负载均衡和 DynamoDB 数据库。
问题
虽然 AWS 是一个托管云平台,但它本身不是 Docker 容器、映像和服务的托管服务。Docker 的构建和测试仍然需要集成。
解决方案
Docker Cloud 是一项托管服务,用于测试代码和构建 Docker 映像,并在 Docker Cloud 注册表中创建和管理 Docker 映像库。Docker Cloud 还管理 Docker 容器、服务、栈、节点和节点集群。栈是服务的集合,而服务是容器的集合。Docker Cloud 是一个集成的云服务,可以管理构建和映像、基础架构、节点和应用。
Docker Cloud 还引入了 Swarm 模式来管理 Docker Swarms。在 Swarm 模式下,Docker Cloud 与 Docker for AWS 集成。因此,Docker 云群模式是两种托管服务的集成 - Docker for AWS 和 Docker Cloud。
Docker Cloud 提供了一些 Docker 映像,用于在 Docker 群和 Docker 主机客户端之间进行交互,如表 14-1 中所述。
表 14-1。
Docker Images for Docker Swarm
| Docker 映像 | 描述 | | --- | --- | | `dockercloud/client` | 在客户端使用 Docker ID 凭证启动交互式 shell 以连接到远程 docker Swarm 集群。 | | `dockercloud/client-proxy` | 在客户端使用,通过在每个请求上注入 Docker ID 授权信息,将本地 docker API 调用转发到远程群集群。 | | `dockercloud/server-proxy` | 验证和授权传入的 Docker API 调用,并将它们转发到本地 Docker 引擎。 | | `dockercloud/registration` | 向 Docker Cloud 注册一个群集群并启动一个服务器代理。 |
在本章中,我们将讨论 Docker 云群模式,以向 Docker 云群提供 AWS 上托管的基础架构。本章涵盖以下主题:
- 设置环境
- 创建 IAM 角色
- 在 Docker 云中创建 Docker 群
- 从 Docker 主机连接到 Docker 群组
- 从群组管理器连接到 Docker 群组
- 将蜂群带入 Docker 云
设置环境
由于 Docker Cloud 是一项托管服务,因此所需要的只是一个帐户,该帐户可以在 https://cloud.docker.com/ 创建。AWS 帐户也是必需的,可以在 https://aws.amazon.com/resources/create-account/ 创建。还要在 Docker Swarm 的 EC2 实例将要运行的区域中创建一个密钥对,如图 14-1 所示。

图 14-1。
Creating a key pair on AWS EC2
创建 IAM 角色
Docker 云群模式需要一个具有新策略的 AWS 角色,这是 Docker for AWS 的嵌入式策略。要创建 IAM 角色,请在 web 浏览器中导航至 https://console.aws.amazon.com/iam/home?#roles 。点击新建角色,如图 14-2 所示。

图 14-2。
Creating a new role
指定一个角色名称( dockercloud-swarm-role ),如图 14-3 ,点击下一步。

图 14-3。
Specifying a role name
显示选择角色类型页面,如图 14-4 所示。由于我们链接了两个服务 - Docker Cloud 和 Docker for AWS - 我们不需要选择 AWS 服务角色。

图 14-4。
Select the role type
选择跨账户访问的角色,如图 14-5 所示,并使用选择按钮选择名为 在您的 AWS 账户和第三方 AWS 账户之间提供访问 的子选项。

图 14-5。
Role for cross-account access
接下来,指定 IAM 用户将访问 AWS 帐户的第三方 AWS 帐户的帐户 ID。已经为 Docker 云服务设置了一个第三方 AWS 帐户,其帐户 ID 为 689684103426 ,任何人(AWS 用户) 都可以将 Docker 云服务链接到其 AWS 帐户。指定账户 ID 为 689684103426 ,如图 14-6 所示。外部 ID 是在 https://cloud.docker.com/ 创建的 Docker 云服务账户的用户 Docker ID。虽然每个人的帐户 ID 都是相同的( 689684103426 ),但是不同用户的外部 ID 是不同的。保持要求 MFA 复选框未选中。点击下一步。

图 14-6。
Specifying account and external IDs
由于我们正在嵌入自定义策略,因此不要从 Attach Policy 中列出的任何策略中进行选择。点击下一步,如图 14-7 所示。

图 14-7。
Do not select a policy
在审核页面,点击创建角色,如图 14-8 所示。

图 14-8。
Creating a role
一个名为 dockercloud-swarm-role 的新 AWS IAM 角色被创建,如图 14-9 所示。单击 dockercloud-swarm-role 角色名称。

图 14-9。
New role
接下来,我们将添加一个嵌入式(也称为内联) 策略。默认情况下,应选择 权限 选项卡。点击 v 图标,展开内嵌策略部分,如图 14-10 所示。

图 14-10。
Expanding the inline policies
首先,没有列出内联策略。点击点击此处链接,添加一个内嵌策略,如图 14-11 所示。

图 14-11。
Click on the Click Here link to add an inline policy
在设置权限界面,使用选择按钮选择自定义策略,如图 14-12 所示。

图 14-12。
Selecting a custom policy
策略文档列出了一些权限,IAM 角色使用 Docker for AWS 的策略文档可从 https://docs.docker.com/docker-for-aws/iam-permissions/ 获得。点击【验证策略】对策略进行验证,如图 14-13 所示。

图 14-13。
Validating the policy
点击应用策略,如图 14-14 所示。

图 14-14。
Applying the policy
为 dockercloud-swarm-role 角色添加了一个新的内联策略,如图 14-15 所示。

图 14-15。
The new inline policy is added
复制图 14-16 中列出的角色 ARN 字符串,因为我们需要 ARN 字符串从 Docker Cloud 连接到 AWS 云提供商。

图 14-16。
Role ARN
在 Docker 云中创建 Docker 群
在本节中,我们将从 Docker 云服务中创建一个 Docker Swarm。在 https://cloud.docker.com/ 登录 Docker 云服务。云注册表页面应该显示在 https://cloud.docker.com/app/dvohra/dashboard/onboarding/cloud-registry 。空白处有一个群组模式选项,默认关闭,如图 14-17 所示。

图 14-17。
The Swarm Mode slider
点击 Swarm 模式滑块;应启用群组模式,如图 14-18 所示。

图 14-18。
Switching to Swarm mode
增加一个群组工具栏选项,如图 14-19 所示。

图 14-19。
Swarms toolbar option
有两种选择 - 带上你自己的蜂群或者创建一个新的蜂群。点击创建创建一个新的蜂群,如图 14-20 所示。

图 14-20。
Creating a new Swarm
接下来,我们将配置群组,包括指定群组名称、选择云提供商和选择云提供商选项。支持两个云服务提供商:Amazon Web Services (AWS) 和 Microsoft Azure(尚不可用)。我们在本章中使用 AWS。我们需要用之前复制的 ARN 字符串来配置 AWS 的云设置。云设置可以通过以下两个选项之一进行配置。一种选择是从账户中选择云设置,如图 14-21 所示。

图 14-21。
Cloud settings
在云设置页面,点击表示亚马逊网络服务提供商 Connect Provider 的插件图标,如图 14-22 所示。

图 14-22。
Connecting the provider
显示添加 AWS 凭证对话框,如图 14-23 所示。

图 14-23。
Adding AWS credentials
配置云设置的另一个选项是单击 Amazon Web Service 服务提供商图标,如图 14-24 所示,这也会显示添加 AWS 凭证对话框。

图 14-24。
Connecting to an Amazon web services provider
指定之前从添加 AWS 凭证对话框中复制的 ARN 字符串并点击保存,如图 14-25 所示。

图 14-25。
Saving the AWS credentials
无论选择哪种方式,服务提供商 Amazon Web Services 都应该连接,如连接提供商图标变为已连接所示,如图 14-26 所示。

图 14-26。
Amazon Web Services provider in connected mode
亚马逊网络服务选项应该显示 connected ,如图 14-27 所示。

图 14-27。
Amazon Web Services provider connected
指定群组名称。该名称不得包含除 , 、 , 、 - 、 _ 之外的任何空格、大写字母或特殊字符,如图 14-28 所示。

图 14-28。
Specifying a Swarm name
指定一个有效的群名称( docker-cloud-swarm ),选择已经连接好的 Amazon Web Services 服务提供商,点击创建,如图 14-29 所示。

图 14-29。
Creating a Docker Swarm using the AWS service provider
在区域中,选择一个区域( us-east-2 )、群管理器数量(3)、群工作器数量(5)、群管理器实例类型( t2.micro )、代理工作器实例类型( t2.micro ) 和 SSH 密钥。点击创建,如图 14-30 所示。

图 14-30。
Configuring and creating a Swarm
蜂群应该开始部署,如图 14-31 中的 DEPLOYING 消息所示。

图 14-31。
Deploying a Swarm
当蜂群部署完毕后,消息变成 Deployed ,如图 14-32 所示。

图 14-32。
The Swarm is now deployed
为 Swarm 创建和配置 AWS 基础设施。生成一个云状栈,如图 14-33 所示。

图 14-33。
CloudFormation stack for the created Swarm
为群组添加了一个新的代理 AWS IAM 角色,如图 14-34 所示。

图 14-34。
Proxy role and Docker Cloud Swarm AWS role
启动群管理器和工作节点的 EC2 实例。每个 EC2 实例都以自动创建的代理 IAM 角色启动,如图 14-35 中的管理节点所示。

图 14-35。
IAM role for EC2 instances
每个 Docker 云帐户名称空间必须只与一个 AWS IAM 角色相关联。如果多个 Docker 云帐户要访问同一个 AWS 帐户,则必须为每个 Docker 云帐户或 Docker 云帐户名称空间创建多个角色。Docker Cloud 访问 AWS 的每个 AWS IAM 角色都与一个 ARN 字符串相关联。可以使用编辑端点链接编辑已部署群组的 ARN 字符串,如图 14-36 所示。

图 14-36。
Edit Endpoint link
如果要修改群组端点,请在 编辑端点 对话框中指定新的 ARN 字符串(用于与不同 Docker 云名称空间关联的不同 IAM 角色)。点击保存,如图 14-37 所示。

图 14-37。
Editing the endpoint
接下来,我们连接到 Docker 群。有两种方法可以做到:
- 从任何 Docker 主机直接连接
- 从 EC2 仪表板获取群管理器的公共 IP 地址,并通过 SSH 登录群管理器
我们讨论这些选项中的每一个。
从 Docker 主机连接到 Docker 群组
点击 Docker 云仪表盘中的 Docker Swarm。应显示带有 docker run 命令的连接对话框,如图 14-38 所示。复制 docker run 命令。

图 14-38。
Listing and copying the docker run command to connect to the Swarm
用预装 Docker 的 CoreOS AMI 启动一个 EC2 实例,如图 14-39 所示。

图 14-39。
Creating an EC2 instance with CoreOS AMI
从 EC2 控制台获取 CoreOS 实例的公共 IP 地址,如图 14-40 所示。

图 14-40。
Displaying EC2 instance detail
SSH 登录到 CoreOS 实例。
ssh -i "coreos.pem" core@34.207.220.127
运行之前复制的命令来连接 Docker Swarm。
docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client dvohra/docker-cloud-swarm
下载用于连接 Docker Cloud 的 dockercloud/client Docker 映像。应该显示用户名和密码提示。指定创建群组的 Docker 云帐户的用户名和密码。
Container Linux by CoreOS stable (1298.5.0) $ docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client dvohra/docker-cloud-swarm Unable to find image 'dockercloud/client:latest' locally latest: Pulling from dockercloud/client b7f33ccOb4Be: Pull complete 91b7430c5c68: Pull complete b686674c0e39: Pull complete l9aaa3õbba7a: Pull complete Digest: sha2S6: 11d3cc5e1a62c7324]2a6e038]ccffi9]53tc91d0b1c69c8D1d3b68629337558a6 Status: Downloaded newer image for dockercloud/client:latest Use your Docker ID credentials to authenticate: Username: dvohra Password:
输出一个 export 命令以连接到群。复制命令。
Use your Docker ID credentials to authenticate: Username: dvohra Password: => You can now start using the swarm dvohra/docker-cloud-swarm by executing: export DOCKER_HOST=tcp://127.0.0.1:32768
运行命令。蜂群连接到 CoreOS Docker 主机。使用 docker node ls 命令列出群节点。
>export DOCKER_HOST=tcp://127.0.0.1:32768 >docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS liuomlmb6n6xtq4apxayumsx3 ip-172-31-0-251.us-east-2.cornpute.internal. Ready Active bchea5x85m82jtzoq336trn8y ip-172-31-47-61.us-east-2.compute.internat. Ready Active e2bl785z5pqouakdceomdpsbi ip-172-31-42-130.us-east-2.compute.internal. Ready Active hzxb8choml.7gylaqtrjrh6phx ip-172-31-26-90.us-east-2.compute.internal. Ready Active pcnple9l29w88ueonhdwUcoc ip-172-31-27-18.us-east-2.compute.internal. Ready Active rupjaojommfchjgcshffdobhf * ip-172-31-10-153.us-east-2.compute.internal Ready Active Leader uyl5xv7mhb6c8jam5ofncplyh ip-172-31-25-137.us-east-2.compute.internal. Ready Active Reachable wi6zurda4nawf9mgku3enf6io ip-172-31-34-33.us-east-2.cornpute.ìnternal Ready Active Reachable
从群组管理器连接到 Docker 群组
另一种选择是使用其公共 IP 地址连接到群管理器。首先,我们从 EC2 控制台获取一个群组管理器的公共 IP 地址,如图 14-41 所示。

图 14-41。
Obtaining the public IP of a Swarm manager
SSH 登录到 Swarm manager。
ssh -i "docker.pem" docker@52.14.146.223
群组管理器登录,并显示群组命令提示符。
[root@1ocathost - ]# ssh -i "docker.pem" docker@52.14.146.223 The authenticity of host 52.14.146.223 (52.14.146.223)1 cant be established. RSA key fingerprint is e9:7f:d2:3c:de:6d:5d:94:06:e2:09:56:b7:2a:c6:9a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '52.14.146.223 (RSA) to the list of known hosts. Welcome to Docker!
使用 docker node ls 命令列出群节点。
Welcome to Docker! ∼ $ docker node l.s ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS liuomlmb6n6xtq4apxayumsx3 ip-172-31-O-251.us-east-2.compute.internal Ready Active bchea5x85m82jtzoq336trn8y ip-172-31-47-61.us-east-2.cornpute.internal Ready Active e2bl785z5pqouakdceonìdpsbi ip-172-31-42-130.us-east-2.compute.internal Ready Active hzxb8chomt7gyl.aqtrj rh6phx ip-172-31-26-90.us-east-2.compute.interna1 Ready Active pcnple9l29w88ueenhdwflcoc ip-172-31-27-18.us-east-2.compute.internal Ready Active rupjaejommfchjgcshffdobhf * ip-172-31-1O-153.us-east-2.compute.internal. Ready Active Leader uyl5xv7mhb6c8jain5ofncplyh ip-172-31-25-137.us-east-2.compute.internal. Ready Active Reachable wi6zurda4nawf9mgku3enf6ie ip-172-31-34-33.us-east-2.compute.internal Ready Active Reachab1e
使用 docker service create 命令创建一个服务,并用 docker service ls 列出该服务。
docker service create \ --name hello-world \ --publish 8080:80 \ --replicas 1 \ tutum/hello-world
创建了 hello-world 服务。还列出了 Docker 云服务器代理服务。
∼ $ docker service create \ > --name hello-world \ > --publish 8080:80 \ > - - replicas 1 \ > tutum/hello-world hbiejbua8u5øskabun3dzkxk4 ∼ $ docker service 1s ID NAME MODE REPLICAS IMAGE 0gzua3p56myx dockerdoud-server-proxy global 3/3 dockercioud/server-proxy:latest hbiejbua8u50 hello-world replicated 1/1 tutum/hello-world:latest
将蜂群带入 Docker 云
Docker Cloud Swarm 模式还可以将现有的 Swarm 导入 Docker Cloud。要导入的群必须具备以下先决条件:
- 基于 Docker 引擎 1.13 或更高版本的节点
- 群管理器传入端口 2376 已解除阻塞
在本节中,我们创建一个群,并将该群导入 Docker Cloud。首先,运行 docker --version 命令来确定 Docker 主机版本是否是 1.13 或更高版本。Docker 为 AWS 提供的 EC2 实例之一可用于创建和导入群,因为定制 Linux 发行版上的 Docker 版本是>Docker 1.13;在创建新的群之前,必须使节点离开群。使用 EC2 实例的私有 IP 地址,启动一个新的群。
docker swarm init --advertise-addr 172.31.23.196
复制 docker swarm join 命令输出以加入工作节点。
∼ $ docker --version Docker version 17.03.0-ce, build 60ccb22 ∼ $ docker swarm init --advertise-addr 172.31.23.196 Swarm initialized: current node (ylzc3h3slxO5ztbujtl3yf86p) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-23snf1iuieafnyd1zzgf37ucwuz1.khg9atqsmysmvv6iw1.arw0-do29n83jptkkdwss5fjsd3rt \ 172.31.23.196:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
使用 Docker 1.13 或更高版本在另一个 EC2 实例上加入一个 worker 节点。
docker swarm join \
--token SWMTKN-1-61gcsgkr1ildxz580ftdl3rq0s9p7h30n12byktgvbd6y3dk7r-cpes7ofdsq8abhxtznh92tjrz \
10.0.0.176:2377
工作者节点加入群体。
创建了一个有两个节点的群,如在群管理器节点上运行的 docker node ls 命令的输出中所列。
∼$ docker node 1s HOSTNAME STATUS AVAILABILITY MANAGER STATUS trgb2t4ehs2gp3cjbrnqhs7a5 ip-172-31-6-64.us-east-2.compute.internal. Ready Active yl.ic3h3stxo5ztbujtl3yf86p ip-172-31-23-196.us-east-2.compute.internal Ready Active Leader ∼$
接下来,将 Swarm 导入 Docker Cloud。从群组管理器节点,运行以下命令。
docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock dockercloud/registration
在用户名提示符下指定 Docker ID,在密码提示符下指定密码。
∼ S docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock dockercloud/registration Unable to find image dockercloud/registration:latest’ locally latest: Pulling from dockercloud/registration b7f33ccOb48e: Pull complete b52875cf8fd4: Pull complete 23f82c866468: Pull complete Digest: sha256: a3f39de96d2763b957e7bel22ce99b8lfbbaO3fbd6b2e54bd6O7lcafbelcabcl Status: Downloaded newer image for dockercloud/registratìon:latest Use your Docker ID credentials to authenticate: Username: dvohra Password:
为导入 Docker Cloud 的群组指定一个集群名称,或使用默认名称。将集群指定为 dvohra/dockercloudswarm 。蜂群在 Docker Cloud 注册。至于在 Docker 云群模式中创建的群,可以从输出命令的任何 Docker 主机访问该群。
Enter name for the new cluster [dvohra/wkhøtlq8cw5u44x22qp6r4eau]: dvohra/dockercloudswarm You can now access this cluster using the following command in any Docker Engine docker run -rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER HOST dockerctoud/client dvohra/dockerctoudswarm
要将蜂群带入 Docker Cloud,在蜂群模式下点击自带蜂群按钮,如图 14-42 所示。

图 14-42。
Bring your own Swarm
向 Docker Cloud 注册的群被添加到 Docker Cloud 群中,如图 14-43 所示。

图 14-43。
Docker Cloud Swarms , including the imported Swarm
摘要
本章介绍了 Docker Cloud Swarm 模式,这是一种托管服务,用于将 Docker Cloud 托管服务链接到 AWS 服务提供商帐户,并从 Docker Cloud 供应 Swarm。在命令行上创建的 Swarm 可以导入 Docker Cloud。在下一章,我们将讨论 Docker 服务栈。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论