Docker 存储驱动与公共云部署指南
1. Docker 存储驱动概述
在 Docker 应用中,存储驱动的选择至关重要,不同的存储驱动在性能、稳定性和适用场景上存在差异。
1.1 各存储驱动的特性
| 存储驱动 | 特性 | 适用场景 | 性能表现 |
|---|---|---|---|
| Device Mapper | 每次容器更新现有数据时,存储驱动执行写时复制(CoW)操作,从镜像快照复制到容器快照 | 适用于某些特定的企业级应用场景 | 性能较差,对容器性能有明显影响 |
| AuFS | 能在运行的容器间高效共享镜像,启动时间快,磁盘空间使用少,能高效利用系统页面缓存 | 适用于平台即服务(PaaS)等对容器密度要求高的场景 | 性能较好 |
| OverlayFS | 类似于 AuFS,但设计更简单,可能更快 | 未来可能替代 AuFS,但目前在生产环境中不够成熟 | 具有潜力,但目前不适用于生产环境 |
1.2 存储驱动选择建议
用户应根据应用的使用场景和所需的稳定性来选择 Docker 存储驱动,也可使用发行版 Docker 包安装的默认驱动。例如,若主机系统是 RHEL 或其变体,默认存储驱动是 Device Mapper;对于 Ubuntu,默认驱动是 AuFS。
2. Docker 数据卷管理
数据卷管理是 Docker 应用中的重要环节,以下介绍四种常见的数据存储方式及其优缺点。
2.1 四种数据存储方式
- 将数据存储在 Docker 容器内 :这是最基本的方式,但在生产环境中管理和处理数据缺乏灵活性。
- 使用仅用于存储数据的容器 :有助于提供一定的可靠性,但依赖主机的可用性。
- 直接将数据存储在主机上 :同样能提供可靠性,但也依赖主机的可用性。
- 使用第三方卷插件(如 Flocker 或 Convoy) :将数据存储在单独的块中,解决了上述方式的问题,即使容器在主机间转移或容器死亡,数据仍具有可靠性。
3. Amazon EC2 容器服务(Amazon ECS)
3.1 Amazon ECS 架构
Amazon ECS 的核心架构由集群管理器和调度器管理器组成。
-
集群管理器
:负责集群协调和状态管理任务,其状态存储在键/值存储中,为保证健壮性和可扩展性,该存储需具备持久性、可用性,并能抵御网络分区和硬件故障。通过维护基于事务日志的数据存储来实现并发控制。同时,集群管理器开放了一组 API,用户可通过列表命令检索管理的集群、运行的任务和 EC2 实例,通过描述命令获取特定 EC2 实例及其可用资源的详细信息。
-
调度器管理器
:位于集群管理器之上,二者相互解耦,允许客户构建自己的调度器。
资源池包括由容器划分的 Amazon EC2 实例的 CPU、内存和网络资源。Amazon ECS 通过在每个 EC2 实例上运行的开源 Amazon ECS 容器代理来协调集群,根据调度器的请求启动、停止和监控容器。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(集群管理器):::process --> B(调度器管理器):::process
B --> C(ECS 容器代理):::process
C --> D(EC2 实例):::process
A --> E(键/值存储):::process
E --> F(事务日志数据存储):::process
A --> G(API):::process
G --> H(列表命令):::process
G --> I(描述命令):::process
3.2 故障排除 - AWS ECS 部署
以下是在 AWS 上设置 ECS 的基本步骤,可帮助排除基本配置错误。
1.
启动 EC2 容器服务
:从 AWS 控制台的“计算”中启动 EC2 容器服务,点击“开始使用”按钮。
2.
创建资源
:在下一步屏幕中,选择部署示例应用程序、创建和管理私有存储库。提供存储库名称,生成容器镜像需要推送的存储库地址。
3.
安装和配置 AWS CLI
:使用 pip 包管理器安装 AWS CLI。
$ pip install awscl
使用
aws configure
命令并提供 AWS 访问密钥 ID 和 AWS 秘密访问密钥进行登录。
$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]:
- 认证 Docker 客户端 :获取 Docker 登录命令,将本地 Docker 客户端认证到私有 AWS 注册表。
$ aws ecr get-login --region us-east-1
docker login -u AWS -p Key...
使用上述命令的输出链接配置 Docker 客户端,使其与部署在 AWS 中的私有存储库配合使用。
$ docker login -u AWS -p Key...
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded
- 标记并推送镜像 :标记 nginx 基本容器镜像,将其推送到私有存储库。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 19146d5729dc 6 days ago 181.6 MB
$ docker tag nginx:latest private-repo.amazonaws.com/sample:latest
$ docker push private-repo.amazonaws.com/sample:latest
The push refers to a repository [private-repo.amazonaws.com/sample]
e03d01018b72: Pushed
ee3b1534c826: Pushing [==>] 2.674 MB/58.56 MB
b6ca02dfe5e6: Pushing [>] 1.064 MB/123.1 MB
... Image successfully pushed
- 创建任务定义 :定义要运行的 Docker 镜像、分配的资源、挂载的卷、链接的 Docker 容器、启动时运行的命令、设置的环境变量、任务使用的 IAM 角色、是否为特权 Docker 容器、Docker 容器的标签、端口映射和网络以及 Docker 网络模式等。
- 声明服务 :对于持续运行的任务(如 Web 服务),声明服务可在 ECS 集群中同时运行和维护指定数量的任务定义。若任务失败,Amazon ECS 服务调度器会启动另一个实例,以维持服务中所需的任务数量。还可选择在负载均衡器后面运行所需数量的任务,Amazon ECS 支持配置弹性负载均衡,负载均衡器可配置为应用程序负载均衡器或经典负载均衡器。
- 配置集群 :配置集群,默认定义 t2.micro 为 EC2 实例类型,当前实例数量为 1。
- 部署和查看服务 :审查配置并部署 ECS 集群,创建集群后,点击“查看服务”按钮查看服务详细信息,点击 EC2 容器负载均衡器获取可公开访问的服务 URL,在负载均衡器的描述中,DNS 名称即为从互联网访问服务的 URL,访问该 URL 可看到“Welcome to nginx”页面。
3.3 更新 ECS 集群中的 Docker 容器
在持续交付模型中,通常需要更新容器和服务。可采用蓝绿部署方式,实现快速回滚。
1.
创建新的任务定义
:选择创建的 ECS 任务,点击“创建新任务定义”按钮。
2.
更新任务定义
:在新的任务定义中,可附加新容器或点击容器定义进行更新,还可使用高级容器配置设置环境变量。
3.
更新服务
:创建最新任务后,点击“操作”,然后点击“更新服务”。在更新过程中,可设置任务数量和自动缩放选项等。自动缩放组会根据所需信息启动,使用缩放策略可对集群实例和服务进行缩放,当需求减少时可安全地缩小规模。可用性区域感知的 ECS 调度器可管理、分配和缩放集群,使架构具有高可用性。
4. 微软 Azure 容器服务
4.1 微软 Azure 容器服务架构
Azure 是目前市场上发展最快的基础设施服务之一,支持按需扩展、创建混合环境和处理大数据。Azure 容器服务可部署开源容器集群和编排解决方案,通过 Azure 门户的简单 UI 和 CLI 支持,能部署基于 DC/OS(Marathon)、Kubernetes 和 Swarm 的容器集群。
微软 Azure 是首个官方支持主流容器编排引擎的公共云,其 Azure 容器服务引擎在 GitHub 上开源。Azure 资源管理器(ARM)模板是通过 ACS API 部署集群的基础,ACS 引擎用 Go 语言构建,用户可组合不同的配置片段,构建用于部署集群的最终模板。
Azure 容器引擎具有以下特性:
| 特性 | 说明 |
| — | — |
| 编排器选择 | 可选择 DC/OS、Kubernetes 或 Swarm 等编排器 |
| 多代理池 | 包含可用性集和虚拟机集 |
| Docker 集群规模 | 最大支持 1200 个节点 |
| 自定义 vNET 支持 | 支持自定义虚拟网络 |
Azure 容器服务主要以 DC/OS 为关键组件构建,其架构有三个基本组件:
-
Azure 计算
:负责管理 VM 健康。
-
Mesos
:用于容器健康管理。
-
Swarm
:用于 Docker API 管理。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Azure 容器服务):::process --> B(Azure 计算):::process
A --> C(Mesos):::process
A --> D(Swarm):::process
B --> E(VM 健康管理):::process
C --> F(容器健康管理):::process
D --> G(Docker API 管理):::process
4.2 故障排除 - 微软 Azure 容器服务
以下是在 Microsoft Azure 上部署 Docker Swarm 集群并提供编排器配置详细信息的步骤:
1.
创建 RSA 密钥
:创建 RSA 密钥,用于部署后登录到已部署的机器。
$ ssh-keygen
生成的密钥可在
~/root/id_rsa
中找到。
2.
搜索并选择服务
:在 Azure 账户门户中点击“新建”按钮,搜索“Azure 容器服务”并选择它。
3.
选择部署模型
:选择资源管理器作为部署模型,然后点击“创建”按钮。
4.
配置基本设置
:在基本设置页面,需要提供以下信息:
-
用户名
:作为 Docker Swarm 集群中部署的虚拟机的管理员。
-
SSH 公钥
:即步骤 1 中创建的 SSH 公钥。
-
资源组
:指定资源组名称来创建新的资源组。
5.
选择编排器配置
:根据需要选择编排器配置,如 Swarm、DC/OS 或 Kubernetes。
6.
提供详细配置
:提供编排器配置、代理数量、主节点数量,还可根据需要提供 DNS 前缀(如 dockerswarm)。
7.
检查并部署
:检查摘要,验证通过后点击“确定”,在下一步屏幕上点击“购买”按钮进行部署。
8.
查看部署状态
:部署开始后,可在 Azure 主仪表板上查看状态。
9.
连接到主节点
:Docker Swarm 集群创建完成后,从仪表板显示的 Docker Swarm 资源中点击“swarm - master”。在“swarm - master”的“基本信息”部分,可找到 DNS 条目。使用以下命令通过 SSH 连接到 swarm - master:
ssh <DNS_FROM_FIELD> -A -p 2200 -i <PUB_FILE_LOCATION>
连接到主节点后,即可执行基本的 Docker Swarm 命令,并在部署于 Microsoft Azure 的 Swarm 集群上进行容器部署。
综上所述,无论是 Amazon ECS 还是微软 Azure 容器服务,都为 Docker 容器的部署和管理提供了强大的支持。用户可根据自身的业务需求、技术栈和预算等因素,选择适合的云平台和相应的配置,以实现高效、稳定的容器化应用部署。同时,在实际操作过程中,要注意各平台的特性和配置要点,遇到问题时可按照上述的故障排除步骤进行解决。
超级会员免费看
1087

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



