AWS 上的 Docker | AWS 白皮书摘要
一、集装箱的优势:
二、AWS 中的容器:
三、集装箱安全
四、容器应用案例
五、建筑设计考量
六、流程讲解
结论
本文是对 AWS 白皮书《AWS 上的 Docker》(作者:Brandon Chavis 和 Thomas Jones)的总结。白皮书探讨了如何在 AWS 中充分利用容器的优势。我力求简化内容,并提炼出每个段落中最关键的要点,以便为读者提供简洁高效的信息。
PS:虽然很多读者常常忽略引言部分,但我认为作者提供了非常好的引言信息,为我们的讨论奠定了基础。因此,我觉得用图示来总结引言内容很有必要。
一、集装箱的优势:
容器的优势惠及组织的各个层面,具体包括:
速度:帮助所有软件开发参与者快速行动。
原因如下:
- 容器架构利用 Linux 内核命名空间和 cgroups 实现了完全的进程隔离。容器彼此独立,共享宿主机操作系统上的内核(无需完全虚拟化或虚拟机管理程序)。
-
容器凭借其模块化和轻量级的特性,可以快速创建。这在开发生命周期中尤为明显。这种精细化的管理粒度使得已发布应用程序的版本控制更加便捷。此外,它还能减少应用程序组件之间的资源共享,从而最大限度地降低兼容性问题。
一致性:容器能够在系统间迁移整个开发环境,这是其一大亮点。
容器封装了所有依赖关系,从而最大限度地降低了错误风险,因此能够在应用程序生命周期的所有阶段(开发、测试和生产)提供可预测、一致且稳定的性能。密度和资源效率:Docker 项目的社区大力支持提高了计算资源的密度和模块化程度。
• 由于容器抽象了操作系统和硬件,因此提高了应用程序的效率和敏捷性。多个容器可以在同一系统上运行。
• 您可以根据容器所需的资源和主机硬件限制进行权衡,以达到最大容器数量:更高的密度、更高的计算资源效率、节省过剩容量的成本、调整分配给主机的容器数量(而不是横向扩展)以实现最佳利用率。灵活性:基于 Docker 的可移植性、易部署性和小体积。
• 与其他需要大量指令的应用程序不同,Docker 提供了一种(类似于 Git)简单的机制,可以使用以下命令下载和安装容器及其后续应用程序:
`$ docker pull`。
• Docker 提供标准接口:它易于部署
到任何您想要的地方,并且可以在不同的 Linux 版本之间移植。
• 容器使微服务架构成为可能,其中服务之间相互隔离,避免相邻服务的故障以及错误的补丁或升级。
• Docker 提供干净、可复现且模块化的环境。
二、AWS 中的容器:
在 AWS 中部署容器有两种方法:
AWS Elastic Beanstalk:它是 AWS 服务(如 Amazon EC2、Amazon RDS 和 ELB)的管理层。
• 它用于部署、管理和扩展容器化应用程序
。• 它可以将容器化应用程序部署到 Amazon ECS。
• 指定需求(内存、CPU、端口等)后,它会将容器放置在集群中并监控其运行状况。
• 命令行实用程序 eb 可用于管理 AWS Elastic Beanstalk 和 Docker 容器。
• 它用于在
Amazon EC2 容器服务中部署有限数量的容器。
• Amazon ECS 是 AWS 上用于 Docker 容器的高性能管理系统。
• 它有助于在托管的 EC2 实例集群上启动、管理和运行分布式应用程序,并编排数千个 Linux 容器,而无需构建自己的集群管理后端。
• 它提供多种容器调度管理方式,支持各种应用程序。
• Amazon ECS 容器代理是开源且免费的,可以集成到任何 AMI 中以与 Amazon ECS 配合使用
。• 在集群中,需要任务定义来定义每个 Docker 镜像(名称、位置、分配的资源等)。
• Amazon ECS 中的最小工作单元是“任务”,即任务定义的运行实例。
关于此背景下的聚类:
• 集群是运行 ECS 容器代理的 EC2 实例,该代理将实例和容器状态信息传递给集群管理器和 dockerd。
• 实例注册到默认集群或指定的集群。
• 集群包含一个自动扩展组,以满足容器工作负载的需求。
• Amazon ECS 允许以编程方式管理大型实例和容器集群。
支持容器的 AMI: Amazon ECS 优化的 Amazon Linux AMI 包含 Amazon ECS 容器代理(在 Docker 容器内运行)、dockerd(Docker 守护程序),并删除不需要的软件包。
容器管理:
Amazon ECS 通过简洁而详尽的 API,提供对容器、集群和应用程序的最佳控制和可视性。您只需调用相关操作即可执行管理任务。
以下列出了 Amazon ECS 可用 API 操作的示例。
日程安排
• 调度机制确保始终有适量的任务在运行,任务注册到一个或多个负载均衡器,并在任务失败时重新调度。
• Amazon ECS API 操作(例如 StartTask)可以根据特定参数做出合适的任务放置决策(StartTask 的决策基于业务和应用程序需求)。
• Amazon ECS 支持与自定义或第三方调度程序集成。
• Amazon ECS 内置了两个调度程序:
- RunTask:将任务随机分配到集群中。
- CreateService:非常适合长时间运行的无状态服务。
容器仓库
• Amazon ECS 与存储库无关,因此客户可以使用他们选择的任何存储库。
• Amazon ECS 可以与在 AWS 或本地数据中心运行的私有 Docker 存储库集成。
日志记录和监控
Amazon ECS 支持使用 Amazon CloudWatch 监控集群内容。
贮存
• Amazon ECS 允许使用数据卷在多个容器之间存储和共享信息。它们可以在主机上共享为:
•• 用于容器的空的非持久性临时空间
或者
•• 将一个容器中的卷导出,以便其他容器将其挂载到名为 containerPaths 的挂载点上。
• ECS 任务定义可以将主机上的存储位置(实例存储或 EBS 卷)作为数据卷引用。可选参数 sourcePath 用于引用底层主机上的目录。如果未提供此参数,则数据卷将被视为临时空间。
• volumesFrom 参数:定义两个容器之间的存储关系。它需要 sourceContainer 参数来指定要挂载哪个容器的数据卷。
联网
• Amazon ECS 提供网络功能(端口映射、容器链接、安全组、IP 地址和资源、网络接口等)。
三、集装箱安全
• AWS 客户将软件功能(Docker、SElinux、iptables 等)与 AWS 架构中为 EC2 提供的 AWS 安全措施(IAM、安全组、NACL、VPC)相结合,并通过集群进行扩展。
• AWS 客户通过 AWS 部署和管理服务维护、控制和配置 EC2 实例、操作系统和 Docker 守护程序。
• 安全措施通过集群进行扩展。
四、容器应用案例
1.批量作业
打包容器可以批量处理、提取、转换和加载作业,并将其部署到集群中。作业随后可以快速启动,从而显著提升性能。
2.分布式应用程序
容器构建:
分布式应用程序采用松耦合、弹性可扩展的设计。它们具有高密度、一致性和灵活性等特点,因此可以快速部署到异构服务器上。
• 将微服务封装成合适的封装单元。
• 可在大量容器上运行的批处理作业进程。
3.持续集成和部署
容器是持续集成 (CI) 和持续部署 (CD) 工作流程的关键组件。它支持从同一容器镜像简化构建、测试和部署。因为它利用了 GitHub、Jenkins 和 DockerHub 等工具中的 CI 功能。
4.平台即服务
PaaS 是一种服务模型,它提供了一套软件、工具和底层基础设施,其中云提供商管理网络、存储、操作系统、中间件,而客户执行资源配置。
问题在于:用户及其资源需要隔离。这对PaaS提供商来说是一项具有挑战性的任务。
解决方案:容器提供了所需的隔离机制。它们还允许创建和部署模板资源,从而简化隔离过程。
此外,PaaS 提供商提供的每个产品都可以构建到自己的容器中,并按需快速部署。
五、建筑设计考量
任务中定义的所有容器都会被放置在集群中的单个实例上。因此,一个任务代表一个具有多层架构且需要容器间通信的应用程序。
任务允许用户为容器分配资源,从而可以根据资源需求评估容器并进行协同部署。Amazon
ECS 提供了三种用于将容器放置到主机上的 API 操作:
RunTask:允许在 API 调用中传递特定的集群实例作为值;
StartTask:使用 Amazon ECS 调度器逻辑将任务放置到空闲主机上
;CreateService:允许创建 Service 对象,该对象由 TaskDefinition 对象和现有的 Elastic Load Balancing 负载组合而成。
服务发现:解决了向集群内不同主机上运行的其他容器通告内部容器状态(例如当前 IP 地址和应用程序状态)的难题。Amazon ECS describe API 操作(例如 describe-service)可以作为服务发现功能的基本实现。
六、流程讲解
由于本教程中使用的命令可以应用于其他复杂项目,我建议使用一个 bash 文件来帮助解决重复且棘手的实际问题:
查看链接
create-cluster1. 使用命令创建名为“Walkthrough”的第一个集群。
注意:每个 AWS 账户最多只能创建两个集群。2
. 添加实例。
如果您希望控制实例注册到哪个集群(而不是默认集群),则需要输入 UserData 以将集群名称填充到/etc/ecs/ecs.config文件中。
在本实验中,我们将启动一个 Web 服务器,因此我们需要配置正确的安全组权限,并允许从任何位置通过 80 端口进行入站访问。
3. 使用以下命令快速检查list-container-instances:
PS:要深入了解实例,请使用以下describe-container-instances命令
4.在ECS集群上运行任务前,请先注册任务定义:
a) 创建任务定义:
在名为“nginx_task.json”的 JSON 文件中创建任务定义。该任务会从 Docker Hub 仓库启动一个预配置的 NGINX 容器。
查看:链接
b)向 Amazon ECS 注册任务定义:
5. 使用以下命令运行任务run-task:
PS:
• 请注意上一步任务注册后返回的 taskDefinition 实例值(Walkthrough:1)。
• 要获取 ARN,请使用以下aws ecs list-task-definitions命令。
6.测试容器:容器端口映射到实例端口 80,因此您可以使用 curl 工具测试公共 IP 地址。
结论
这份白皮书摘要对于对云原生技术感兴趣的人士来说是一份有用的资源。它概述了容器技术,并重点介绍了 AWS 上的 Docker。它详细阐述了这些技术的优势,尤其是在使用 EC2 集群时。此外,它还为初学者提供了在集群上部署第一个容器的分步指南,并提供了一个 Bash 脚本,用于在更复杂的项目中自动化这些任务。
文章来源:https://dev.to/awsmenacommunity/docker-on-aws-nji