公司动态
Docker 镜像推送到阿里云容器镜像服务(ACR)保姆级教程:从建仓库到 push 实战避坑
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 登录密码去「访问凭证」重新设置固定密码再试坑 2tag 地址写错地域 / 命名空间docker push报denied: requested access to the resource is denied。最常见原因tag 里的地域、命名空间或仓库名和阿里云实际不一致严格照着仓库页面的「公网地址」复制别手敲区分cn-hangzhou/cn-beijing等地域写错一个字母就拒坑 3镜像名没带 tag默认推成 latestdocker 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 pushDocker 支持断点续传已传的 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 → 验证难点都在「密码」和「地址格式」上按本文一步步走基本不会翻车。觉得本文有帮助的话别忘了点赞 收藏 ⭐你的支持是我持续输出的动力