在AWS ECS上运行Docker容器将Docker镜像上传到ECR
本文是在AWS ECS上运行Docker容器的3部分教程的第2部分。 ECS代表弹性容器服务。它是可以运行docker容器的托管容器服务。尽管AWS还使用Kubernetes(EKS)提供了容器管理,但它也具有其专有解决方案(ECS)。
我们将使用一个简单的hello world图像。我们将从docker提取镜像并将其推送到我们的容器注册表(ECR)。
设置要求/准备工作
在继续阅读本教程之前,用户/阅读器应确保满足以下要求。其中包括:一个AWS账户。在该账户上创建了一个用户,该用户具有配置账户资源的权限;一个S3存储桶来存储我们的CodeBuild工件;一个CloudWatch日志组或者S3存储桶来存储构建项目日志。
创建AWS ECR(弹性容器注册表)
弹性容器注册表(ECR)是一个AWS托管的容器注册表,用于存储Docker镜像。我们将使用下面的CloudFormation模板创建注册表。
AWSTemplateFormatVersion: "2010-09-09" Description: 'Template to create an ECR repository' Parameters: ECR: Type: String Description: "The Name of your ECR registry" Resources: ECRRepository1: Type: "AWS::ECR::Repository" Properties: RepositoryName: test-ecr ImageScanningConfiguration: scanOnPush: "true" Tags: - Key: Name Value: !Ref ECR - Key: createdBy Value: Maureen Barasa - Key: Project Value: test-ecs Outputs: RegistryName: Value: !Ref ECR Description: Name of the ECR Registry
读者/用户应自定义模板以反映其特定要求。要定制的模板的特定方面是:Tags.Repository属性。
要在ECR控制台上手动创建注册表,请执行以下操作:单击创建存储库。创建存储库
然后配置存储库设置。配置存储库设置
完成后,单击创建。现在,我们将创建ECR存储库。
使用AWS CodeBuild将图像上传到AWS ECR
有了图像存储库后,就该将图像上传到存储库了。我们将使用CodeBuild从Docker集线器中提取镜像并将其推送到ECR注册表。
在CodeBuild控制台上,单击创建构建项目。
接下来,在项目和源配置中,输入项目名称和描述。另外,我们可以为构建项目添加标签。
对于来源,请选择无来源。如果docker文件位于存储库或者s3存储桶中,请选择源作为该存储库。来源选项包括:GitHubBitBucketCodeCommitGitHub EnterpriseS3存储桶
项目和源配置
然后,在该环境下,选择要执行构建项目的环境。由于我们的镜像是Linux镜像,因此我们选择了Linux环境。选择Build Environment
对于角色,选择新的服务角色。 N/B:确保该角色具有添加的AmazonEC2ContainerRegistryFullAccess策略。否则,CodeBuild将无法正常工作。
接下来,在buildspec下,选择insert build命令并粘贴以下两个模板之一:
version: 0.2 phases: install: runtime-versions: docker: 19 commands: - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" - unzip awscliv2.zip - ./aws/install pre_build: commands: - echo logging to ecr - $(aws ecr get-login --no-include-email --region eu-central-1) build: commands: - docker pull hello-world - docker tag hello-world:latest 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest post_build: commands: - echo build completed on 'date' - echo pushing to repo - docker push 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest - echo Writing definitions file... - printf '[{"name":"Hello_World","imageUri":"%s"}]' 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest > HelloWorldtaskdefinition.json artifacts: files: HelloWorldtaskdefinition.json
万一我们想从docker文件构建镜像,并且我们有代码提交代码。使用以下buildspec。
version: 0.2 phases: install: runtime-versions: docker: 19 commands: - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" - unzip awscliv2.zip - ./aws/install pre_build: commands: - echo logging to ecr - $(aws ecr get-login --no-include-email --region eu-central-1) build: commands: - echo starting build on 'date' - cd ./ - docker build -t hello-world . - docker tag hello-world:latest 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest post_build: commands: - echo build completed on 'date' - echo pushing to repo - docker push 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest - echo Writing definitions file... - printf '[{"name":"Hello_World","imageUri":"%s"}]' 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest > HelloWorldtaskdefinition.json artifacts: files: HelloWorldtaskdefinition.json
然后,在构件下,根据需求列表选择之前创建的s3存储桶。
建立文物
最后,在Logs下,我们可以在CloudWatch Log Group或者S3存储桶之间进行选择。
完成后,单击创建构建项目。创建项目后,我们现在可以单击开始构建。
随着构建项目的运行,我们可以在"构建日志"和"阶段"详细信息下检查进度。请