在 AWS 中使用 Docker Swarm
1. 技术要求
在开始使用 Docker Swarm 之前,需要满足以下技术要求:
- 拥有 AWS 账户的管理访问权限。
- 按照相关指引配置好本地环境。
- 按照特定说明配置好本地 AWS 配置文件。
- AWS CLI 版本为 1.15.71 或更高。
- Docker 版本为 18.06 CE 或更高。
- Docker Compose 版本为 1.22 或更高。
- GNU Make 版本为 3.82 或更高。
2. Docker Swarm 简介
Docker Swarm 是 Docker 引擎的原生集成功能,提供集群管理和容器编排功能,能让你在生产环境中大规模运行 Docker 容器。从 Docker 引擎 1.13 版本及更高版本开始,都支持以集群模式运行,具备以下特性:
| 特性 | 描述 |
| ---- | ---- |
| 集群管理 | 所有以集群模式运行的节点都具备原生集群功能,可快速建立集群并部署应用。 |
| 多主机网络 | 支持覆盖网络,能创建虚拟网络,使连接到该网络的容器可进行私密通信,且与物理网络拓扑无关。 |
| 服务发现和负载均衡 | 支持基于 DNS 的简单服务发现模型,应用可相互发现,还支持 DNS 轮询自动负载均衡,并能与外部负载均衡器集成。 |
| 服务扩展和滚动更新 | 可轻松扩展或缩减服务,更新服务时支持智能滚动更新,且在部署失败时支持回滚。 |
| 声明式服务模型 | 使用 Docker Compose 规范以声明式方式定义应用服务、网络、卷等,易于理解和维护。 |
| 期望状态 | 持续监控应用和运行时状态,确保服务按配置的期望状态运行。 |
| 生产级操作特性 | 如 Docker 机密和配置管理,可解决生产中的实际问题,如安全分发机密和配置数据。 |
在 AWS 上运行 Docker Swarm,可使用 Docker 提供的社区版 Docker for AWS CE,通过预定义的 CloudFormation 模板部署,该模板可将 Docker Swarm 与多个 AWS 服务集成,便于在 AWS 上搭建新的 Docker Swarm 集群。
3. Docker Swarm 与 Kubernetes 对比
如果仅在 AWS 上运行容器工作负载,推荐使用 ECS。但很多组织希望采用云无关的方法,Docker Swarm 是当前的领先解决方案之一。目前,Docker Swarm 与 Kubernetes 正面竞争,Kubernetes 已成为领先的云无关容器管理平台,但 Docker Swarm 也有其优势:
- 易于设置和使用,使用熟悉的工具如 Docker Compose,能快速上手。
- 对于想快速启动并确保操作简单的小型组织,是有吸引力的选择。
不过,AWS 推出的 Elastic Kubernetes Service (EKS) 让在 AWS 上使用 Kubernetes 变得更加容易。建议你尝试两者后,根据自身和组织目标做出选择。
4. 安装 Docker for AWS
在 AWS 上安装 Docker Swarm 的推荐且快速的方法是使用 Docker for AWS,可在 文档 中了解更多。这里选择免费的 Docker CE for AWS (stable) 版本,并可选择部署到新的 VPC 或现有的 VPC。
假设已有现有的 VPC,点击“Deploy Docker CE for AWS (stable) users your existing VPC”选项,会被重定向到 AWS CloudFormation 控制台,创建一个基于 Docker 发布模板的新堆栈。创建堆栈时,需指定以下参数(未提及的参数使用默认配置):
- 堆栈名称 :例如 docker-swarm 。
- Swarm 规模 :指定 Swarm 管理器和工作节点的数量,建议至少配置一个管理器和一个工作节点。
- Swarm 属性 :配置 Swarm EC2 实例使用现有的管理 SSH 密钥,并启用“Create EFS prerequisites for Store”属性。
- Swarm 管理器属性 :将管理器临时存储卷类型更改为 gp2 (SSD)。
- Swarm 工作节点属性 :将工作节点临时存储卷类型更改为 gp2 (SSD)。
- VPC/网络 :选择现有的默认 VPC,指定 VPC CIDR 范围,并选择合适的公共子网。
完成配置后,点击“Next”两次,在审核页面选择“我确认 AWS CloudFormation 可能会创建 IAM 资源”选项,然后点击“Create”。新的 CloudFormation 堆栈将在 10 - 15 分钟内创建完成。如需增加管理器或工作节点数量,可通过更新 CloudFormation 堆栈修改相应参数;升级 Docker for AWS Swarm 集群时,需应用包含更新的最新 CloudFormation 模板。
5. Docker for AWS CloudFormation 堆栈创建的资源
在 CloudFormation 控制台的新堆栈“Resources”选项卡中,可看到创建的各种资源,重要的资源如下:
- CloudWatch 日志组 :存储通过 Swarm 集群调度的容器的所有日志(仅在堆栈创建时启用“Use Cloudwatch for container logging”参数时创建,默认启用)。
- 外部负载均衡器 :创建经典的 Elastic Load Balancer,用于发布对 Docker 应用的公共访问。
- Elastic Container Registry IAM 策略 :创建 IAM 策略并附加到所有 Swarm 管理器和工作节点的 EC2 实例角色,允许对 ECR 进行读取/拉取访问。
- 其他资源 :如用于集群管理操作的 DynamoDB 表,以及用于 Swarm 管理器升级场景中 EC2 自动扩展生命周期钩子的 Simple Queue Service (SQS) 队列。
在“Outputs”选项卡中,有一个名为“DefaultDNSTarget”的输出属性,它引用了外部负载均衡器的公共 URL,后续示例应用将通过该 URL 访问。
6. 访问 Swarm 集群
在 CloudFormation 堆栈输出中,有一个“Managers”属性,提供了每个 Swarm 管理器的 EC2 实例链接。可据此获取 Swarm 管理器的公共 IP 地址或 DNS 名称,然后通过 SSH 连接到管理器:
ssh -i ~/.ssh/admin.pem docker@54.145.175.148
连接时需指定用户名为 docker ,运行 docker ps 命令可看到管理器上默认运行的四个系统容器:
- shell-aws :提供对管理器的 SSH 访问,即建立的 SSH 会话实际上在该容器内运行。
- meta-aws :提供通用元数据服务,包括提供允许新成员加入集群的令牌。
- guide-aws :执行集群状态管理操作,如将每个管理器添加到 DynamoDB,以及清理未使用的镜像、卷和停止的容器等日常任务。
- l4controller-aws :管理 Swarm 集群与外部负载均衡器的集成,负责发布新端口并确保在弹性负载均衡器上可访问,切勿直接修改集群的 ELB,应依靠该组件进行管理。
使用 docker node ls 命令可查看和访问集群中的其他节点:
docker node ls
工作节点不允许公共 SSH 访问,只能从管理器通过 SSH 访问,但管理器节点本地未存储管理 EC2 密钥对的私钥,因此无法直接建立 SSH 会话到工作节点。
7. 设置本地访问 Docker Swarm
虽然可通过 SSH 会话远程运行 Docker 命令,但使用本地 Docker 客户端与远程 Swarm 管理器守护进程交互更方便,同时也能解决无法通过 SSH 访问工作节点的问题,可使用 SSH 代理转发和 SSH 隧道技术来实现。
7.1 配置 SSH 代理转发
使用 ssh-add 命令将管理 SSH 密钥添加到本地 SSH 代理:
ssh-add -K ~/.ssh/admin.pem
-K 标志特定于 macOS,用于将 SSH 密钥的密码短语添加到 OS X 钥匙串,使配置在重启后仍有效。非 macOS 系统可省略 -K 标志。
使用 -A 标志访问 Swarm 管理器,启用 SSH 代理转发:
ssh -A docker@54.145.175.148
在 SSH 会话中,可通过管理器访问工作节点:
ssh docker@ip-172-31-27-91.ec2.internal
7.2 配置 SSH 隧道
SSH 隧道可将网络通信安全地通过加密的 SSH 会话传输到远程主机。以下命令可使 Swarm 管理器上运行的 Docker 套接字在本地主机上显示为一个端口:
ssh -i ~/.ssh/admin.pem -NL localhost:2374:/var/run/docker.sock docker@54.145.175.148 &
-N 标志指示客户端不发送远程命令, -L 标志将本地主机的 TCP 端口 2374 映射到远程 Swarm 管理器上的 /var/run/docker.sock Docker 引擎套接字, & 符号使命令在后台运行,并输出进程 ID。
配置完成后,可通过指定 -H 标志或导出环境变量 DOCKER_HOST 来运行 Docker 客户端:
docker -H localhost:2374 ps --format "{{ .ID }}: {{ .Names }}"
export DOCKER_HOST=localhost:2374
docker node ls --format "{{ .ID }}: {{ .Hostname }}"
使用 SSH 隧道暴露远程 Docker 套接字比使用 Docker 自带的客户端/服务器模型更易于设置和维护,且与任何形式的远程 SSH 访问一样安全。
8. 向 Docker Swarm 部署应用
安装 Docker Swarm 并建立与集群的管理连接后,就可以开始部署应用了。向 Docker Swarm 部署应用需要使用 docker service 和 docker stack 命令,下面通过部署几个示例应用来熟悉这些命令。
8.1 Docker 服务
虽然理论上可以将单个容器部署到 Swarm 集群,但建议始终使用 Docker 服务作为部署到 Swarm 集群的标准单元。使用 docker service create 命令创建 Docker 服务,以下示例使用 Nginx 网络服务器创建一个简单的 Web 应用:
docker service create --name nginx --publish published=80,target=80 --replicas 2 nginx
运行上述命令后,可看到服务的部署进度:
ez24df69qb2yq1zhyxma38dzo
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
使用 docker service ps 命令查看服务的任务状态:
docker service ps --format "{{ .ID }} ({{ .Name }}): {{ .Node }} {{ .CurrentState }}" nginx
以下是整个部署流程的 mermaid 流程图:
graph LR
A[满足技术要求] --> B[安装 Docker for AWS]
B --> C[创建 CloudFormation 堆栈]
C --> D[访问 Swarm 集群]
D --> E[设置本地访问]
E --> F[部署应用]
通过以上步骤,你可以在 AWS 上成功部署和管理 Docker Swarm 集群,并向其部署应用。
在 AWS 中使用 Docker Swarm
9. Docker 堆栈
Docker 堆栈允许你使用 Docker Compose 文件一次性部署多个相互关联的服务。以下是一个简单的 Docker Compose 文件示例 docker-compose.yml :
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
deploy:
replicas: 2
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
deploy:
replicas: 1
使用 docker stack deploy 命令部署堆栈:
docker stack deploy -c docker-compose.yml my-stack
运行上述命令后,Docker 会根据 Compose 文件创建并启动所有服务。可以使用 docker stack ps 命令查看堆栈中服务的任务状态:
docker stack ps my-stack
还可以使用 docker stack rm 命令移除堆栈:
docker stack rm my-stack
10. 集成 Docker Swarm 与 ECR
如果将 Docker 镜像存储在 Amazon Elastic Container Registry (ECR) 中,需要进行一些配置以确保 Swarm 集群可以访问这些镜像。
- 登录 ECR :使用 AWS CLI 登录 ECR:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <your-account-id>.dkr.ecr.us-east-1.amazonaws.com
- 创建 IAM 策略 :在创建 Docker for AWS 堆栈时,已经创建了允许对 ECR 进行读取/拉取访问的 IAM 策略。确保所有 Swarm 管理器和工作节点的 EC2 实例角色都附加了该策略。
- 使用 ECR 镜像 :在创建 Docker 服务或部署堆栈时,可以直接使用 ECR 中的镜像。例如:
docker service create --name my-service --publish published=80,target=80 <your-account-id>.dkr.ecr.us-east-1.amazonaws.com/my-image:latest
11. 创建共享 Docker 卷使用 EFS
Amazon Elastic File System (EFS) 可以为 Docker Swarm 集群提供共享存储。在创建 Docker for AWS 堆栈时,已经启用了创建 EFS 先决条件的选项。
- 创建 EFS 文件系统 :在 AWS 控制台中创建一个 EFS 文件系统,并将其挂载到 Swarm 集群的节点上。
- 在 Docker 服务中使用 EFS 卷 :在 Docker Compose 文件中定义使用 EFS 卷的服务。例如:
version: '3'
services:
app:
image: my-app
volumes:
- my-efs-volume:/data
volumes:
my-efs-volume:
driver_opts:
type: "nfs4"
o: "addr=<efs-dns-name>,rw"
device: ":/<efs-mount-point>"
然后使用 docker stack deploy 命令部署堆栈,这样服务就可以使用共享的 EFS 卷了。
12. 创建持久 Docker 卷使用 EBS
Amazon Elastic Block Store (EBS) 可以为 Docker 容器提供持久存储。
- 创建 EBS 卷 :在 AWS 控制台中创建一个 EBS 卷,并将其挂载到 Swarm 集群的节点上。
- 在 Docker 服务中使用 EBS 卷 :在 Docker Compose 文件中定义使用 EBS 卷的服务。例如:
version: '3'
services:
db:
image: mysql:5.7
volumes:
- my-ebs-volume:/var/lib/mysql
volumes:
my-ebs-volume:
driver_opts:
type: "ext4"
device: "/dev/xvdf"
同样,使用 docker stack deploy 命令部署堆栈,服务就可以使用持久的 EBS 卷了。
13. 支持一次性部署任务
有时候,你可能需要在 Swarm 集群中执行一次性的任务,例如数据库迁移。可以使用 docker service create 命令结合 --mode replicated-job 选项来实现。
docker service create --name my-job --mode replicated-job --replicas 1 my-image:latest my-command
上述命令会创建一个只运行一次的任务,任务完成后服务会自动停止。
14. 执行滚动更新
当需要更新服务时,Docker Swarm 支持滚动更新,确保在更新过程中服务的可用性。以下是一个更新 Nginx 服务的示例:
docker service update --image nginx:1.19 nginx
在更新过程中,Docker 会逐个替换旧的容器为新的容器,同时可以通过 docker service ps 命令监控更新进度。如果更新过程中出现问题,可以使用 docker service rollback 命令回滚到上一个版本:
docker service rollback nginx
15. 总结
在 AWS 上使用 Docker Swarm 可以方便地部署和管理容器化应用。通过以下步骤,你可以在 AWS 上构建一个强大的容器编排环境:
1. 满足技术要求,包括 AWS 账户权限、本地环境配置等。
2. 安装 Docker for AWS,创建 CloudFormation 堆栈。
3. 访问 Swarm 集群,设置本地访问。
4. 部署应用,包括使用 Docker 服务和 Docker 堆栈。
5. 集成 Docker Swarm 与 ECR,使用共享和持久存储。
6. 支持一次性部署任务和执行滚动更新。
以下是整个流程的表格总结:
| 步骤 | 操作 | 命令示例 |
| ---- | ---- | ---- |
| 满足技术要求 | 配置 AWS 账户、本地环境等 | 无 |
| 安装 Docker for AWS | 选择 Docker CE for AWS (stable) 并创建 CloudFormation 堆栈 | docker stack deploy -c docker-compose.yml my-stack |
| 访问 Swarm 集群 | 通过 SSH 连接到管理器 | ssh -i ~/.ssh/admin.pem docker@54.145.175.148 |
| 设置本地访问 | 配置 SSH 代理转发和 SSH 隧道 | ssh -i ~/.ssh/admin.pem -NL localhost:2374:/var/run/docker.sock docker@54.145.175.148 & |
| 部署应用 | 创建 Docker 服务和堆栈 | docker service create --name nginx --publish published=80,target=80 --replicas 2 nginx |
| 集成 ECR | 登录 ECR 并使用 ECR 镜像 | aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <your-account-id>.dkr.ecr.us-east-1.amazonaws.com |
| 使用存储 | 创建共享 EFS 卷和持久 EBS 卷 | 在 Docker Compose 文件中定义卷 |
| 一次性任务 | 创建一次性任务 | docker service create --name my-job --mode replicated-job --replicas 1 my-image:latest my-command |
| 滚动更新 | 更新服务并支持回滚 | docker service update --image nginx:1.19 nginx , docker service rollback nginx |
通过掌握这些技能,你可以在 AWS 上高效地运行和管理 Docker Swarm 集群,为你的应用提供稳定可靠的运行环境。
超级会员免费看
23

被折叠的 条评论
为什么被折叠?



