0Pricing
AWS Solutions Architect · 课时

ECR:存储和拉取容器镜像

将 Docker 镜像推送到 Amazon ECR,应用生命周期策略清理旧镜像,并将镜像安全地拉取到 ECS 任务中

ECR:存储和拉取容器镜像 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

什么是 Amazon ECR?

Amazon Elastic Container Registry(ECR) 是一个完全托管且兼容 Docker 的容器镜像注册表。它可以在 AWS 中安全地存储、管理和部署容器镜像。ECR 无需您自行运行注册表基础设施,并且可原生集成 ECS、EKS、Lambda(容器镜像)和 CodeBuild。存储在 ECR 中的镜像会进行复制以实现高可用性,并且可以自动扫描安全漏洞。

私有与公共 ECR 存储库

ECR 支持两种存储库类型:Amazon ECR 中的私有存储库需要 AWS 身份验证才能拉取镜像,适合专有应用镜像。访问权限由 IAM 策略和存储库资源策略控制。公共存储库位于 ECR Public Gallery(public.ecr.aws)中,允许从互联网的任何位置未经身份验证地拉取镜像,适合开源基础镜像、公共工具和 AWS 提供的镜像(Lambda 基础镜像、ECS 优化的 AMI 镜像)。公共存储库提供免费的拉取额度,但未经身份验证的请求会受到速率限制。

# Create a private ECR repository
aws ecr create-repository \
  --repository-name 'myapp/backend' \
  --image-scanning-configuration scanOnPush=true \
  --image-tag-mutability IMMUTABLE

向 ECR 验证 Docker 身份

要推送或拉取私有 ECR 镜像,Docker 必须使用 AWS 凭证进行身份验证。使用 aws ecr get-login-password 获取临时身份验证令牌,并将其通过管道传递给 docker login。该令牌的有效期为 12 小时。在持续集成/持续交付流水线中,请在每次推送前刷新令牌。ECS 任务代理、Lambda 和 EKS 工作节点会自动使用其 IAM 角色向 ECR 验证身份,因此在 AWS 环境中运行时拉取镜像无需手动登录。

# Authenticate Docker CLI to ECR
aws ecr get-login-password --region us-east-1 | \
  docker login \
    --username AWS \
    --password-stdin \
    123456789012.dkr.ecr.us-east-1.amazonaws.com

将镜像推送到 ECR

将镜像推送到 ECR 的标准流程如下:(1) 在本地 Build Docker 镜像;(2) 使用 ECR 存储库 URI 为镜像添加标签(格式:account.dkr.ecr.region.amazonaws.com/repo-name:tag);(3) 推送已添加标签的镜像。ECR 会分别存储每个镜像层,并在多个镜像之间对公共层进行去重,从而降低存储成本。使用不可变标签可以防止覆盖标签,确保已部署的镜像版本稳定且可审计。

# Build, tag, and push
docker build -t myapp/backend .
docker tag myapp/backend \
  123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp/backend:v1.2.3
docker push \
  123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp/backend:v1.2.3

镜像标签可变性

IMMUTABLE 标签可以防止被其他镜像覆盖。当标签可变性设置为 IMMUTABLE 时,将新镜像推送到已有标签会失败,您必须使用新标签。这是生产环境中的最佳实践:它确保 :v1.2.3 始终指向完全相同的镜像摘要,从而支持可靠回滚和审计。仅在开发分支或非生产环境中使用 MUTABLE 标签以及 :latest 这一便捷标签。

扫描镜像中的漏洞

启用推送时扫描后,镜像推送时会自动扫描其中已知的 CVE。ECR 使用 Amazon Inspector 集成(增强型扫描),或使用由开源 Clair 扫描器提供支持的内置基本扫描。增强型扫描提供持续扫描(而不仅是在推送时扫描),并涵盖 OS 软件包和特定语言的软件包(Node.js、Python、Java)。您可以在 ECR 控制台中查看扫描结果,或通过 EventBridge 通知安全团队。

# Enable enhanced scanning for a registry
aws ecr put-registry-scanning-configuration \
  --scan-type ENHANCED \
  --rules '[{"repositoryFilters": [{"filter": "*", "filterType": "WILDCARD"}], "scanFrequency": "CONTINUOUS_SCAN"}]'

使用生命周期策略管理镜像成本

ECR 按每 GB 每月收取存储费用。如果不进行管理,旧镜像会无限累积,导致成本增加。生命周期策略 会根据规则自动使镜像过期并将其删除,例如,仅保留最近 10 个带标签的版本,或删除超过 7 天的无标签镜像。生命周期策略每天运行一次。这对于持续集成/持续交付流水线尤其重要,因为流水线每次提交都会推送新镜像,可能每周累积数百个镜像。

aws ecr put-lifecycle-policy \
  --repository-name 'myapp/backend' \
  --lifecycle-policy-text '{
    "rules": [
      {
        "rulePriority": 1,
        "description": "Keep last 10 tagged images",
        "selection": {"tagStatus": "tagged", "tagPrefixList": ["v"], "countType": "imageCountMoreThan", "countNumber": 10},
        "action": {"type": "expire"}
      },
      {
        "rulePriority": 2,
        "description": "Delete untagged images after 7 days",
        "selection": {"tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 7},
        "action": {"type": "expire"}
      }
    ]
  }'

跨账户访问镜像

要将账户 A 中 ECR 存储库的镜像拉取到账户 B 中的 ECS/EKS/Lambda,需要在账户 A 的 ECR 存储库上配置存储库策略(基于资源的策略),授予账户 B 中 IAM 主体调用 ecr:GetDownloadUrlForLayer、ecr:BatchGetImage 和 ecr:BatchCheckLayerAvailability 的权限。这样无需在账户之间复制镜像,即可实现集中式镜像管理和分布式使用。

用于多区域部署的 ECR 复制

ECR 复制 会自动将镜像从主注册表复制到其他 AWS 区域的注册表(也可以选择复制到其他账户)。当其他区域中的 ECS 任务拉取镜像时,会从本地区域注册表拉取,从而降低数据传输成本和镜像拉取延迟。您可以在注册表级别配置复制规则,指定要复制的存储库以及目标区域和账户。复制是异步的,且接近实时。

aws ecr put-replication-configuration \
  --replication-configuration '{
    "rules": [{
      "destinations": [
        {"region": "eu-west-1", "registryId": "123456789012"},
        {"region": "ap-southeast-1", "registryId": "123456789012"}
      ],
      "repositoryFilters": [{"filter": "prod/*", "filterType": "PREFIX_MATCH"}]
    }]
  }'

ECR 加密

ECR 使用服务器端加密来加密静态存储的镜像。默认情况下,它使用 AWS 托管密钥(AWS_MANAGED_KEY)。若要获得更多控制权和可审计性,请配置客户托管的 KMS 密钥(CMK)。使用 CMK 时,您可以控制密钥轮换、通过禁用密钥来撤销访问权限,并在 CloudTrail 中审计所有解密操作。当法规合规要求使用客户控制的加密密钥时(PCI-DSS、HIPAA、FedRAMP),请启用 KMS 加密。

在持续集成/持续交付流水线中将 ECR 与 ECS 结合使用

使用 ECR 和 ECS 的完整持续集成/持续交付流水线如下:(1) 开发人员将代码推送到 Git;(2) CodeBuild 构建 Docker 镜像,并使用提交 SHA 标签将其推送到 ECR;(3) CodePipeline 使用新的镜像 URI 更新 ECS 任务定义;(4) ECS 对服务执行滚动更新,从 ECR 拉取新镜像。ECS 任务使用任务执行角色自动向 ECR 验证身份,因此流水线无需管理运行时拉取镜像所需的凭证。

快速检查

测试您对本课 AWS Solutions Architect(SAA-C03)概念的理解。

课程回顾

本课介绍了:ECR 私有存储库可以存储容器镜像,并通过 IAM 控制访问,使用不可变标签确保生产环境稳定,还能通过 Inspector 自动扫描漏洞;生命周期策略会自动使旧镜像和无标签镜像过期,从而控制活跃持续集成/持续交付环境中的存储成本;ECR 复制会将镜像复制到其他区域和账户,以便在多区域部署中降低拉取延迟。接下来,我们将学习 ECS 服务自动扩展和负载均衡集成。

常见问题解答

「ECR:存储和拉取容器镜像」课时是免费的吗?

是的 — 「ECR:存储和拉取容器镜像」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「ECR:存储和拉取容器镜像」这节课中我会学到什么?

将 Docker 镜像推送到 Amazon ECR,应用生命周期策略清理旧镜像,并将镜像安全地拉取到 ECS 任务中 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「ECR:存储和拉取容器镜像」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. ECS 集群、任务定义与服务
  2. EC2 启动类型与 Fargate
  3. ECR:存储和拉取容器镜像
  4. ECS 服务自动扩展与负载均衡
← 返回 AWS Solutions Architect