镜像推上云:华为云 SWR 与阿里云 ACR 的建组织、加速器、上传与公开

本地 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 的拉取也快起来

控制台给出的五个步骤,照做即可:

  1. 装好 Docker 客户端(docker version 能出版本就行)。
  2. 复制「加速器地址」,形如 https://<一串字符>.mirror.swr.myhuaweicloud.com。
  3. 写进 /etc/docker/daemon.json,没有这个文件就新建。
  4. systemctl restart docker 重启引擎。
  5. 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 云仓库里的公共镜像命名空间

📚 参考资料(官方文档)

总结 :把镜像推上云,动作只有四个------建命名空间(组织)、登录、tag 打全名、push。真正决定成败的是那个全名:地址指向哪家仓库、第二段是不是你建好的组织、标签有没有写。华为云给的是会过期的临时指令,阿里云给的是长期固定的访问凭证,用的时候别搞混。加速器只是让 Docker Hub 的拉取更快,跟你自己的私有仓库没关系。


📚 同系列 · Docker 从镜像到容器(其余篇目见博客主页)

blog.csdn.net/nbsxl

  • 上一篇:《别再 docker commit 造镜像:Dockerfile 十六个指令与 docker build 实操》
  • 姊妹篇:《自建镜像仓库:registry 一条命令 + harbor 部署、授权、跨库同步与卸载》
  • 相关篇:《Docker 镜像管理:十个命令走完找拿看标删搬推》

💬 你在 docker push 上撞过哪堵墙?是 denied: requested access to the resource is denied(名字没打全),还是 unauthorized(凭证过期)?把命令贴出来,一起看是名字的问题还是权限的问题。

相关推荐
木木子225 小时前
用华为云码道构建校园导航应用「新生通」:从需求分析到工程落地
华为·华为云·harmonyos
xbzb1 天前
自建镜像仓库:registry 一条命令 + harbor 部署、授权、跨库同步与卸载
docker·harbor·镜像·仓库·同步·registry
xbzb3 天前
从零容器化部署 ECShop:Harbor 私有仓库 + 自定义 PHP 镜像 + LNMP 三容器
容器·php·harbor·镜像·仓库·ecshop
xbzb4 天前
镜像到底存在哪:/var/lib/docker 的四级映射与 daemon.json 配置
docker·容器·json·镜像·daemon.json·四级
牛奶咖啡134 天前
云计算平台应用实践——云计算与云平台
云计算·云平台·云平台的三大服务模式·云计算与云平台的关系·laas paas saas·云平台的主流架构·国内外的主流云平台对比与选型
逐流人5 天前
手工建集群到全自动发布:k8s集群部署与DevOps流水线整合实战
ci/cd·云原生·kubernetes·云计算·devops
xbzb5 天前
Docker 架构与部署:一条 docker run 到底走了三层
docker·容器·架构·镜像·加速·daemon
wz97545 天前
走进云计算:从硬件到云平台,读懂数字化底层基石
云计算
Kari116 天前
企业大模型RAG知识库从0到1搭建指南:腾讯云ADP+JOTO实战
人工智能·云计算·腾讯云