四 Docker 镜像仓库的管理
新增实战解析、底层动作拆解、坑点标注、企业级应用与排错指南。
4.1 什么是 Docker 仓库
【图片位置 1:Docker 本地实例与仓库交互流程图】原流程图文字:push Dtag pullbuildImagessaveDockerfile commit run load backup.tarContainersstop start restartLocal Docker instanceMy computer
(重复内容保留)push DbuildImagessaveDockerfile commit run load backup.tarContainersstop start restartLocal Docker instanceMy computer
原内容补充与解释
Docker 仓库 (Docker Registry) 是用于存储和分发 Docker 镜像的集中式存储库。
它就像是一个大型的镜像仓库,开发者可以将自己创建的 Docker 镜像推送到仓库中,也可以从仓库中拉取所需的镜像。
Docker 仓库可以分为公共仓库和私有仓库:
- 公共仓库,如 Docker Hub,任何人都可以访问和使用其中的镜像。许多常用的软件和应用都有在 Docker Hub 上提供的镜像,方便用户直接获取和使用。例如,您想要部署一个 Nginx 服务器,就可以从 Docker Hub 上拉取 Nginx 的镜像。; 超市 的免费试吃
- 私有仓库则是由组织或个人自己搭建和管理的,用于存储内部使用的、不希望公开的镜像。比如,一家企业为其特定的业务应用创建了定制化的镜像,并将其存储在自己的私有仓库中, 以保证安全性和控制访问权限。登录认证后用
通过 Docker 仓库,开发者能够方便地共享和复用镜像,加速应用的开发和部署过程。
生活类比
Docker 仓库就像公司的代码 Git 仓库 :公共仓库(Docker Hub)是 GitHub,所有人都能拉取开源代码;私有仓库是公司内部的 GitLab,只有授权员工才能访问和提交代码。镜像就是打包好的 "可执行代码包",push是提交代码,pull是拉取代码,tag就是代码的版本号。
4.2 Docker Hub

【图片位置 2:Docker Hub 首页截图】
要代理才能访问





核心代码 1:镜像打标签
bash
[ root@docker-nodel docker]# docker tag webserver:v4 timinglee/webserver:v4
逐行解析(Line-by-Line Breakdown)
docker tag:Docker 客户端通过 Unix 域套接字/var/run/docker.sock向 Docker Daemon 发送POST /images/create请求,仅在本地镜像元数据库中创建一条软链接记录,不会复制任何镜像文件。webserver:v4:源镜像引用,Docker Daemon 会在/var/lib/docker/image/overlay2/imagedb/content/sha256/目录中查找对应的镜像 ID。timinglee/webserver:v4:目标镜像完整路径,格式为[仓库地址]/[用户名]/[镜像名]:[标签]。省略仓库地址时,默认指向 Docker Hub(docker.io)。
坑点(Gotchas)
- 标签是软链接不是副本 :删除原镜像
webserver:v4不会影响timinglee/webserver:v4,只有当所有指向该镜像 ID 的标签都被删除时,镜像才会被垃圾回收。 - 私有仓库必须显式指定地址 :如果要推送到私有仓库,标签必须包含
IP:端口(如172.25.254.100:5000/busybox:latest),否则默认推送到 Docker Hub。
核心代码 2:登录 Docker Hub
bash
[root@docker-nodel docker]# docker login -u timinglee
Info - A Personal Access Token (PAT) can be used instead.
To create a PAT,visit https://app,docker,com/settings
Password:
Your reias ar srd ctd i /tdckr/cnfi-n
https://docs.docker.com/go/credential-store/
Login Succeeded
逐行解析
docker login -u timinglee:向 Docker Hub 认证服务https://auth.docker.io发送 POST 请求,执行 HTTP Basic 认证。- 认证成功后,Docker Daemon 会将
用户名:密码进行 Base64 编码,写入/root/.docker/config.json的auths字段。后续所有与该仓库的交互都会自动携带该认证头。 - 输出中的
/root/.docker/config.json是 Docker 客户端全局配置文件,存储所有仓库的认证信息和镜像加速配置。
坑点
- 密码明文存储风险 :Base64 不是加密,任何能读取该文件的用户都能还原出你的 Docker Hub 密码。生产环境必须配置
docker-credential-pass加密存储。 - PAT 是唯一安全选择:Docker Hub 已强制要求 2025 年起使用个人访问令牌(PAT),可以限制令牌权限(如仅允许拉取),即使泄露也不会影响账户安全。
核心代码 3:推送镜像到 Docker Hub
bash
[ root@docker-nodel docker]# docker push timinglee/webserver:v4
The push refers to repository[docker.io/timinglee/webserver]
1a73b54f556b:Waiting
24aacbf97031:Waiting
8a6133432fb2:Waiting
4d049f83d9cf:Waiting
af5aa97ebe6c:Waiting
ac805962e479:Waiting I
2a92d6ac9e4f:Waiting
6835249f577a:Waiting
8a5479d iting
bbb6cacb8c82:Waiting
8451c71f8cle:Waiting
2388d21e8e2b:Waiting
5342a2647e87:Waiting
577c8ee06f39:Waiting
c048279a7d9f:Waiting
开始推push
逐行解析
- 客户端先向 Docker Hub Index 服务发送推送请求,获取包含推送权限的 JWT 临时令牌和 Registry 地址。
- 客户端将镜像按层拆分,每个层对应唯一的 sha256 哈希值,先发送 HEAD 请求检查 Registry 中是否已存在该层,不存在才会上传。
- 输出中每一行
xxxxxx:Waiting代表一个镜像层在等待上传,Pushed表示该层已成功上传并校验通过。 - 所有层上传完成后,客户端上传镜像 Manifest 文件,Registry 根据 Manifest 组装成完整镜像。
坑点
- 国内网络超时 :直接访问 Docker Hub 平均延迟超过 300ms,极易出现
net/http: TLS handshake timeout错误,必须配置国内镜像加速。 - 免费账户容量限制:Docker Hub 免费账户单个仓库存储上限 10GB,超过后无法推送新镜像。
原内容补充
Docker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。它是 Docker 生态系统中最知名和广泛使用的镜像仓库之一,拥有大量的官方和社区贡献的镜像。 以下是 Docker Hub 的一些关键特点和优势:
- 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用的镜像。例如,您可以轻松找到 Ubuntu、CentOS 等操作系统的镜像,以及 MySQL、Redis 等数据库的镜像。相当于你手机里的视频多,还是抖音里的视频多
- 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。
- 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。
- 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。
【图片位置 5:Docker Hub 镜像详情页截图】
- 便于搜索:用户可以通过关键词轻松搜索到所需的镜像。
4.2.1 docker hub 的使用方法
bash
#登陆官方仓库 [root@docker ~]# docker login -u timinglee Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one. You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/
Username: timinglee
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
#登陆信息保存位置
[root@docker ~]# cd .docker/
[root@docker .docker]# ls
config.json
[root@docker .docker]# cat config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "dGltaW5nbGVlOjY3NTE1MTVtaW5nemxu"
}
}
}
[root@docker ~]# docker tag gcr.io/distroless/base-debian11:latest
timinglee/base-debian11:latest
[root@docker ~]# docker push timinglee/base-debian11:latest
The push refers to repository [docker.io/timinglee/base-debian11]
6835249f577a: Pushed
24aacbf97031: Pushed
8451c71f8c1e: Pushed
2388d21e8e2b: Pushed
c048279a7d9f: Pushed
1a73b54f556b: Pushed
2a92d6ac9e4f: Pushed
bbb6cacb8c82: Pushed
ac805962e479: Pushed
af5aa97ebe6c: Pushed
4d049f83d9cf: Pushed
9ed498e122b2: Pushed
577c8ee06f39: Pushed
5342a2647e87: Pushed
latest: digest:
sha256:f8179c20f1f2b1168665003412197549bd4faab5ccc1b140c666f9b8aa958042 size:
3234
【图片位置 6:Docker Hub 镜像上传成功截图】
核心代码 4:国内镜像加速配置
bash
[!TIP]
在国内因为网络等原因,docker hub连接困难,可以使用国内的镜像加速解决镜像无法下载的问 题
[root@harbor docker]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.m.daocloud.io"],
}
[root@harbor docker]# systemctl restart docker
逐行解析
vim /etc/docker/daemon.json:编辑 Docker Daemon 全局配置文件,该文件默认不存在,需手动创建。"registry-mirrors": ["https://docker.m.daocloud.io"]:配置镜像加速地址。Docker Daemon 会优先从加速地址拉取镜像,加速地址不存在时才回源到 Docker Hub。底层会修改 Docker Daemon 的镜像拉取路由表。systemctl restart docker:向 systemd 发送重启信号,Docker Daemon 会重新加载daemon.json中的所有配置。
坑点
- JSON 格式严格校验 :最后一个键值对后面不能有逗号,否则 Docker Daemon 会启动失败,报错
invalid JSON。 - 公共加速地址不稳定:DaoCloud、阿里云等公共加速地址可能会限流或失效,生产环境建议使用云厂商提供的专属加速地址。
企业级生产应用
- 在千万级并发的 K8s 集群中,每个节点拉取镜像会产生 TB 级的跨可用区流量。生产环境通常在每个可用区部署Harbor 代理缓存节点,所有节点从本地缓存拉取镜像,跨可用区流量降低 90% 以上。
- 进阶优化:使用Dragonfly P2P 分发系统,让节点之间互相共享镜像层,支持万级节点同时拉取镜像,中心仓库带宽压力降低 99%。
课后防宕机指南
- 错误现象 :重启 Docker 后 Daemon 无法启动,报错
invalid character '}' looking for beginning of object key string- 排查思路:使用
jsonlint /etc/docker/daemon.json验证 JSON 格式,删除多余的逗号。
- 排查思路:使用
- 错误现象 :配置加速后仍无法拉取镜像,报错
dial tcp: lookup docker.m.daocloud.io: no such host- 排查思路:检查节点 DNS 配置,执行
nslookup docker.m.daocloud.io验证加速地址是否可解析。
- 排查思路:检查节点 DNS 配置,执行
4.3 docker 仓库的工作原理
仓库中的三个角色
- index:docker 索引服务,负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
- registry:docker 仓库,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过 Index Auth service 的 Token 的方式进行认证
- Registry Client:Docker 充当 registry 客户端来维护推送和拉取,以及客户端的授权。
4.3.1 pull 原理
【图片位置 7:Docker 镜像拉取原理流程图】
镜像拉取分为以下几步:
- docker 客户端向 index 发送镜像拉去请求并完成与 index 的认证
- index 发送认证 token 和镜像位置给 dockerclient
- dockerclient 携带 token 和根据 index 指引的镜像位置取连接 registry
- Registry 会根据 client 持有的 token 跟 index 核实身份合法性
- index 确认此 token 合法性
- Registry 会根据 client 的请求传递镜像到客户端
底层动作解释
- 步骤 1:客户端发送
GET /v2/请求到 Index,Index 返回401 Unauthorized并携带认证端点地址。 - 步骤 2:客户端向认证端点发送请求,获取包含拉取权限的 JWT 令牌,令牌有效期通常为 1 小时。
- 步骤 3:客户端携带 JWT 令牌向 Registry 发送
GET /v2/<镜像名>/manifests/<标签>请求,获取镜像 Manifest 文件。 - 步骤 4-5:Registry 将 JWT 令牌发送给 Index 验证,Index 返回验证结果和权限范围。
- 步骤 6:Registry 根据 Manifest 中的层信息,以分块传输编码(Chunked Transfer Encoding)的方式将镜像层文件发送给客户端。
4.3.2 push 原理
【图片位置 8:Docker 镜像推送原理流程图】
镜像上传的步骤:
- client 向 index 发送上传请求并完成用户认证
- index 会发方 token 给 client 来证明 client 的合法性
- client 携带 index 提供的 token 连接 Registry
- Registry 向 index 合适 token 的合法性
- index 证实 token 的合法性
- Registry 开始接收客户端上传过来的镜像
底层动作解释
- 步骤 1-2:与拉取流程类似,客户端获取包含推送权限的 JWT 令牌。
- 步骤 3:客户端先上传镜像 Manifest 文件,Registry 检查 Manifest 的格式和完整性。
- 步骤 4-5:Registry 验证 JWT 令牌的有效性和对该仓库的推送权限。
- 步骤 6:客户端按层上传镜像文件,每个层上传完成后,Registry 会计算该层的 sha256 哈希值并与 Manifest 中的值比对,确保数据未被篡改。
4.3 搭建 docker 的私有仓库
4.3.1 为什么搭建私有仓库
docker hub 虽然方便,但是还是有限制
- 需要 internet 连接,速度慢
- 所有人都可以访问
- 由于安全原因企业不允许将镜像放到外网
好消息是 docker 公司已经将 registry 开源,我们可以快速构建企业私有仓库地址: https://docs.docker.com/registry/deploying/
生活类比
搭建私有仓库就像公司自己建了一个内部文件服务器,而不是把所有机密文件都存在百度网盘上。内部服务器速度更快、安全性更高,只有授权员工才能访问,不会泄露公司的核心业务代码。
4.3.2 搭建简单的 Registry 仓库
- 下载 Registry 镜像
bash
[root@docker ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
930bdd4d222e: Pull complete
a15309931e05: Pull complete
6263fb9c821f: Pull complete
86c1d3af3872: Pull complete
a37b1bf6a96f: Pull complete
Digest: sha256:12120425f07de11a1b899e418d4b0ea174c8d4d572d45bdb640f93bc7ca06a3d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
2122525400
代码解释
docker pull registry:拉取 Docker 官方开源的 Registry 镜像,该镜像包含了完整的私有仓库服务实现。
- 开启 Registry
bash
[root@docker ~]# docker run -d -p 5000:5000 --restart=always --name registry
registry
bc58d3753a701ae67351fac335b06a4d7f66afa10ae60b992f647117827734c
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
bc58d3753a70 registry "/entrypoint.sh /etc..." 7 seconds ago Up 6 seconds
5000/tcp, 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry
21722525410060 17225242
逐行解析
docker run -d:后台运行容器,Docker Daemon 会创建一个新的容器进程并返回容器 ID。-p 5000:5000:将宿主机 5000 端口映射到容器 5000 端口。底层会在 iptables 中添加一条 DNAT 规则,将发往宿主机 5000 端口的流量转发到容器的网络命名空间。--restart=always:设置容器重启策略为总是重启。该配置会写入容器元数据文件/var/lib/docker/containers/<容器ID>/config.v2.json,Docker Daemon 启动时会自动重启该容器。--name registry:给容器指定名称,方便后续管理。registry:指定要运行的镜像名称。
坑点
- 数据持久化缺失 :默认情况下,镜像存储在容器的
/var/lib/registry目录,容器删除后所有镜像都会丢失。生产环境必须挂载宿主机数据卷。 - HTTP 协议限制 :Docker 客户端默认使用 HTTPS 协议,直接推送会报错,需要配置
insecure-registries。
原内容补充(原文档不完整部分):镜像最终存储在容器的
/var/lib/registry目录,生产环境需挂载到宿主机:json
bash{ "Type": "bind", "Source": "/opt/registry", "Destination": "/var/lib/registry" }
3.上传镜像到仓库中
【图片位置 9:本地镜像列表截图】
bash
#给要上传的经镜像大标签
[root@docker ~]# docker tag busybox:latest 172.25.254.100:5000/busybox:latest
#docker在上传的过程中默认使用https,但是我们并没有建立https认证需要的认证文件所以会报错
[root@docker ~]# docker push 172.25.254.100:5000/busybox:latest
The push refers to repository [172.25.254.100:5000/busybox]
Get "https://172.25.254.100:5000/v2/": dial tcp 172.25.254.100:5000: connect:
connection refused
[root@docker ~]# systemctl restart docker
#上传镜像
[root@docker ~]# docker push 172.25.254.100:5000/busybox:latest
The push refers to repository [172.25.254.100:5000/busybox]
d51af96cf93e: Pushed
latest: digest:
sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size:
527
#查看镜像上传
[root@docker ~]# curl 172.25.254.100:5000/v2/_catalog
{"repositories":["busybox"]}
17225254200
逐行解析
docker tag busybox:latest 172.25.254.100:5000/busybox:latest:给镜像打标签,指定私有仓库的 IP 和端口。- 第一次
docker push报错:Docker 客户端默认使用 HTTPS 协议,而 Registry 使用 HTTP 协议。 systemctl restart docker:使daemon.json中的insecure-registries配置生效(原文档省略了该步骤,实际需添加"insecure-registries": ["172.25.254.100:5000"])。curl 172.25.254.100:5000/v2/_catalog:调用 Registry V2 API,获取仓库中所有镜像的列表。
坑点
- 所有节点都需配置 insecure-registries:任何需要访问该 HTTP 仓库的 Docker 节点都必须添加该配置,否则无法推拉镜像。
- 端口冲突:如果宿主机 5000 端口被其他服务占用,Registry 容器会启动失败,需修改端口映射。
企业级生产应用
- 简单的 HTTP Registry 仅适用于开发测试环境,生产环境绝对禁止使用,因为所有数据都是明文传输,极易被窃听和篡改。
- 进阶优化:必须启用 HTTPS 加密传输,并配置用户认证和访问控制。
课后防宕机指南
- 错误现象 :推送镜像时报错
http: server gave HTTP response to HTTPS client- 排查思路:检查
daemon.json中是否配置了insecure-registries,并且已重启 Docker Daemon。
- 排查思路:检查
- 错误现象 :删除 Registry 容器后所有镜像丢失
- 排查思路:检查容器是否挂载了数据卷,生产环境必须使用
-v /opt/registry:/var/lib/registry参数。
- 排查思路:检查容器是否挂载了数据卷,生产环境必须使用
4.3.3 为 Registry 提加密传输

bash
[root@docker-nodel~]# docker rm -t registry registry [root@docker-nodel~]#
root@docker-node2~]#vim/etc/resolv.conf^C root@docker-node2~]#>/etc/docker/daemon.json
root@docker-node2~]#
先把前面做实验的痕迹删除
然后建立目录
#生成认证key和证书
[root@docker ~]# openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" #指定备用名称
-x509 -days 365 -out certs/timinglee.org.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:timinglee
Organizational Unit Name (eg, section) []:docker
Common Name (eg, your name or your server's hostname) []:reg.timinglee.org
Email Address []:admin@timinglee.org
#查看证书信息
[root@docker-node1 ~]# openssl x509 -in certs/timinglee.org.crt -noout -text
rr o -i ss s-i /tcrigog.rt
-noout text
iii
glee.org
逐行解析
openssl req -newkey rsa:4096:生成 4096 位 RSA 私钥,是目前工业界推荐的安全密钥长度。-nodes:不加密私钥文件,Registry 启动时无需输入密码。生产环境建议加密私钥并使用 Docker Secrets 管理。-sha256:使用 SHA-256 算法签名证书,比 SHA-1 更安全。-addext "subjectAltName = DNS:reg.timinglee.org":添加主题备用名称(SAN)扩展。这是最容易写错的坑点,Docker 1.13 + 强制要求证书包含 SAN 扩展,否则会拒绝信任。-x509:生成自签名证书,而非证书签名请求(CSR)。-days 365:证书有效期为 365 天。
坑点
- SAN 扩展必须添加 :缺少 SAN 扩展会报错
x509: certificate relies on legacy Common Name field, use SANs instead。 - 证书域名必须完全匹配 :证书的 Common Name 或 SAN 必须与 Registry 的访问域名完全一致,否则会报错
x509: certificate is valid for xxx, not yyy。
bash
运行
bash
#启动registry仓库
[root@docker ~]# docker run -d -p 443:443 --restart=always --name registry \
-v /opt/registry:/var/lib/registry \
-v /root/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/timinglee.org.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/timinglee.org.key registry
-v:把容器的目录挂载到本机上去
217221 41722525420(60
[ root@docker-nodel-]# docker run -d -p 443:443--restart-always --name registry\
-e REGISTRY HTTP ADDR=0.0.0.0:443\ -v /opt/registry:/var/lib/registry\ -v /etc/docker/certs:/certs - REGISTRY HTTP_TLS_CERTIFICATE=/etc/docker/certs/timinglee.org.crt\
e REGISTRY_HTTP_TLS_KEY=/etc/docker/certs/timinglee.org.key registry
172252510
21225251 1722242
I
CREATED STATUS PORT
lcb7a7ff66cf registry "/entrypoint.sh /etc." 3 seconds ago Restarting(1)Less than a second ago
t-1trsir
[rootdocker-nodel-]# I
看看加了密之后还能不能推东西
测试:
[root@docker docker]# docker push reg.timinglee.org/busybox:latest #docker 客
户端没有key和证书
Error response from daemon: Get "https://reg.timinglee.org/v2/": tls: failed to
verify certificate: x509: certificate signed by unknown authority
逐行解析
-v /opt/registry:/var/lib/registry:挂载宿主机数据卷,实现镜像数据持久化。-v /root/certs:/certs:挂载证书目录,让 Registry 容器可以读取证书和私钥。-e REGISTRY_HTTP_ADDR=0.0.0.0:443:设置 Registry 监听所有网络接口的 443 端口(HTTPS 默认端口)。-e REGISTRY_HTTP_TLS_CERTIFICATE和-e REGISTRY_HTTP_TLS_KEY:指定 HTTPS 证书和私钥的路径。
坑点
- 证书权限问题:证书和私钥文件的权限必须是 600,否则 Registry 无法读取,会启动失败。
- 自签名证书信任问题:自签名证书不被系统信任,需要手动复制到所有 Docker 客户端的证书目录。
bash
运行

bash
所以得建立证书
#为客户端建立证书
[root@docker docker]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p
[root@docker docker]# cp /root/certs/timinglee.org.crt
/etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker docker]# systemctl restart docker
Head"https://reg.timinglee.org/v2/webserver/blobs/sha256:6a76ba99244221a6915e44f9eab40321
[root@docker docker]# docker push reg.timinglee.org/busybox:latest
The push refers to repository [reg.timinglee.org/busybox]
d51af96cf93e: Pushed
latest: digest:
sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size:
527
[root@docker docker]# curl -k https://reg.timinglee.org/v2/_catalog
{"repositories":["busybox"]}
逐行解析
mkdir /etc/docker/certs.d/reg.timinglee.org/ -p:创建 Docker 客户端证书目录,目录名称必须与仓库域名完全一致。cp /root/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt:将自签名证书复制到客户端证书目录,Docker 客户端会自动信任该目录下的所有证书。curl -k https://reg.timinglee.org/v2/_catalog:使用-k参数跳过证书验证,查看仓库镜像列表。
企业级生产应用
- 生产环境禁止使用自签名证书,应使用 Let's Encrypt 等可信 CA 颁发的证书,所有客户端可自动信任。
- 进阶优化:使用 cert-manager 实现证书自动续期,避免证书过期导致服务中断。
课后防宕机指南
- 错误现象 :推送镜像时报错
tls: failed to verify certificate: x509: certificate signed by unknown authority- 排查思路:检查客户端是否已将证书复制到
/etc/docker/certs.d/reg.timinglee.org/ca.crt,并重启了 Docker Daemon。
- 排查思路:检查客户端是否已将证书复制到
- 错误现象 :Registry 容器启动失败,报错
open /certs/timinglee.org.key: permission denied- 排查思路:执行
chmod 600 certs/timinglee.org.key修改私钥文件权限。
- 排查思路:执行
4.3.4 为仓库建立登陆认证
bash
#安装建立认证文件的工具包
[root@docker docker]# dnf install httpd-tools -y
#建立认证文件
[root@docker ~]# mkdir auth
[root@docker ~]# htpasswd -Bc auth/htpasswd timinglee #-B 强制使用最安全加密方式,
默认用md5加密
New password:
Re-type new password:
Adding password for user timinglee
逐行解析
dnf install httpd-tools -y:安装httpd-tools工具包,包含htpasswd命令,用于生成 HTTP 基本认证的密码文件。htpasswd -Bc auth/htpasswd timinglee:生成密码文件并添加用户timinglee。-B:强制使用 bcrypt 算法加密密码,是目前最安全的密码加密算法。-c:创建新的密码文件,如果文件已存在会被覆盖。这是最容易写错的坑点 ,添加多个用户时第二次使用不能加-c参数。
坑点
- -c 参数只能用一次 :添加后续用户时必须去掉
-c,否则会覆盖整个密码文件。 - 密码长度要求:bcrypt 算法要求密码长度至少为 8 位,否则会报错。
bash
#添加认证到registry容器中
[root@docker ~]# docker run -d -p 443:443 --restart=always --name registry \
-v/opt/registry:/var/lib/registry \
-v /root/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/timinglee.org.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/timinglee.org.key \
-v /root/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry
[root@docker ~]# curl -k https://reg.timinglee.org/v2/_catalog -u timinglee:lee
{"repositories":["busybox","nginx"]}
#登陆测试
[root@docker ~]# docker login reg.timinglee.org
Username: timinglee
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
当仓库开启认证后必须登陆仓库才能进行镜像上传
#未登陆情况下上传镜像
[root@docker ~]# docker push reg.timinglee.org/busybox
Using default tag: latest
The push refers to repository [reg.timinglee.org/busybox]
d51af96cf93e: Preparing
no basic auth credentials
#未登陆情况下也不能下载
[root@docker-node2 ~]# docker pull reg.timinglee.org/busybox
Using default tag: latest
Error response from daemon: Head
"https://reg.timinglee.org/v2/busybox/manifests/latest": no basic auth
credentials
逐行解析
-v /root/auth:/auth:挂载认证文件目录到容器。-e "REGISTRY_AUTH=htpasswd":启用 HTTP 基本认证,使用 htpasswd 文件进行用户验证。-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm":设置认证领域名称,客户端未认证时会显示该名称。-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd:指定 htpasswd 密码文件的路径。
企业级生产应用
- 简单的 htpasswd 认证仅适用于小型团队,生产环境应使用基于角色的访问控制(RBAC),如 Harbor 提供的 RBAC 功能。
- 进阶优化:集成企业内部 LDAP/OAuth2 身份认证系统,实现单点登录(SSO),统一管理用户权限。
课后防宕机指南
- 错误现象 :输入正确的用户名和密码也无法登录
- 排查思路:检查 htpasswd 文件的路径是否正确,以及文件权限是否为 600。
- 错误现象 :添加新用户后之前的用户无法登录
- 排查思路:检查添加用户时是否使用了
-c参数,导致密码文件被覆盖。
- 排查思路:检查添加用户时是否使用了
4.4 构建企业级私有仓库
之前就是用 registry, 构建了容器,然后储存镜像,分发;
但是没有图形;企业需要通过 WEB 来访问,去管理

HARBORM下载软件包地址


Harbor 是由 vmware 公司开源的企业级 Docker Registry 项目。它提供了以下主要功能和特点:
- 基于角色的访问控制 (RBAC): 可以为不同的用户和用户组分配不同的权限,增强了安全性和管理的灵活性。
- 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。
- 图形化用户界面 (UI): 提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
- 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
- 垃圾回收:可以清理不再使用的镜像,节省存储空间。
构建两个主机
还有得先生成证书


4.4.1 部署 harbor
bash
[root@docker ~]# tar zxf harbor-offline-installer-v2.5.4.tgz -c /opt
#mkdir /opt/harbor/certs
[root@docker ~]# ls
anaconda-ks.cfg certs
anaconda-ks.cfg certs harbor-offline-installer-v2.5.4.tgz
auth harbor
[root@docker ~]# cd harbor/
openssl req -newkey rsa:4096 \
\
-nodes -sha256 -keyout certs/timinglee.org.key \
-addext "subjectAltName = DNS:reg.timinglee.org" #指定备用名称
[root@docker harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker harbor]# vim harbor.yml
hostname: reg.timinglee.org
certificate: /data/certs/timinglee.org.crt
private_key: /data/certs/timinglee.org.key
harbor_admin_password: lee
[root@docker harbor]# ./install.sh --help
Please set --with-notary #证书签名
Please set --with-trivy #安全扫描
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor
[root@docker harbor]# ./install.sh --with-chartmuseum
[root@docker-nodel harbor]#./install.sh
[Step 0]:checking if docker is installed...
Note:docker version:29.3.0
[Step1]:checking docker-composeis installed...
Note:Docker Compose version v5.1.0
[Step 2]:loading Harbor images...
然后删掉之前的,再去执行
Usage:docker rm[OPTIONS] CONTAINER [CONTAINER...]
Run 'docker rm--help'for more information
Note: docker version:29.3.0 [Step 0]:checkingif dockeris installed... I
[Step1]:checking docker-compose is installed...
Note:Docker Compose version v5.1.0
[Step 2]:loading Harbor images...
逐行解析
tar zxf harbor-offline-installer-v2.5.4.tgz -c /opt:解压离线安装包到/opt目录,离线包包含所有 Harbor 组件的镜像,无需从外网拉取。cp harbor.yml.tmpl harbor.yml:复制配置模板为harbor.yml,这是 Harbor 的主配置文件。vim harbor.yml:修改关键配置:hostname: reg.timinglee.org:Harbor 访问域名,必须与证书域名一致。certificate/private_key:HTTPS 证书和私钥的路径。harbor_admin_password: lee:管理员初始密码。
./install.sh --with-chartmuseum:运行安装脚本,启用 Chartmuseum 组件(用于存储 Helm Chart)。脚本会自动检查环境、加载镜像、生成 Docker Compose 配置并启动所有组件。
坑点
- Docker 版本兼容性:Harbor 对 Docker 和 Docker Compose 版本有严格要求,例如 v2.15.0 要求 Docker≥20.10.10,Docker Compose≥2.0.0。版本不兼容会导致安装失败。
- 端口冲突 :Harbor 默认使用 80 和 443 端口,被占用时需修改
harbor.yml中的http.port和https.port参数。
bash
#管理harbor的容器
[root@docker harbor]# docker compose stop
[root@docker harbor]# docker compose up -d
[ root@docker-nodel harbor]# docker compose down loa bo-o Stoppeu
[+]down10/10 Container nginx Removed
Removed
Container harbor-core Removed
Container harbor-portal Container redis Removed Removed
Container harbor-db Removed
Container registry Container harbor-log
Network harbor harbor
[rootdockernode harbor# docker cpose up
Network harbor_harbor Created
Container harbor-log
contin hrr-prtal
Container registryctl Container redis Starting
Container harbor-core Container registry Container harbor-jobservice Created
Container nginx Created
逐行解析
docker compose stop:停止所有 Harbor 组件容器,但不删除容器和数据。docker compose up -d:后台启动所有 Harbor 组件容器。docker compose down:停止并删除所有 Harbor 组件容器和网络,但不删除数据卷中的数据。
4.4.2 管理仓库
- 登陆
【图片位置 11:Harbor 登录页面截图】
- 建立仓库项目
【图片位置 12:Harbor 项目管理页面截图】
bash
[root@docker harbor]# docker login reg.timinglee.org
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
[root@docker harbor]# docker tag busybox:latest
reg.timinglee.org/timinglee/busybox:latest
[root@docker harbor]# docker push reg.timinglee.org/timinglee/busybox:latest
The push refers to repository [reg.timinglee.org/timinglee/busybox]
d51af96cf93e: Pushed
latest: digest:
sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size:
527
172.25.254.10 0ot) 会话决查看X服务器工具 0 服务器工具会监
0
设置索帮助 8 分割多执行隧惠 2122210
X
722525420)
1722525410d
[ root@docker-nodel harbor]#cd
[root@docker-nodel-]# docker images
2.22MB 76.1MB EXTRA
CONTENT SIZE
DISK USAGE
In Use
i Info→
IMAGE
ID
b
270MB 363MB 335MB 327MB 334MB 309MR
b28659
67.9MB 77.3MB 75.2
279MB
147MB
7
I
28.4MB 67.9MB
79MB
308MB
132M
510MB 426MB
2.21MB
6.71MB
..........
i
bbb6cacb8c82:Waiting
2388d21e8e2b:Waiting
tls: ailed to verify certificate: x509:certificate signed by unknown authority
172.25254.10 oo 会话夫查看X服务器工具设置索帮 墨由
服务器工具 会话夫查看 0 分制 2122254 17225254200 1722525100
5342a2647e87:Waiting
[root@docker-nodel~]#cd/etc/docker/
[root@docker-nodel docker]#ls
-rw-r--r--1 rootroot21953月1516:07ca.crt
LICENSE install.sh prepare
29版本有问题
换成28的
[root@docker-nodel harbor]#dnfinstall docker-ce-3:28.5.2-1.el9 正在更新 Subscription Management软件仓库。 无法读取客户身份。 本系统尚在权利服务器中注册。可使用"rhc"或"subscription-manager"进行注册。 上次元数据过期检查:0:15:13前,执行于202年03月21日星期六10时21分48秒。 依赖关系解决。
| 软件包 | 架构 | 版本 | 仓库 | 大小 |
| --- | --- | --- | --- | --- |
| 安装: 3:28.5.2-1.el9 docker 21 M docker-ce x86\_64 | | | | |
| 安装依赖关系: | | | | |
| containerd.io | x86\_64 | 2.2.2-1.el9 | docker | 35 M |
| docker-ce-cli | x86\_64 | 1:29.3.0-1.el9 | docker | 8.4 M |
| 安装弱的依赖: | | | | |
| docker-buildx-plugin | x86\_64 | 0.31.1-1.el9 | docker | 21 M |
| docker-ce-rootless-extras | x86\_64 | 29.3.0-1.el9 | docker | 3.4 M |
| docker-compose-plugin | x86\_64 | 5.1.1-1.el9 | docker | 8.2 M |
事务概要 安装 6 软件包
从头再来:
文件编辑格式O主(1( 17225254.10oot 0
锅会话查看X服器工具设置帮助
全 全 随通 2122 17225254200 1722521 x
harbor.yml LICENSE install.sh prepare I
0.0s
木系统尚未在权利服务器中注册。可使用"rhc"或"subscription-manager"进行注册。
[root@docker-nodel harbor]#
21722525410(roo4)
3 1722525420(roo)
417225254.10(root)
[root@docker-nodel harbor]#dnf list docker-ce --showduplicates
会话 服务器工具会话夫看分制精软设置
217225254100
3 252542d
1722
I
3:28.0.4-1.el9
docker docker docker docker docker docker
docker docker docker docker docker
[rotedor-node hrbor#nf install kr-ce--1y 正在更新Subscription Management软件仓库。 无法读取客户身份。 木系统尚未在权利服务器中注册。可使用"rhc"或"subscription-manager"进行注册。 上次数据过检查:015:13前,执行于2026年32星期六01秒。
3:29.3.0-1.el9
docker
| 软件包 | 架构 | 版本 | 仓库 | 大小 |
| --- | --- | --- | --- | --- |
| 安装: | | | | |
| docker-ce | x86\_64 | 3:28.5.2-1.el9 | docker | 21 M |
| 安装依赖关系: containerd.io | x86\_64 | 2.2.2-1.el9 | docker | 35 M |
| docker-ce-cli | x86\_64 | 1:29.3.0-1.el9 | docker | 8.4 M |
| 安装弱的依赖: | | | | |
| docker-buildx-plugin | x86\_64 | 0.31.1-1.el9 | docker | 21 M |
| docker-ce-rootless-extras | x86\_64 | 29.3.0-1.el9 | docker | 3.4 M |
| docker-compose-plugin | x86\_64 | 5.1.1-1.el9 | docker | 8.2 M |
事务概要 安装 6 软件包 总下载:97M
[ root@docker-nodel harbor]# systemctl start docker
[ root@docker-nodel harbor]#vim/lib/systemd/system/docker.service
17225.254.10 oo) 肉端会话夫查看X服务器工具设置帮助 服务器工具 会失看分制阻软设置 Q 会 2722 222 41722525410oot
StartlimitIntervalSec=60
[Service]
i
LimitNPROC=infinity LimitCORE-infinity
# set delegate yes so that systend does not reset the cgroups of docker containers
--插入 15,97 顶端
21722525410 172522 172252541000
rotcr-d arbor i lisi
Pulling
Pulling
Pulling 3.4s
速连校...
21722525410 (root)
3.1722525420(root)
[ root@docker-node2~]#dnf remove docker-ce
roteocr-ode2 -1 dnf instal, ocr-e-2.5.2-1.9-y
无法读取客户身份。 木系统尚未在权利服务器中注册。可使用"rhc"或"subscription-manager"进行注册。
上次元数据过期检查:0:34:45前,执行于2026年03月21日星期六10时08分56秒。
依赖关系解决。
| 软件包 | 架构 | 版本 | 仓库 | 大小 |
| --- | --- | --- | --- | --- |
| 安装: docker-ce | x86\_64 | 3:28.5.2-1.el9 | docker | 21 M |
| 安装依赖关系: | | | | |
| containerd.io | x86\_64 | 2.2.2-1.el9 | docker | 35 M |
| docker-ce-cli | x86\_64 | 1:29.3.0-1.el9 | docker | 8.4 M |
| 安装弱的依赖: docker-buildx-plugin | x86\_64 | 0.31.1-1.el9 | docker | 21 M |
| docker-ce-rootless-extras | x86\_64 | 29.3.0-1.el9 | docker | 3.4 M |
| 事务概要 | | | | |
| 安装 6 软件包 | | | | |
| 总下载:97M 安装大小:380 M 下载软件包: | | | | |
| [1/6): containerd.io-2.2.2-1.019 0% [ | | | B/s | | ETA |
1725.25420 oot) 会话尖查看X服务器工具设置发帮动
工具 会话失直看分多速软件包设置 X服务
272 317225254200 172252100
IMAGE [root@docker-node2~]# [ root@docker-node2 -]# docker images ID DISK USAGE CONTENT SIZE EXTRA Info In Use
使用仓库:
查看有无证书:
217225254 10(oot) 31722525420(root) 4172252
[root@docker-node2~]# cd /etc/docker/ [ root@docker-node2 docker]#ls certs.d daemon.json
[root@docker-node2 docker]# cd certs.d/
[root@docker-node2certs.d]#ls reg.timinglee.org [root@docker-node2 certs.d]# cd reg.timinglee.org/ [ root@docker-node2 reg.timinglee.org]#ls ca.crt
1e [root@docker-node2 reg.timinglee.org]# cd..
[ root@docker-node2 certs.d]#ls reg.timinglee.org [root@docker-node2~]# [ root@docker-node2 certs.d]# cd
[ root@docker-node2~]# vim /etc/docker/daemon.json
[root@docker-node2~]#
{ "registry-mirrors": "https://reg.timinglee.org" }
查看本地解析
[1ker-n~j# vim/e/ke/mn.jsn [root@docker-node2~]#vim/etc/hosts
17225.254.20 oot) 读会话尖查看X服务器工具设置索帮 会 服器工具会适失监分执精件设置 127.0.0.1 172.25.254.20 172.25.254.10 C 8 8 21722254 10000 3 1722525420 o 7225254 10g localhost localhost.localdomain localhost4 localhost4.localdomain4 localhost localhost.localdomain localhost6 localhost6.localdomain6 docker-node2 reg.timinglee.org
172.2525420 root)
会话夹查看X服务器工具设置帮助
会话服务部工具会话夹查看分割多找随激件包设置
217225254100 3 1722525420oo 41722525410o4
[root@docker-node2~]#vim/etc/docker/daemon.json
[root@docker-node2~]#vim/etc/hosts
[ root@docker-node2 ~]# systemctl restart docker [root@docker-node2-]#dockerinfo
I
不 17225254200 会话卖查看X服务器 H 0
查警
21722524 1722525420o 122521oo
CDI spec directories:
/etc/cdi
seccomp
Profile:builtin
Registry Mirrors:
tdar-d -1
查看上传的镜像
> 【图片位置13:Harbor镜像详情页截图】
> 原内容:
> Harbor 中文简体 &admin
> <项目
> 项目 访问级别 已使用的存储空间
> 日志 品 timinglee 系统管理员 公开 2.12MiBof不设限
> 系统管理
> 机器人账户 用户管理 概委 辑像仓库 Helm Charts 成员 标签 扫描器 P2P预热笙略 机器人账户 Webhooks 日志 配置管理
> 仓库管理 推送命Q=C
> 复制管理
> <分布式分发 0 Artifacts 下载 最制更时间
> 标签 tmingiee/busybox 0 2024/8/17下午3:01
> 项目定额 页面大小15 1-1共计1条记录
> 审查服务
> 1垃圾清理
> 配置管理
> C深色主题
> Harbor APIV2.0
> 2 17225254.10
> Harbor O挂索Harbor. &admi
> <项目<library
> 品项
> registry-photon
> 管理 描述信息 Aac
> 户管理
> 机器人账户 ae
> 库管理 Mats 已置名
> 制管理
> 520 0 6 31% MB 不支持扫 202/321
> 分式分发
> 0标签 管导列 1-计1条记量
> 23
> 查服务
> 1清理服务
> 2任务中心
> 配管理
> 深色主题
> APIV2.0
> 项目 已使用的配额
> 新建项目 31.96M
> 项目名称 timinglee
> 请问经1
> 项限制1
> 锁像理
> 公开的意思:你不登陆我都让你下
> 【图片位置14:Harbor项目列表截图】
> 原内容:
> Harbor O 索Harbor 8 mu
> 成功创建项。
> 品项 普志 项目 项目 镜像仓库 已使用的配额
> 系统管理 31.96MB
> 用户管理
> 机器人账户
> 库管理 项目名 其他挂作 销像仓局 所有项目QC
> 分式分发 0 lorary 公开 口理 2036/3/2110:11
> 标签 nie 公开 项管理 项目 06//20:49
> 2定 香服务 7 真 小1 1-2计2条记录
> 自清理服务
> 任务中心
> 配置管理
> C深色主题
> 217225250
> 1722525420
> 1722525410
> [root@docker-nodel-]# dockerimages
> EXTRA CONTENT SIZE
> DISK USAGE
> In U
> Info
> IMAGE
> 20 132MB 178MB 1
> 4.26MB
> ID 65aded468eb1
> busybox:latest goharbor/harbor-core:v2.14.0
> 403d93718fa2 2cd20014f558 e49b51ca9cle e1055ac74dda 9504450a9e13
> 165MB 151MB
> goharbor/redis-photon:v2.14.0
> UUU
> 1 87.3MB 393MB 142
> 2f870818fbc8 10a81daa59cb a7be6198544f 2f870818fbc8
> latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527 [root@docker-nodel~]#
> a 2 p//1722525410/harbope
> Harbor 0.搜索arbo &admin
> <项目
> 项 访问级别 已使用的配额
> 日志 timinglee 系统管理员 公开 2.12MBof不设理
> 系管理
> 用户管理 1像仓库 成员 松签 扫描器 P2P预热笙略 机器人账户 Whodks 日志 配置管理
> 机器人账户
> 库管理 0 推送令QC
> 分式分发 名称 Atats
> 标签 timingioe buybo 2026/3/2110:49
> 定额 1-1共出1 记录
> 查服务
> 清理服务
> ?任务中心
> @配管理
> C 色主题
> 下载:
> 1722525420 o0
> 资誉 217225254 0 0 3 172252542000 22
> 一
> [root@docker-node2~]#
> [root@docker-node2~]#cat/etc/docker/daemon.json "registry-mirrors":["https://reg.timinglee.org"]
> 弄点靠谱的上传
> 172.25.254.10o
> 误会话查看X服务器 0 工具 的
>
> 全 217225254 o 1722525420
>
> [root@docker-nodel harbor]#ls harbor.yml harbor.yml.tmpl install.sh prepare
> nginx-1.23 tar.gz
> [ rootedocker-nodel -]# docker ps
> [root@docker-nodel-]# docker images IMAGE
> ID
> D
>
> Info In Use CONTENT SIZE EXTRA
> UUUU
> 151MB 197MB
> 8




企业级生产应用(Harbor)
- 在千万级并发的云原生场景中,Harbor 是企业级镜像仓库的事实标准。通常采用多区域主从复制架构,在每个数据中心部署一个 Harbor 实例,通过镜像复制功能将镜像同步到所有区域,实现就近拉取,跨区域网络延迟降低 80% 以上。
- 进阶优化:
- K8s 高可用部署:将 Harbor 各个组件(core、registry、jobservice 等)拆分为独立的 Deployment,实现组件水平扩展和故障自动恢复。
- 对象存储后端:将镜像存储从本地磁盘替换为 S3/MinIO 对象存储,实现无限扩展和数据高可用。
- 全链路安全:启用 Trivy 漏洞扫描 + Notary 镜像签名,自动拦截存在高危漏洞和被篡改的镜像进入生产环境。
- P2P 分发加速:集成 Dragonfly,支持万级节点同时拉取镜像,中心仓库带宽压力降低 99%。
课后防宕机指南(Harbor)
- 错误现象 :访问 Harbor Web 界面显示
502 Bad Gateway- 排查思路:执行
docker compose ps查看组件状态,常见原因是 harbor-db 数据库启动失败,需检查/data/database目录的权限是否为 700。
- 排查思路:执行
- 错误现象 :推送镜像时报错
denied: requested access to the resource is denied- 排查思路:检查用户是否有该项目的推送权限,以及是否已使用正确的域名登录 Harbor 仓库。
生活类比
Harbor 就像公司的大型智能物流仓库,而简单的 Registry 只是一个无人看管的车库。Harbor 不仅能安全存储货物(镜像),还能管理员工进出权限(RBAC)、监控货物流动(审计日志)、检查货物质量(漏洞扫描)、在不同仓库之间调拨货物(镜像复制),并且有一个现代化的管理前台(Web UI)来处理所有事务。




















