学习用亚马逊ECS部署Docker容器
![]()
Docker是一种机制,可以使用工具在Linux环境中创建、构建、运行、测试和部署分布式应用。我们可以把弹性容器服务(ECS)看作是亚马逊网络服务(AWS)的一项云计算服务,它结合了容器,让开发者在云中执行应用程序,并允许他们的代码在没有配置的环境中运行。使用AWS账户,开发人员可以在API调用和其内置任务定义的帮助下,在不同的服务器上运行的可扩展性部署,称为集群。
亚马逊ECS在任务定义中使用Docker镜像来启动容器作为集群中任务的角色。
Docker Compose CLI允许开发人员使用本地Docker命令在亚马逊EC2容器服务(ECS)内按照开发云原生应用程序执行应用程序。
以下是亚马逊ECS和Docker之间的整合机制,允许开发人员使用Docker ComposeCLI来。
- 在一个Docker命令中配置AWS上下文,授权你从本地环境上下文转变为云,快速有效地执行应用程序。
- 在Compose文件的帮助下,在Amazon ECS上简化多容器应用开发。
前提条件
为了在ECS上部署docker容器,我们需要遵循以下先决条件:
- 下载并安装最拖欠的Docker Desktop版本。
- 下载Windows版
- 下载Mac版
- 安装Docker Compose CLI for Linux。
- 请确认你的AWS账户。
Docker为开发者提供了主要的好处,在使用docker-compose up命令的Compose文件的帮助下,无缝地部署docker容器。它还可以在本地运行多容器应用程序。
以下几点包括在Amazon ECS上用Compose应用程序进行部署的说明。
在ECS上运行一个应用程序
要求
AWS运营一个可接受的获得权限标准,每个资源类型和进程都有一个独特的角色。
为了确认Docker ECS集成被授权为您的Compose应用程序处理资源,我们应该有AWS凭证授予访问以下后续的AWS IAM授权。
- Application-autoscaling:
- cloudformation:
- ec2:AuthorizeSecurityGroupIngress
- ec2:CreateSecurityGroup
- ec2:CreateTags
- ec2:删除安全组
- ec2:DescribeRouteTables
- ec2:DescribeSecurityGroups
- ec2:DescribeSubnets
- ec2:DescribeVpcs
- ec2:RevokeSecurityGroupIngress
- ecs:创建群集
- ecs:CreateService
- ecs:删除群集
- ecs:删除服务
- ecs:DeregisterTaskDefinition
- ecs:DescribeClusters
- ecs:DescribeServices
- ecs:DescribeTasks
- ecs:ListAccountSettings
- ecs:ListTasks
- ecs:RegisterTaskDefinition
- ecs:更新服务
- elasticloadbalancing
- iam:AttachRolePolicy
- iam:CreateRole
- iam:DeleteRole
- iam:DetachRolePolicy
- iam:PassRole
- logs:CreateLogGroup
- logs:DeleteLogGroup
- logs:DescribeLogGroups
- logs:FilterLogEvents
- route53:CreateHostedZone
- route53:删除托管区
- route53:获取健康检查
- route53:GetHostedZone
- route53:ListHostedZonesByName
- 服务发现
GPU支持,它在EC2实例上定义了用配置的GPU设备执行容器,提供了以下权限类型:
- ec2:DescribeVpcs
- 自动缩放
- iam:CreateInstanceProfile
- iam:AddRoleToInstanceProfile
- iam:RemoveRoleFromInstanceProfile
- iam:DeleteInstanceProfile
创建AWS上下文
- 为了执行docker上下文,我们需要定义ecs myecscontext命令来建立一个Amazon ECS。
命名为myecscontext的Docker上下文。
- 如果已经有AWS CLI配置并安装完毕,设置命令将允许你选择现有的AWS配置文件来连接到亚马逊。
- 我们也可以通过给出一个AWS访问密钥ID和一个秘密访问密钥来建立最新的配置文件。
- 最终,你可以配置和设置你的ECS上下文,使用AWS_*环境变量获得AWS凭证,这是一种与第三方工具和单点登录提供商结合的标准方式。
下面是定义环境变量的屏幕截图。
![]()
创建AWS上下文后,我们可以通过执行docker context ls命令获得所有Docker上下文的列表。
运行一个组合应用程序
按照以下几点,使用docker-compose命令将Compose文件中描述的多容器应用程序部署和运行到Amazon ECS,请确认你是否使用ECS上下文:
- 我们可以通过该命令建立--context myecscontext标志。
- 我们也可以用myecscontext来指定当前的上下文操作命令docker context。
- 执行docker-compose up和docker-compose down来创建然后停止一个完整的Compose应用程序。
- Docker compos-up默认使用当前文件夹中的compose.yaml。你可以用-workdir标志定义工作目录,或者用docker-compose --file与mycomposefile.yaml up即时建立Compose文件。
- 我们还可以在部署过程中使用 --project-name 标志来确定 Compose 应用程序的名称。如果没有定义名称,可以从工作目录中提取一个名称。
- Docker ECS集成将Compose应用标准转化为AWS资源的集合,定义为CloudFormation模板。
- 你可以使用docker-compose转换命令检查开发的模板,并在使用compos-up运行docker后,使用AWS网络控制台跟踪涉及这个模型的CloudFormation。我们可以得到显示在你终端的CloudFormation事件。
- 我们可以考虑在Amazon ECS上为Compose应用开发的服务,用docker-compose ps命令查看状态。
- 我们可以用docker-compose log命令从作为Compose应用元素的容器中获取日志。
滚动更新
- 我们可以使用docker-compose在改变后的Compose项目上,毫无障碍地更新生产环境中的特定应用程序。
- 在使用更新的Compose文件运行docker-compose命令后,ECS服务可以生成滚动更新配置。堆栈将被编辑以反映修改,如果对某些服务有某种要求,我们可以替换它。
- 这种替换技术遵循你的服务deploy.update_config配置所设定的滚动更新格式。
- AWS ECS操作一个基于百分比的模型来决定在滚动更新期间执行或关闭的容器数量。
- Docker Compose CLI按照平等和复制字段来计算滚动更新的构成。
- 我们还可以根据具体要求,用扩展字段x-aws-min_percent和x-aws-max_percent即时配置滚动更新。
- 前者指定了处理服务的最小百分比的容器,并指定了在以前的版本发布前初始化不同容器的最高百分比。
- 它有能力为一个服务执行两倍的容器数量(200%),并能在操作中关闭100%的容器。
查看应用日志
Docker Compose CLI为你的容器定义了AWS CloudWatch Logs的好处。默认情况下,开发人员可以访问和查看编译应用程序的日志,也可以检查本地部署的日志。
按照下面的例子。
#获取当前工作目录下的应用程序的日志
$docker compose logs
#指定编译项目的名称
$docker compose --project-name PROJECT logs
#指定编译文件
$docker compose --file /path/to/docker-compose.yaml logs
为应用程序建立一个日志组,作为docker-compose/<application_name>,并为应用程序中的所有服务和容器维护日志流,作为<application_name>/<service_name>/<container_ID>。
我们可以在Compose文件中的扩展字段x-aws-logs_retention的帮助下优化AWS CloudWatch Logs,以指定日志事件的保留天数。这种默认行为有助于永久地保留日志。
私人Docker镜像
Docker Compose CLI自发地设置了授权。这使我们能够轻松地从同一AWS账户上的亚马逊ECR注册表中提取私有镜像。对于从另一个注册表拉取私有映像。
- 它包含在AWS Secrets Manager服务上创建一个用户名+密码(或用户名+令牌)秘密。
- Docker Compose CLI提供了docker secret命令。据此,我们可以操作在AWS SMS上创建的秘密,而无需安装AWS CLI。
- 创建一个token.json文件来定义你的DockerHub用户名和访问令牌。
{
"username":"DockerHubUserName",
"password":"DockerHubAccessToken"
}
在这里,我们可以使用docker secret: 在文件的帮助下创建一个秘密,如下图所示。
![]()
创建秘密后,我们可以在我们的合成文件中使用x-aws-pull_credentials,在Docker镜像URI上使用自定义扩展名,如下面的语法,使用这个ARN。
services:
worker:
image: mycompany/privateimage
x-aws-pull_credentials: "arn:aws:secretsmanager:eu-west-3:12345:secret:DockerHubAccessToken"
服务发现
默认情况下,服务与服务之间的通信可以透明地执行。我们可以在本地和ECS部署之间不修改compose文件的情况下,将您的Compose应用程序与众多相互关联的服务进行部署。各个服务可以以不同的约束条件(内存、CPU)和递归规则运行。
服务名称
在应用部署期间,Docker Compose CLI会在AWS Cloud Map上即时记录服务。它们被报告为完全合适的域名形式:.<compose_project_name>.local。
服务可以通过使用docker-compose在本地部署的Compose服务名称获得它们的依赖关系。
依赖服务的启动时间和DNS解析
当特定的Compose文件部署后,服务可以同时在ECS上安排。
AWS云图指示最初等待DNS服务能够修复你的服务域名表达式。你的应用程序代码必须通过等待依赖服务的准备,或者通过添加一个等待脚本作为你的Docker镜像的访问点来支持这种不确定性。当你使用docker-compose进行本地部署时,你的Compose应用中这种对依赖服务的等待也会存在。
我们还可以利用Compose文件格式中的 depends_on 组件。在此帮助下,一个依赖服务将首先被生产出来,应用部署在启动创建依赖服务之前会等待它的启动和运行。
服务隔离
服务隔离由安全组规则执行,该规则授权传输共同的合成文件 "网络 "的服务与各自的合成服务名称同时进行通信。
调整CloudFormation模板
Docker Compose CLI依赖于Amazon CloudFormation来处理应用程序的部署。为了获得对组装资源的更多额外控制,我们可以采用docker-compose的方法,它从你的Compose文件转化为开发一个CloudFormation栈文件。这允许你审查它所代表的资源或根据要求定制模板,然后用AWS CLI或AWS网络控制台将模板用于AWS。
在指定你的CloudFormation模板所需的修改后,你可以在你的Compose文件中包含覆盖物,这将自动参与合成。
覆载是一个yaml对象,它使用与ECS集成开发的模板数据结构完全相同的CloudFormation模板,但只包括要修改或添加的属性。在参与AWS基础设施之前,它将与渲染的模板相结合。
总结
我们希望这篇文章能帮助你了解ECS Docker。在这篇文章中,我们讨论了亚马逊ECS的各种流程的概念和它们的不同类型,以及一些例子,这对来自Java和.net背景的专业开发人员、应用架构、云计算专家和其他寻找ECS Docker Hub与容器信息的学习者有帮助。