当你利用 CloudFormation 在 YAML 模板中定义你的基础设施时,将 Docker 容器部署到 AWS弹性容器服务(ECS)是直接和自动化的。在这里,我们将通过一个简单的例子,我们将设置在 AWS 中运行一个 NGINX 容器并通过互联网访问它所需的一切。

AWS ECS 概述

我们选择运行 NGINX 官方的 Docker 镜像,因为它将允许我们浏览到 80 端口并查看响应,以证明容器正在运行。为了让这个部署到 ECS 中,我们需要以下构件。

  • ECS 任务定义: 你的容器的规范,包括使用什么 Docker 镜像,暴露什么端口,以及分配什么硬件资源
  • ECS 任务: ECS 任务定义的一个运行实例。相当于一个正在运行的 Docker 容器
  • ECS 服务: 负责运行任务定义的实例,包括部署的数量、网络和安全
  • ECS 群组: ECS 服务和任务的分组
  • ECS 任务执行角色: 任务将承担的 IAM 角色,在我们的案例中,允许将日志事件写入CloudWatch
  • 安全组: 可以将安全组附加到 ECS 服务上,我们将用它来定义允许进入 80 端口的容器的规则。我们将用它来定义允许在 80 端口进入容器的规则
  • ECS 任务执行角色: 任务将承担的 IAM 角色,在我们的案例中,允许将日志事件写入CloudWatch

AWS ECS 发射类型

ECS 任务可以根据您的要求,以 2 种模式运行。

  1. EC2:您负责为您的任务运行的 EC2 实例进行配置。
  2. Fargate:AWS 会提供硬件,让你的任务在上面运行。你需要做的就是指定内存和CPU 需求。请注意,Fargate 目前只支持非持久性存储卷。

在这个例子中,我们将使用 Fargate 发射类型,因为它是最快速的入门方式。✔

先决条件

为了使这个例子尽可能的简单,我们将假设你已经有了下面的设置。

  • 设置了 AWS CLI 访问权限的 AWS 账户。
  • 一个默认的 VPC(AWS 在您创建 AWS 帐户时默认创建这个)

使用 CloudForm 构建 ECS

我们将使用 YAML 风味的 CloudFormation,并逐个建立一个堆栈,直到我们有一个 NGINX容器运行,我们可以通过互联网访问。
我推荐 IntelliJ IDEA 来编辑 CloudFormation 模板,因为它有一个插件,可以提供语法验证。

创建 ECS 群集、日志组、执行角色和安全组

首先创建一个文件 ecs.yml,并添加以下定义。

AWSTemplateFormatVersion: "2010-09-09"
Parameters:SubnetID:Type: String
Resources:Cluster:Type: AWS::ECS::ClusterProperties:ClusterName: deployment-example-clusterLogGroup:Type: AWS::Logs::LogGroupProperties:LogGroupName: deployment-example-log-groupExecutionRole:Type: AWS::IAM::RoleProperties:RoleName: deployment-example-roleAssumeRolePolicyDocument:Statement:- Effect: AllowPrincipal:Service: ecs-tasks.amazonaws.comAction: sts:AssumeRoleManagedPolicyArns:- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicyContainerSecurityGroup:Type: AWS::EC2::SecurityGroupProperties:GroupName: ContainerSecurityGroupGroupDescription: Security group for NGINX containerSecurityGroupIngress:- IpProtocol: tcpFromPort: 80ToPort: 80CidrIp: 0.0.0.0/0

参数

我们的模板只需要一个参数,SubnetID,来指定将 ECS 任务部署到哪个子网。在正常的生产设置中,你会希望部署到多个子网的可用性区,以实现高可用性。

集群

AWS::ECS::Cluster资源除了名称外,不需要其他配置。

日志组

ECS 任务将把应用日志记录到这个日志组。

执行作用

这是 ECS 任务在执行过程中要承担的角色。因此,它需要所提供的承担角色策略文档,允许ECS 任务承担这个角色。
它还附加了 AmazonECSTaskExecutionRolePolicy,其中包含了 logs:CreateLogStreamlogs:PutLogEvents 等动作。

安全组

安全组定义了哪些网络流量将被允许访问 ECS 任务。在我们的例子中,我们只需要访问 80 端口,即默认的 NGINX 端口。
让我们使用以下 AWS CLI 命令应用此模板,创建一个 CloudFormation 堆栈来供应上述资源。记住要用自己的子网来代替 <subnet-id>

$ aws cloudformation create-stack --stack-name example-deployment --template-body file://./ecs.yml --capabilities CAPABILITY_NAMED_IAM --parameters 'ParameterKey=SubnetID,ParameterValue=<subnet-id>'

最终,如果您在 AWS 控制台中导航到 CloudFormation > Stacks > example-deployment > Resources,您会看到以下资源已经创建。

创建任务定义和服务

将以下定义添加到 ecs.yml CloudFormation 模板的末尾。

//previous template code  TaskDefinition:Type: AWS::ECS::TaskDefinitionProperties:Family: deployment-example-taskCpu: 256Memory: 512NetworkMode: awsvpcExecutionRoleArn: !Ref ExecutionRoleContainerDefinitions:- Name: deployment-example-containerImage: nginx:1.17.7PortMappings:- ContainerPort: 80LogConfiguration:LogDriver: awslogsOptions:awslogs-region: !Ref AWS::Regionawslogs-group: !Ref LogGroupawslogs-stream-prefix: ecsRequiresCompatibilities:- EC2- FARGATEService:Type: AWS::ECS::ServiceProperties:ServiceName: deployment-example-serviceCluster: !Ref ClusterTaskDefinition: !Ref TaskDefinitionDesiredCount: 1LaunchType: FARGATENetworkConfiguration:AwsvpcConfiguration:AssignPublicIp: ENABLEDSubnets:- !Ref SubnetIDSecurityGroups:- !GetAtt ContainerSecurityGroup.GroupId

任务定义

我们正在定义一个 AWS::ECS::TaskDefinition,其重要属性如下。

  • _族_是一种将同一任务定义的不同版本进行分组的方式。
  • 我们指定了多少硬件资源用于这个任务。
  • 我们使用的是网络模式 awsvpc,这是 Fargate 启动类型所需要的。这个网络模式意味着我们的任务将拥有和 EC2 实例一样的网络能力,比如它自己的 IP 地址。
  • 我们之前定义的 执行角色
  • 容器定义,指定映像、容器端口和日志配置,以告诉它使用 awslogs 日志驱动程序进行日志记录(即到 CloudWatch)。
  • 我们指定该任务定义与 EC2 和 Fargate 发射类型兼容(尽管我们将使用 Fargate)。

服务项目

我们正在定义一个AWS::ECS::服务,其属性如下。

  • 该服务将部署任务的 ECS集群
  • 要部署的 任务定义
  • 要运行的实例数量。对于这个简单的例子,我们将运行 1 个,但对于高可用性,你会希望至少运行 2 个。
  • 的_发射类型_,这样我们就不用担心硬件的配置问题了。
  • 网络配置,其中指定了我们想要的公共 IP 地址、服务要使用的子网以及要应用的安全组。

现在让我们用 update-stack 命令更新 CloudFormation 栈。

$ aws cloudformation update-stack --stack-name example-deployment --template-body file://./ecs.yml --capabilities CAPABILITY_NAMED_IAM --parameters 'ParameterKey=SubnetID,ParameterValue=<subnet-id>'

稍等片刻,然后您可以看到我们的 CloudFormation 堆栈中又创建了一些资源。

掌握我们的ecs资源

前往 ECS > 服务,我们来看看有什么创造。
你会看到 deployment-example-cluster,它重要有 1 个服务和 1 个正在运行的任务。
单击群集,然后单击_“任务”_选项卡。

这里可以看到我们使用的是我们在 CloudFormation 中定义的任务定义,任务状态为运行,启动类型为 Fargate。
点击任务 id 查看更多详情。这里是详情页的网络部分。

你可以看到这里我们已经得到了任务的公共 IP 地址。去试试在浏览器中打这个 IP。

看来我们得到了一个 NGINX!

写在最后

要清理的话,只需运行 delete-stack 命令即可。

$ aws cloudformation delete-stack --stack-name example-deployment

希望你已经看到,在 ECS 中运行 Docker 容器是很直接的,而且 AWS 提供了大量的配置选项,可以让事情完全按照你的意愿工作。
使用 CloudFormation,可以直接进行增量更改,是管理 ECS 集群的好选择。

使用CloudFormation将Docker容器自动部署到AWS相关推荐

  1. 悟空CRM11.0 PHP版本docker容器化部署全流程

    由于本地服务器为PHP5.3,项目部署需要PHP >= 7.0.*,所以选择docker容器化部署,服务器系统为centos7.3,所有的sql文件都在项目路径 public/sql下 目录 一 ...

  2. Docker容器化部署config-server无法直接访问

    Docker容器化部署config-server无法直接访问 1. 本机ip启动方式: 2. Docker容器启动 1)问题 2)解决办法 - 本机启动 - 服务器启动俩种方式 3. dockerfi ...

  3. ML与Docker:《Deploy Machine Learning Pipeline on the cloud using Docker Container使用Docker容器在云端部署机器学习管道

    ML与Docker:<Deploy Machine Learning Pipeline on the cloud using Docker Container使用Docker容器在云端部署机器学 ...

  4. 广告业务系统 之 敏捷交付 —— “基于 Docker 容器同机部署”

    文章目录 广告业务系统 之 敏捷交付 -- "基于 Docker 容器同机部署" 服务 Docker 构建及部署 代码支持 服务打包&构建 服务部署 广告业务系统 之 敏捷 ...

  5. Openstack技术\在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server

    MySQL部署 在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server. 操作步骤: 搜索mysql镜像 拉取mysql镜像 创建容器 操作容器中的mysql 容器 ...

  6. Docker容器内部署Java微服务的内存限制问题

    1. 前言 文末有福利 前两天有同事发现,通过华为云 ServiceStage 的流水线部署基于模板创建的 CSEJavaSDK demo 服务时,会在容器启动过程中报错.初步排查是由于 JVM 占用 ...

  7. ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

    一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...

  8. Docker容器化部署python

    1. 简介 Docker是目前主流IT公司广泛接受和使用的,用于构建.管理和保护它们应用程序的工具. 容器,例如Docker允许开发人员在单个操作系统上隔离和运行多个应用程序,而不是为服务器上的每个应 ...

  9. 查看docker内部路径_web应用在Docker容器中部署(Windows)

    前言 容器化是软件开发的一种方法,通过该方法可将应用程序或服务.其依赖项及其配置(抽象化为部署清单文件)一起打包为容器映像. 容器化应用程序可以作为一个单元进行测试,并可以作为容器映像实例部署到主机操 ...

最新文章

  1. Java项目:(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
  2. 电脑版java运行条件,Java Runtime Environment电脑版-Java Runtime Environment(Java运行环境)8.0.221 x64正式版-蜻蜓手游网...
  3. 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
  4. Linux编程 3 (初识bash shell与man查看手册)
  5. 批量生成 Gitee 仓库克隆命令的方法
  6. js中注册标识符流程
  7. html盒子自动居中,css盒子怎么居中?
  8. 关于自我学习停滞的思考
  9. java 盘符 系统_JAVA小白预备内容
  10. python官方下载电脑版-Python for windows
  11. 大数据分析的目的与意义
  12. ppt使用记录之添加带圈的20以内的数字编号
  13. Java-JVM第一篇认识JVM
  14. 标准的Java编码规范手册
  15. 电脑开机主板报警1长2短是怎么回事?
  16. 如何查html病毒svchost.exe,解决html文件的DropFileName = svchost.exe木马
  17. OSChina 周三乱弹 —— 有种思念叫忘穿秋裤
  18. 电脑重装系统引导方式不是BIOS 不能引导MBR磁盘怎么办
  19. discuz!Q免登陆蓝天采集器api发布模块
  20. Eclipse 汉化教程完美版

热门文章

  1. 博客系统视频_视频博客| 视频博客
  2. 删除windows下一些无法删除的文件夹
  3. C语言计算机二级/C语言期末考试 刷题(二)
  4. 股价从8美元到50美元,微博做对了什么
  5. 动态库编译通过,调用动态库函数运行出现undefined symbol
  6. 【Unity3d】使用摄像机制作实时显示小地图
  7. 热更新Tinker研究(九):Dex文件的patch
  8. [转载]软件测试从零开始
  9. 计算机网络的标准化工作与相关组织
  10. 套接字socket选项TCP_NODELAY、TCP_CORK与TCP_QUICKACK