如何为Amazon ECR配置自定义域名?
解决ECR自定义域名的可行方案
确实,ECR默认的URI又长又难记,直接套CNAME的坑我也踩过——证书不匹配、登录验证失败这些问题一个不少。给你分享几个经过验证的可行方案:
方案一:用CloudFront做反向代理(推荐,无额外服务器)
这是我日常用得最多的方案,完全基于AWS原生服务,不需要额外部署服务器:
- 第一步:申请ACM证书:一定要在
us-east-1区域申请包含你的自定义域名(比如cr.example.com)的SSL证书,因为CloudFront只认这个区域的证书。 - 第二步:创建CloudFront分配:
- 源域名填你的ECR仓库完整URI(比如
99999999999.dkr.ecr.eu-west-1.amazonaws.com),源端口选443,协议设为HTTPS only。 - 添加自定义域名:把
cr.example.com加到分配的自定义域名列表里,关联刚才申请的ACM证书。 - 关键配置:在行为设置里,强制把
Host头设置为ECR的原始URI(不能用默认的Viewer Host Header)——这是让ECR正常响应的核心;另外,缓存策略选CachingDisabled,因为Docker仓库的请求都是动态交互,不需要缓存。
- 源域名填你的ECR仓库完整URI(比如
- 第三步:配置DNS:把自定义域名的CNAME记录指向CloudFront分配的域名(比如
d123456abcdef.cloudfront.net)。 - 使用小技巧:登录的时候还是得用ECR原始域名获取凭证(执行
aws ecr get-login-password | docker login --username AWS --password-stdin 99999999999.dkr.ecr.eu-west-1.amazonaws.com),但拉取、推送镜像时直接用自定义域名就行,比如docker push cr.example.com/my-app:v1,CloudFront会自动把请求转发给ECR,同时处理好证书和Host头的问题。
方案二:ECR Public Gallery自定义域名(仅公共仓库)
如果你的镜像仓库是公开的,这个方案最省心:
- 登录AWS控制台进入ECR Public,找到你的公共仓库,在“自定义域名”选项里绑定你的域名,AWS会自动帮你配置SSL证书和DNS解析,不需要额外操作,直接就能用自定义域名访问公共镜像。不过要注意,这个功能只针对公共仓库,私有仓库用不了。
方案三:部署第三方镜像代理工具(灵活但需运维)
如果需要更复杂的功能,比如镜像缓存、自定义权限控制、多仓库聚合,可以部署Harbor、Nexus这类专业的镜像代理工具:
- 把ECR配置为代理工具的后端仓库,然后将自定义域名指向代理工具的服务器。
- 用户拉取、推送镜像时直接和代理工具交互,代理工具负责和ECR通信处理凭证、证书等问题,完全屏蔽ECR的原始域名。
- 缺点是需要自己部署和维护服务器,增加了运维成本,但适合有复杂需求的团队。
为什么直接CNAME行不通?
直接给ECR URI加CNAME的核心问题有两个:
- ECR的SSL证书是绑定自身域名的,自定义域名访问时会出现证书不匹配的错误,Docker客户端会直接拒绝连接。
aws ecr get-login-password生成的凭证是针对ECR原始域名的,当你用自定义域名登录时,Docker会把凭证发送给自定义域名对应的服务器,而ECR只接受针对自身域名的凭证验证,所以必然会失败。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

