本地
docker images攒了几十个镜像,换台机器全得重新拉;团队里三个人各拉一遍,外网慢的时候一上午就没了。这篇把镜像放到云上仓库:先看清镜像名的四段结构和公开/私有的区别,再分别走华为云 SWR 与阿里云 ACR 两条完整链路------建组织(命名空间)、配镜像加速、生成登录指令、docker push、验证下载、设成公开,最后给出两家怎么选的判断依据。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | 华为云 SWR 与阿里云 ACR 从建组织、配加速器到 push、拉取与设公开的完整操作 |
| 所属类别 | 云计算 → 容器技术 → 镜像仓库 |
| 知识关键字 | SWR · ACR · docker login · docker tag · docker push · registry-mirrors · insecure-registries · daemon.json |
主线一句:镜像要离开本机,先得有个带地址的全名。第一章讲清名字与仓库类型,第二章走华为云,第三章走阿里云,第四章比两家的差异。自建仓库(registry、harbor)在姊妹篇里。
一、仓库长什么样:公开、私有与镜像名
Docker 仓库就是集中放镜像的地方,按能不能匿名访问分两类:
| 类型 | 谁能拉 | 代表 |
|---|---|---|
| 公开仓库 | 任何人,不需要登录 | Docker Hub、各家云厂商的 library 公共镜像 |
| 私有仓库 | 有账号且被授权的用户 | 华为云 SWR 私有组织、阿里云 ACR 私有仓库、自建 registry / harbor |
镜像名不是随便起的,它同时告诉 Docker「去哪台服务器、哪个命名空间、哪个镜像、哪个版本」:
swr.cn-east-3.myhuaweicloud.com / zhb / os/centos : 8
└────── 仓库地址 ──────┘ └组织┘ └─镜像名─┘ └标签┘
四段的细节前图已经拆过,这里只强调两条容易踩的:
- 不写仓库地址 = 去 Docker Hub 。
docker pull nginx拉的是docker.io/library/nginx。 - 不写标签 =
latest。docker push一个没有标签的镜像名上去,仓库里就多一个latest,下个人拉到的是不是你测过的那个版本,只有天知道。
docker tag 就是给本地镜像补上这个全名,它不改镜像内容,只是多贴一个标签:
| 参数 | 含义 | 英文原意 |
|---|---|---|
docker tag <源镜像> <新名字> |
给已有镜像再起一个带地址的名字 | tag,贴标签 |
| 源镜像可写 ID | docker tag 92bb8fa744df ... 也行 |
--- |
| 一个镜像多个标签 | 同一个 ID 可以贴任意多个名字 | --- |
二、华为云 SWR:从公共镜像到自己的组织
入口是容器镜像服务控制台 https://console.huaweicloud.com/swr/。左边三块菜单够用:镜像中心、我的镜像(组织与仓库)、镜像加速。
2.1 镜像中心:直接用官方的公共镜像

镜像中心的镜像名有固定格式:
swr.{区域代码}.myhuaweicloud.com/library/{镜像名称}:{镜像标签}
bash
# 区域选的是「华东-上海一」,所以是 cn-east-3
[root@docker ~]# docker pull swr.cn-east-3.myhuaweicloud.com/library/nginx:latest
走云厂商的地址拉公共镜像,速度通常比直连 Docker Hub 稳------它的 library 是官方镜像的同步副本。
2.2 镜像加速:让 Docker Hub 的拉取也快起来

控制台给出的五个步骤,照做即可:
- 装好 Docker 客户端(
docker version能出版本就行)。 - 复制「加速器地址」,形如
https://<一串字符>.mirror.swr.myhuaweicloud.com。 - 写进
/etc/docker/daemon.json,没有这个文件就新建。 systemctl restart docker重启引擎。docker info看Registry Mirrors字段,出现你刚填的地址就是生效了。
bash
# 编辑(没有就新建)daemon.json
[root@docker ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://<你的加速器地址>.mirror.swr.myhuaweicloud.com" ]
}
[root@docker ~]# systemctl restart docker
[root@docker ~]# docker info | grep -A 2 "Registry Mirrors"
Registry Mirrors:
https://<你的加速器地址>.mirror.swr.myhuaweicloud.com/
⚠️ 注意 :
daemon.json是严格 JSON------键和值都用双引号,最后一项后面不能有逗号。写错一个逗号,systemctl restart docker直接失败,而且报错只说「Job for docker.service failed」,得靠journalctl -u docker -n 30才看得到真正的解析错误。
重启失败还有第二个常见原因:老系统在 /etc/sysconfig/docker 或 /etc/default/docker 里也写过 registry-mirrors,两处冲突。把老文件里那一项删掉再重启。
2.3 建组织,拿到登录指令
「我的镜像」里先要有组织,才能往里推镜像------组织和镜像名里的第二段是一回事。

点「创建组织」,组织名填 zhb。建好之后,在组织详情里点「生成登录指令」,会弹出一个带有效期的临时密码:

图里的账号与密钥是临时凭证,已经隐去。它有两个要点:
- 有效期 :临时指令默认几小时就过期,过期后再
push会报unauthorized,回来重新生成一条即可。 - 账号长这样 :
cn-east-3@XXXXXXXX------区域代码@一串大写字母,不是你在华为云的登录名。
bash
[root@docker ~]# docker login -u cn-east-3@**** -p **** swr.cn-east-3.myhuaweicloud.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
docker login 的三个参数:
| 参数 | 含义 | 英文原意 |
|---|---|---|
docker login <仓库地址> |
登录某个仓库,不写地址默认 Docker Hub | login,登录 |
-u / --username |
用户名,云仓库用的是「区域@凭证」这种账号 | username,用户名 |
-p / --password |
密码或临时密钥,走命令行会留 shell 历史 | password,密码 |
--password-stdin |
从标准输入读密码,脚本里该用它 | password standard input |
带上 --password-stdin 更安全,写法是把密码 echo 进管道:
bash
[root@docker ~]# echo '你的临时密钥' | docker login -u cn-east-3@**** --password-stdin swr.cn-east-3.myhuaweicloud.com
2.4 打全名,再 push
推到哪个仓库,完全由镜像名里的地址决定。所以先 tag 成全名:
| 参数 | 含义 | 英文原意 |
|---|---|---|
docker push <镜像名> |
把本地镜像推到名字里那个仓库 | push,推送 |
-a / --all-tags |
把这个镜像的所有标签一起推 | all tags,全部标签 |
-q / --quiet |
只输出进度,不刷屏 | quiet,安静 |
bash
# 格式:swr.{区域}.myhuaweicloud.com/{组织}/{镜像}:{标签}
[root@docker ~]# docker tag centos:8 swr.cn-east-3.myhuaweicloud.com/zhb/os/centos:8
[root@docker ~]# docker push swr.cn-east-3.myhuaweicloud.com/zhb/os/centos:8
The push refers to repository [swr.cn-east-3.myhuaweicloud.com/zhb/os/centos]
a1d0c7532777: Pushed
8: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529
镜像名里可以再加一级目录做分类(示例的 os/),纯粹是给人看的层级,不影响拉取。
2.5 验证与设公开
bash
# 先删本地,再从云上拉回来,证明它真的在仓库里
[root@docker ~]# docker rmi swr.cn-east-3.myhuaweicloud.com/zhb/os/centos:8
[root@docker ~]# docker pull swr.cn-east-3.myhuaweicloud.com/zhb/os/centos:8
Status: Downloaded newer image for swr.cn-east-3.myhuaweicloud.com/zhb/os/centos:8
默认是私有,别人拿不到。要共享给同事或写进公开文档,就把它设成公开:

公开之后,任何人不需要登录就能 docker pull。注意这是单向的:一旦公开,再改回私有,别人本地已经拉走的镜像收不回来。
三、阿里云 ACR:命名空间 + 固定密码
入口是 https://cr.console.aliyun.com/cn-hangzhou/instances。个人版免费,实验够用。
3.1 实例列表

个人版只有杭州一个区域,所以后面的地址都是 registry.cn-hangzhou.aliyuncs.com。企业版可以选地域、有独立域名,实验室里用不上。
3.2 命名空间

命名空间就是镜像名里的第二段。这里建一个 zhb,默认私有。表格里「自动创建仓库」这个开关值得留着------开启后 push 一个不存在的仓库会自动建,省一步。
3.3 访问凭证与创建仓库
访问凭证在左侧菜单「仓库管理 → 访问凭证」里,设的是固定密码 ,设一次长期有效(不像华为云的临时指令会过期)。这个密码就是待会儿 docker login 要填的 -p,账号则是阿里云账号全名。
设好密码后,创建一个镜像仓库:

接下来上传三步:
bash
# 1. 登录(用户名是阿里云账号全名,密码是刚设的访问凭证)
[root@docker ~]# docker login -u zhb -p '你的访问凭证密码' registry.cn-hangzhou.aliyuncs.com
Login Succeeded
# 2. 打全名:registry.cn-hangzhou.aliyuncs.com/{命名空间}/{仓库名}:{标签}
[root@docker ~]# docker tag centos:8 registry.cn-hangzhou.aliyuncs.com/zhb/os:centos8
# 3. 推送
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/zhb/os:centos8
3.4 阿里云的镜像加速
个人版自带一个专属加速地址,前缀是你账号的一串字符:
bash
[root@docker ~]# sudo mkdir -p /etc/docker
[root@docker ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<你的专属前缀>.mirror.aliyuncs.com"]
}
EOF
[root@docker ~]# sudo systemctl daemon-reload
[root@docker ~]# sudo systemctl restart docker
tee ... <<-'EOF' 这种写法比 vi 更适合脚本:整段 JSON 一次写进去,不会漏大括号。<<- 里的 - 表示允许 heredoc 内容用 Tab 缩进。
四、两家怎么选
| 对比项 | 华为云 SWR | 阿里云 ACR |
|---|---|---|
| 命名空间叫法 | 组织 | 命名空间 |
| 登录凭证 | 临时指令,有有效期,过期需重新生成 | 固定密码,设一次长期有效 |
| 公共镜像 | 有 library 镜像中心,按区域分地址 |
有制品中心 |
| 默认私有 | 是 | 是 |
| 改成公开 | 编辑镜像属性 | 创建仓库时选公开,或后期修改 |
| 加速器 | 控制台给地址,写 daemon.json |
个人版给专属地址 |
| 适合场景 | 已经在用华为云 ECS / CCE | 已经在用阿里云 ECS / ACK |
一句话判断:跟着你的服务器走。镜像仓库离计算资源越近,拉取越快;跨云拉镜像走公网,省下的那点便利会被带宽吃掉。
两家的免费额度都只够实验,镜像多了会被限速或收费。长期用要么买企业版,要么自建:registry 与 harbor 的完整流程见姊妹篇。
附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
login |
login | 登录仓库,凭据存进 ~/.docker/config.json |
logout |
logout | 退出并删除该仓库的凭据 |
tag |
tag | 给镜像贴一个带仓库地址的名字 |
push |
push | 把镜像推到名字里的仓库 |
pull |
pull | 从仓库拉到本地 |
rmi |
remove image | 删本地镜像 |
SWR |
SoftWare Repository | 华为云容器镜像服务 |
ACR |
Alibaba Cloud Container Registry | 阿里云容器镜像服务 |
library |
library | 云仓库里的公共镜像命名空间 |
📚 参考资料(官方文档)
- 华为云 SWR 上传镜像(客户端上传步骤):https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html
- 华为云 SWR 镜像加速器配置:https://support.huaweicloud.com/usermanual-swr/swr_01_0066.html
- 阿里云 ACR 推送和拉取镜像:https://help.aliyun.com/zh/acr/user-guide/push-and-pull-images
- 阿里云镜像加速器配置:https://help.aliyun.com/zh/acr/user-guide/accelerate-the-pulls-of-docker-official-images
总结 :把镜像推上云,动作只有四个------建命名空间(组织)、登录、
tag打全名、push。真正决定成败的是那个全名:地址指向哪家仓库、第二段是不是你建好的组织、标签有没有写。华为云给的是会过期的临时指令,阿里云给的是长期固定的访问凭证,用的时候别搞混。加速器只是让 Docker Hub 的拉取更快,跟你自己的私有仓库没关系。
📚 同系列 · Docker 从镜像到容器(其余篇目见博客主页)
- 上一篇:《别再 docker commit 造镜像:Dockerfile 十六个指令与 docker build 实操》
- 姊妹篇:《自建镜像仓库:registry 一条命令 + harbor 部署、授权、跨库同步与卸载》
- 相关篇:《Docker 镜像管理:十个命令走完找拿看标删搬推》
💬 你在 docker push 上撞过哪堵墙?是 denied: requested access to the resource is denied(名字没打全),还是 unauthorized(凭证过期)?把命令贴出来,一起看是名字的问题还是权限的问题。
