Docker 镜像推送到阿里云容器镜像服务(ACR)保姆级教程:从建仓库到 push 实战避坑
本地构建好的镜像只躺在自己机器上,换台服务器、交给同事、上云部署全用不了。把镜像推到阿里云容器镜像服务(ACR)自建仓库,是一种免费、稳定、国内拉取速度快的托管方案。
本文手把手带你走完「创建仓库 → 登录 → 打 tag → 推送 → 验证」全流程,并列出最容易踩的 5 个坑。全程基于 CentOS 7 + Docker 20.10 实测,照着做即可成功。
适用读者:已在本机装好 Docker(能正常
docker build/docker images)、想把一个镜像托管到云端的同学。
一、前置准备
- 一个阿里云账号(实名认证后即可使用容器镜像服务个人版,个人版免费)
- 本机已安装 Docker 并能正常运行
- 一个本地已有的镜像(本文以
my-app:1.0.0为例;没有的话随便docker pull nginx:alpine拉一个练手也行)
二、在阿里云创建镜像仓库
2.1 进入容器镜像服务
登录阿里云控制台,搜索「容器镜像服务」或直接访问:
https://cr.console.aliyun.com首次使用会提示「开通服务」,点开通即可(个人版免费,不需要付费)。
2.2 创建命名空间
镜像仓库必须挂在某个命名空间下(相当于一个分组,建议用项目名或公司名)。
- 左侧菜单「命名空间」→「创建命名空间」
- 填写名称(如
my-company),确认创建
命名空间名称全局唯一,已被占用就换一个。
2.3 创建镜像仓库
- 左侧菜单「镜像仓库」→「创建镜像仓库」
- 填写:
- 仓库名称:如
my-app(建议和镜像名一致) - 命名空间:选刚才建的
my-company - 仓库类型:选「私有」更稳妥(公开任何人都能拉,按需选择)
- 摘要 / 描述:随便填
- 仓库名称:如
- 代码源先选「本地仓库」(即手动 push,不用绑定代码仓库)
- 点「创建」完成
创建成功后,页面会显示一个仓库地址,形如:
registry.cn-hangzhou.aliyuncs.com/my-company/my-app记住它,后面打 tag 和 push 都要用。注意地域(这里是cn-hangzhou杭州),要选离你近的地域,拉取更快。
三、登录阿里云镜像仓库
在本机终端执行登录命令:
dockerlogin--username=你的阿里云账号 registry.cn-hangzhou.aliyuncs.com--username填你的阿里云登录账号(通常是手机号或邮箱,不是昵称)- 回车后会提示输入密码:
- 个人版:密码是你在「访问凭证」页面设置的Registry 登录密码(不是阿里云账号登录密码!)
- 如果没设置过:控制台 → 左侧「访问凭证」→ 设置固定密码
登录成功会看到Login Succeeded。
建议先去「访问凭证」把 Registry 密码设成固定的,避免每次用临时密码。
四、给本地镜像打 tag
阿里云要求镜像必须按它的地址格式打 tag,否则不认。格式:
registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名:版本号假设本地镜像是my-app:1.0.0,执行:
dockertag my-app:1.0.0 registry.cn-hangzhou.aliyuncs.com/my-company/my-app:1.0.0打 tag 不会复制镜像内容,只是新建一个指向同一镜像层的引用,速度很快、不占额外空间。
可以用docker images | grep my-app确认新增了一条记录,REPOSITORY 已经是阿里云地址。
五、推送镜像
dockerpush registry.cn-hangzhou.aliyuncs.com/my-company/my-app:1.0.0终端会逐层(layer)上传,出现Pushing、Pushed、latest: digest:即成功。
首次推送会比较慢(取决于镜像大小和网络),耐心等进度条走完。
六、验证推送结果
回到阿里云控制台 → 「镜像仓库」→ 进入my-app仓库 → 「镜像版本」标签,能看到1.0.0已经在列表里了。
也可以在另一台机器上拉取验证(把镜像名换成你的):
dockerpull registry.cn-hangzhou.aliyuncs.com/my-company/my-app:1.0.0能拉下来说明推送链路完全打通。
七、常见坑(重点避坑)
坑 1:登录密码不对
报错unauthorized: authentication required或登录直接失败。
- 用的是阿里云账号登录密码→ 错,必须用「访问凭证」里的Registry 登录密码
- 去「访问凭证」重新设置固定密码再试
坑 2:tag 地址写错地域 / 命名空间
docker push报denied: requested access to the resource is denied。
- 最常见原因:tag 里的地域、命名空间或仓库名和阿里云实际不一致
- 严格照着仓库页面的「公网地址」复制,别手敲
- 区分
cn-hangzhou/cn-beijing等地域,写错一个字母就拒
坑 3:镜像名没带 tag,默认推成 latest
docker push时如果本地 tag 没写版本(只有repo:latest),云端会建一个latest版本。
建议:永远显式打版本号 tag,避免多台机器拉到不同内容
可以一个镜像同时打多个 tag 再推:
dockertag my-app:1.0.0 registry.cn-hangzhou.aliyuncs.com/my-company/my-app:1.0.0dockertag my-app:1.0.0 registry.cn-hangzhou.aliyuncs.com/my-company/my-app:latestdockerpush registry.cn-hangzhou.aliyuncs.com/my-company/my-app:1.0.0dockerpush registry.cn-hangzhou.aliyuncs.com/my-company/my-app:latest
坑 4:镜像太大,推送超时
- 构建时用
alpine基础镜像、合并RUN指令减少层数、用.dockerignore排除无关文件 - 网络不稳可重试
docker push,Docker 支持断点续传(已传的 layer 不会重传)
坑 5:私有仓库未授权就被拉取
别人拉你的私有仓库会报pull access denied。
- 要么把仓库改成「公开」
- 要么给对方账号授权:仓库「访问控制」→ 添加授权的 RAM 用户
八、配合 CI 自动化(进阶)
手动 push 适合偶尔发布。如果频繁构建,可以把这套流程写进 CI 脚本(GitLab CI / GitHub Actions):
# CI 中示例echo"$ACR_PASSWORD"|dockerlogin--username=$ACR_USERNAME--password-stdin registry.cn-hangzhou.aliyuncs.comdockerbuild-tregistry.cn-hangzhou.aliyuncs.com/my-company/my-app:$CI_COMMIT_TAG.dockerpush registry.cn-hangzhou.aliyuncs.com/my-company/my-app:$CI_COMMIT_TAG用
--password-stdin从环境变量读密码,别把密码写进脚本文件。
写在最后
把镜像推到阿里云 ACR,本质就是四步:登录 → tag → push → 验证,难点都在「密码」和「地址格式」上,按本文一步步走基本不会翻车。
觉得本文有帮助的话,别忘了点赞 👍 + 收藏 ⭐,你的支持是我持续输出的动力!