【Docker#4】Docker Registry 镜像仓库
一:🔥 Docker Restry 概述
🦋 什么是 Docker Registry
定义:Docker Registry 负责存储、管理和分发镜像,并提供了登录认证能力,建立了仓库的索引。如下图:

功能:镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签(Tag)来区分。
整体视图如下:

结构:
- 镜像仓库(Registry):通常通过 DNS 或 IP 地址来确定镜像所在的 镜像仓库 位置,如
hub.docker.com。一个 Registry 中可以存在多个 Repository。- Repository:特定 Docker 镜像的所有迭代版本组成的镜像仓库
- Repository 可分为 “顶层仓库” 和 “用户仓库”;用户仓库名称格式为 “用户名/仓库名”;每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像
- 镜像名称(name)+标签(tag):如
nginx:latest。 - 认证能力:提供用户注册、登录、登出功能。
- 索引:提供镜像的索引信息,便于检索。
🦋 分类
镜像仓库(Container Image Registry)是容器技术生态中的核心基础设施,用于存储、分发和管理容器镜像。根据部署方式、访问范围、功能特性和使用场景,镜像仓库可以分为以下几类:
按部署方式分类
1. 公共镜像仓库(Public Registry)
- 特点:
- 面向全球用户开放
- 通常提供免费的基础镜像(如
nginx,redis,ubuntu) - 支持公开 Repository,部分支持私有 Repository(需付费)
- 典型代表:
- Docker Hub(
hub.docker.com):最主流的公共仓库 - GitHub Container Registry (GHCR):与 GitHub 深度集成
- Google Container Registry (GCR) / Artifact Registry
- Quay.io(Red Hat 旗下)
- Docker Hub(
- 适用场景:
开源项目、学习测试、分发通用基础镜像
优点:开箱即用,生态丰富
缺点:网络延迟(国内访问慢)、安全风险(依赖第三方镜像)
2. 私有镜像仓库(Private Registry)
- 特点:
- 部署在企业内部网络或私有云中
- 仅限授权用户/系统访问
- 可完全控制镜像内容、安全策略和生命周期
- 典型实现:
- Harbor(VMware 开源,支持 RBAC、漏洞扫描、镜像签名)
- Nexus Repository(Sonatype,支持多格式:Docker、Maven、npm 等)
- JFrog Artifactory
- GitLab Container Registry(与 GitLab CI/CD 深度集成)
- Docker Registry(官方轻量级实现,功能较基础)
- 适用场景:
企业内部应用、金融/政府等高安全要求场景、CI/CD 流水线
✅ 优点:高安全性、低延迟、合规可控
❌ 缺点:需自行部署维护、成本较高
按供应商和面向群体划分
- Sponsor Registry(赞助):供客户和 Docker 社区版使用。
- Mirror Registry(镜像):仅供客户使用,如阿里云需注册才能使用。
- Vendor Registry(供应商):由发布 Docker 镜像的供应商提供,如 Google 和 Redhat。
- Private Registry:仅供内部使用,无防火墙和额外安全层。许多大公司开发都有自己的私有仓库
按架构与托管方式分类
1. SaaS 托管型(Fully Managed)
- 由云厂商托管,用户无需管理底层
- 例如:
- AWS Elastic Container Registry (ECR)
- Azure Container Registry (ACR)
- Alibaba Cloud Container Registry (ACR)
- 优势:高可用、自动扩缩容、与云原生服务无缝集成(如 EKS、ACK)
2. 自建型(Self-hosted)
- 用户在自有服务器或虚拟机上部署 Registry
- 例如:Harbor on Kubernetes / VM
- 优势:完全自主可控,适合混合云/边缘场景
3. 按功能特性分类
| 类型 | 核心能力 | 代表产品 |
|---|---|---|
| 基础 Registry | 仅提供镜像存储与拉取 | Docker Registry |
| 企业级 Registry | RBAC、漏洞扫描、镜像签名、审计日志、Helm Chart 支持 | Harbor, Quay, Artifactory |
| 多格式仓库 | 同时支持 Docker 镜像、Maven、npm、PyPI 等 | Nexus, Artifactory |
| CI/CD 集成型 | 与代码仓库、流水线深度绑定 | GitLab Registry, GHCR |
4. 按网络位置分类(适用于混合云)
| 类型 | 说明 |
|---|---|
| 中心仓库 | 部署在数据中心或公有云,作为镜像“源头” |
| 边缘仓库 / 代理缓存 | 部署在分支机构或边缘节点,缓存中心仓库镜像,加速拉取(如 Harbor 的 Proxy Cache 功能) |
🌐 例如:总部用 Harbor 作为中心仓库,各地工厂部署 Harbor 代理缓存,避免每次从公有云拉取大镜像。
5. 国内特殊分类:镜像加速器 / 代理仓库
由于网络原因,国内常使用:
- 官方镜像加速器:
Docker Desktop 配置registry-mirrors(如阿里云、腾讯云提供的加速地址) - 私有代理仓库:
企业部署 Harbor 并配置为 Pull-through Cache,自动代理 Docker Hub 请求
⚠️ 注意:加速器不存储私有镜像,仅缓存公开镜像。
二:🔥 镜像仓库工作机制
镜像仓库(Image Registry)是用于存储和分发容器镜像(如 Docker 镜像)的服务。它的核心工作机制围绕镜像的上传(push)、存储、拉取(pull)和元数据管理展开。以下是其典型工作机制的简要说明:
镜像结构基础
- 容器镜像由多个 只读层(layers) 组成,每层代表文件系统的一个变更。镜像还包含一个 manifest(清单) 文件,描述了镜像的元数据(如架构、操作系统、各层的摘要等)。
- 例如,Docker 镜像的 manifest 可能是 OCI(Open Container Initiative)或 Docker v2 schema 格式。
1. 上传(Push)流程
当执行 docker push myrepo/myimage:tag 时:
- 客户端检查本地镜像的 manifest 和各层。
- 逐层上传:客户端向镜像仓库发起请求,先上传各层(仅上传尚未存在的层,支持去重)。
- 上传 manifest:所有层上传完成后,客户端上传 manifest,将其与 tag(如
latest)关联。 - 仓库将 manifest 与 tag 绑定,完成镜像注册。
镜像仓库通常使用内容寻址(content-addressable)机制:每层用其 SHA256 摘要(digest)标识,相同内容只存一份。
2. 拉取(Pull)流程
执行 docker pull myrepo/myimage:tag 时:
- 客户端向仓库请求对应 tag 的 manifest。
- 仓库返回 manifest,其中包含所需各层的摘要。
- 客户端根据摘要并行拉取各层(若本地已存在某层,则跳过)。
- 所有层下载完成后,客户端重组为完整镜像。
拉取机制:启动容器时,Docker 守护进程会尝试从本地获取镜像;若本地不存在,则从 Registry 下载并保存到本地。
存储机制
镜像仓库内部通常包含:
- Blob 存储:用于存原始层数据(如 tar.gz 文件),按 digest 存储。
- Manifest 存储:存储 JSON 格式的 manifest。
- Tag 映射:将 tag(如
v1.0)映射到 manifest digest。
常见后端存储包括本地文件系统、S3、Azure Blob、OSS 等。
优势
- 去重:相同层只存一次,节省空间。
- 高效分发:分层机制允许只下载变更层。
- 版本管理:通过 tag 和 digest 精确控制镜像版本。
实际研发中的使用:开发人员制作镜像并推送到公共或私有 Registry,供其他人员使用。

三:🔥 常用的镜像仓库
🦋 Docker Hub
功能:
- 注册私有仓库,发布镜像
- 提供镜像检索能力
- 提供官方和认证组织的镜像
- 支持从 GitHub 和 Bitbucket 自动构建并推送到 Docker Hub
- 支持 webhook
功能浏览:
- 镜像搜索
- 镜像 tag 查找
- 对应版本拉取命令
- 镜像大小、ID、CPU 架构查看
官网:https://hub.docker.com/
Docker Hub 使用,镜像搜索(输入: nginx),选择最前面的那个进入,结果如下:

tag 搜索如下:

🦋 国内镜像源
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器,因此国内很多云服务商都提供了国内镜像加速器服务,如下:
- 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) ->右侧镜像工具 ->镜像加速器->复制加速器地址)
- 网易云加速器地址 https://hub-mirror.c.163.com
- 百度云加速器地址"https://mirror.baidubce.com
配置方法:
-
编辑
/etc/docker/daemon.json文件,添加镜像加速器地址(如果文件不存在需要新建)Shell { # 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然后确保 json 的格式正确 "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] } -
重启 Docker 服务
# 加载配置 sudo systemctl daemon-reload # 重启 docker sudo systemctl restart docker #查看 docker 状态 sudo systemctl status docker
🦋 私有仓库
私有镜像仓库定义:指部署在公司或组织内部,用于自身应用 Docker 镜像存储、分发的镜像仓库。
- 在构建公司内部使用的自动化发布系统的过程中,从安全的角度出发,应用的打包镜像一般情况下只会被存储在私有镜像仓库中,CI/CD 流程的衔接点也是通过向私有镜像仓库上传镜像和拉取镜像的操作来完成的。
常见的私有仓库:
- Harbor:VMware 开源的企业级 Docker Registry,提供管理 UI、RBAC、AD/LDAP 集成、审计日志等功能。
- Nexus:Sonatype 发布的仓库管理软件,常用于 Maven 和 Docker 私服。
Docker Registry:Docker 官方提供的私有仓库,类似于 Docker Hub。(Docker 公司已基本停止更新,交由开源社区维护)
四:🔥 相关命令
相关命令我们可以在 https://docs.docker.com/reference/cli/docker/ 这里查看具体用法,或者通过
docker 命令 --help也可以
🦋 命令清单
docker login:登录仓库docker pull:拉取镜像docker push:推送镜像docker search:查找镜像docker logout:登出仓库
具体使用
① docker login:
- 功能:登录到 Docker 镜像仓库
- 语法:
docker login [OPTIONS] [SERVER] - 样例:
docker login -u 用户名 -p 密码
这里登录的用户名和密码是需要我们在 Docker Hub 上登录注册,密码就是用户注册的密码,如下:

dockerhub 被 ban 了 …
② docker pull:
- 功能:拉取或更新指定镜像
- 语法:
docker pull [OPTIONS] NAME[:TAG|@DIGEST] - 样例:
docker pull nginx:1.23.3
方式一:pull nginx:版本

方式二:pull nginx@DIGEST

直接拉取
hello-world,可以看到其最终其实是拉取了docker.io/library/hello-world:latest,前面的一长串是官方仓库的地址,而:latest表示默认使用了最新版。

③ docker push:
- 功能:上传本地镜像到仓库
- 语法:
docker push [OPTIONS] NAME[:TAG] - 样例:
docker push myapache:v1
关键参数
-a:拉取所有 tagged 镜像--disable-content-trust:忽略镜像的校验,默认开启
④ docker search:
- 功能:从 Docker Hub 查找镜像
- 语法:
docker search [OPTIONS] TERM - 样例:
docker search -f stars=10 nginx
⑤ docker logout:
- 功能:登出 Docker 镜像仓库
- 语法:
docker logout [SERVER] - 样例:
docker logout
🦋 镜像命令(部分)
2.1 docker images:
- 功能:列出本地镜像
- 语法:
docker images [OPTIONS] [REPOSITORY[:TAG]] - 关键参数
-a:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);–digests :显示镜像的摘要信息-f:显示满足条件的镜像,- -
-format:指定返回值的模板文件; --no-trunc:显示完整的镜像信息-q:只显示镜像 ID
① 查看所有镜像

② 查看具体的镜像
docker images nginx

③ 查看具体版本的镜像

④ 查看符合条件的所有镜像

⑤ 显示出镜像的摘要信息

⑥ 查看对应镜像对应版本之前的镜像

⑦ 返回符合条件镜像的json格式

⑧ 同样也可以是表格模式

⑨ 不将我们的ID信息进行截断

⑩ 只显示镜像 ID
docker image list -q

找到对应的镜像
docker image list |grep nginx

找到一个具体的版本
docker image list |grep nginx |grep 1.22.1

2.2 docker image inspect:
- 功能:查看镜像详细信息
- 语法:
docker image inspect [OPTIONS] IMAGE [IMAGE...] - 样例:
docker image inspect nginx:1.23.3

2.3 docker tag:
- 功能:标记本地镜像,归入某一仓库
- 语法:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] - 样例:
docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04

最后结果虽然还是超时了,因为 上网 的问题,但是最后结果就是这个镜像被放到 库里面了,这样后面只要拉取这个库就行
🦋 容器命令(部分)
① docker run:
- 功能:创建并运行新容器
- 语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
别名:docker container run
关键参数:
-d:后台运行容器,并返回容器 ID;-i:以交互模式运行容器,通常与 -t 同时使用;-P:随机端口映射,容器内部端口随机映射到主机的端口-p:指定端口映射,格式为 主机(宿主)端口:容器端口-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;--name="nginx-lb":为容器指定一个名称;-h "mars":指定容器的 hostname;-e username="ritchie":设置环境变量;--cpuset-cpus="0-2" 或 --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;-m:设置容器使用内存最大值;--network="bridge":指定容器的网络连接类型;--link=[]:添加链接到另一个容器;--volume, -v: 绑定一个卷--rm:shell 退出的时候自动删除容器
示例
# 使用 docker 镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为 mynginx。
docker run --name mynginx -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
② docker ps
- 功能:列出容器
- 语法:
docker ps [OPTIONS]
别名
docker container ls, docker container list, docker container ps
关键参数:
-a: 显示所有的容器,包括未运行的。-f: 根据条件过滤显示的内容。--format: 指定返回值的模板文件。如 json 或者 table-l: 显示最新的容器。-n: 列出最近创建的 n 个容器。--no-trunc: 不截断输出。-q: 静默模式,只显示容器编号。-s: 显示总的文件大小。
示例

- 第一列是容器的ID
- 第二列是镜像的名称
- 第三列是镜像的启动命令或者是我们指定的启动命令
- 第四列是创建时间
- 第五列是状态
- 第六列是端口信息
- 第七列是名称
加上-a 参数将我们退出的参数都加进来:docker ps -a

-f 选项就是根据条件进行过滤,我们这里是根据名称进行过滤操作:docker ps -f name=mynginx4

我们让返回值的类型是 json模式:docker ps --format json

显示最近的一个容器:docker ps -l

显示最近的n个容器:docker ps -n
不截断进行输出操作:docker ps --no-trunc

我们的ID本来是一个短ID的,但是我们这里是不截断的进行输出操作
docker ps -q
docker ps -a -q
只显示容器ID

将文件大小显示出来:docker ps -s

五:🔥 docker 镜像仓库实战
🦋 搭建一个 Nginx 服务
基础知识
Web 服务器
- Web 服务器,一般是指“网站服务器”,是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。
- Web 服务器,也称为“WWW 服务器”(英文全写:World Wide Web,翻译成中文:万维网或环球信息网),主要功能是“提供网上信息浏览服务”。
- WWW 是 Internet(互联网)的多媒体信息查询工具,是 Internet(互联网)上发展起来的服务,也是发展最快和目前使用最广泛的服务。例如百度就是一个 Web 服务器,提供搜索服务。
Nginx
- Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。
- 可以理解 Nginx 是 Web 服务器的一种实现。
- Nginx 作为 Web 服务器可以向各种浏览器等客户端提供浏览服务,比如我们通过手机、电脑、平板可以访问百度来实现对 Web 服务器的访问。

正向代理:由于防火墙的原因,我们不能直接访问谷歌,那么我们可以借助 VPN 来实现,这就是一个简单的正向代理的例子。

这里能够发现,正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过 VPN 访问的。例如我们平时使用的 steam 游戏加速器
反向代理:当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。

安装启动 Nginx
① 更新安装
sudo apt update
sudo apt install nginx -y
② 查看nginx是否启动了

③ 如果没有启动,则需要手动启动,如下:
查看nginx的版本
lighthouse@VM-8-10-ubuntu:~$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
lighthouse@VM-8-10-ubuntu:~$ /usr/sbin/nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
如果你搜不到你的版本,估计是你的nginx位置没有在环境变量中,先找到nginx的位置

如果和我不一样的话,可以将这个位置加入到环境变量中,并且想要这个设置永久生效,可以把它加入 .bashrc 或 .bash_profile:
echo 'export PATH=$PATH:/usr/sbin' >> ~/.bashrc
source ~/.bashrc
启动,相关命令如下:
lighthouse@VM-8-10-ubuntu:~$ sudo systemctl stop nginx # 停止
lighthouse@VM-8-10-ubuntu:~$ ps -ef | grep nginx
lightho+ 12998 4064099 0 21:42 pts/1 00:00:00 grep --color=auto nginx
lighthouse@VM-8-10-ubuntu:~$ sudo systemctl restart nginx # 重启
效果如下:

🦋 查看 Nginx 镜像
启动并查看首页内容
Docker search 可以查找,但是 nginx 的详细的 tag 我们看不见
① 拉取 Nginx 镜像
docker pull nginx:1.23.4
备注:可以到 https://hub.docker.com/ 上找到 Nginx 镜像
② 查看是否拉取到本地了
docker images nginx

③ 查看镜像的详细信息
docker image inspect nginx:1.23.4

- 通过这个详细信息可以发现这里暴露了一个80端口
④ 启动镜像
方式一:前台运行
docker run -p 8090:80 --name myweb1 -h myweb1.com -e myenv=test nginx:1.23.4

方式二:后台运行(多了 -d)
docker run -p 8090:80 --name myweb1 -h myweb1.com -e myenv=test -d nginx:1.23.4
加上 it 参数进行一个可交互的界面
docker run -p 8090:80 --name myweb2 -h myweb1.com -e myenv=test -it nginx:1.23.4 bash

- nginx 启动
修改首页
① 先进入 index.html 所在目录,如下:

② 修改里面内容

③ 结果如下:
④ 退出
exit
判断 Nginx 所在
① 查看本地镜像:docker images

② 运行镜像(这个 80:80,前面的 80 是宿主机端口,必须是 80,因此在做这个验证之前,记得关闭宿主机的 Nginx)
docker run --name nginx1 --rm -it -p 80:80 nginx:1.23.4 bash

③ 查看我们现在是否是在容器的 shell 里面,执行 cat /etc/*release* 查看操作系统

④ 查看 Nginx 欢迎信息
首先先输入:nginx 启动,然后 在另一个 shell 窗口中执行如下 curl 命令,可以看到 Nginx 的欢迎信息返回

如果你的服务器的 80 端口外部能访问,那么可以用浏览器看到 Nginx 的欢迎页面。注意云厂商一般都屏蔽了 80 端口,需要联系客服开通。
退出 shell 观察再 curl 发现我们已经 ping 不通了,说明 Nginx 是容器里面的而不是服务器里面的
常见报错
① 地址冲突
docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint myweb1 (745d779e82dc5df7d4020273c022d64577cb976c7d2ab9aa1c7a94cc4c69b809): failed to bind host port for 0.0.0.0:80:172.17.0.2:80/tcp: address already in use
原有:宿主机之前启动了,所以端口被占用,如下:(我采用的方法是停掉宿主机,不大靠谱,不建议这种)

解决如下:(修改映射端口,推荐)
docker run -p 8090:80 --name myweb5 -h myweb1.com -e myenv=test -it nginx:1.23.4 bash
② 命名冲突
docker: Error response from daemon: Conflict. The container name "/myweb1" is already in use by container "d584f3f3cdd6db61891560ff34f7284f9025c2f21338dc957264b578de0da248". You have to remove (or rename) that container to be able to reuse that name.
解决方法:
# 删除原有名字, 然后再启动
docker rm -f myweb1
# 修改映射名字
docker run -p 8090:80 --name myweb2 -h myweb1.com -e myenv=test -it nginx:1.23.4 bash
🦋 Docker Hub 创建自己私有仓库
Busybox概述
BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。
- 它包含了一些简单的工具,例如 ls、cat 和 echo 等,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet。
- BusyBox 是一个集成了一百多个最常用 Linux 命令和工具的软件,它甚至还集成了一个 HTTP 服务器和一个 Telnet 服务器,而所有这一切功能却只有区区 1M 左右的大小。因海外带宽较小,我们拉取该镜像推送到自己的仓库。
Ubuntu 安装 Busybox
安装命令
sudo apt update
sudo apt install -y busybox
执行命令,查看相关信息
busybox ls
busybox ifconfig
busybox ifconfig | busybox grep lo

在docker hub上创建仓库
第一步:创建仓库
- 进入 Docker Hub,访问 https://hub.docker.com/,点击注册按钮,输入注册信息。
- 创建仓库
- 登录后点击仓库,创建一个个人仓库。
- 如果提示需要进入,进入自己的邮箱完成激活。
- 输入仓库信息,选择可见性(公开或私有),点击创建完成。

创建之后可以 看到相关的信息

第二步:在本地拉取一个busybox(在 hub docker 上搜一个合适版本,进行拉取)
docker pull busybox:1.35.0

第三步: 先将我们的镜像进行标签的修改
docker tag busybox:1.35.0 island/mybusyboxby:v1.0
第四步:执行推送命令
docker push island/mybusyboxby:v1.0

结果如下:

补充:如果你推送失败了,你先登出当前的账号进行重新登录操作即可
docker login
腾讯云创建自己的私有仓库

点击镜像仓库,初始化你的密码,然后我们就可以进行新建仓库了
创建一个命名空间

然后进行仓库的创建

创建后这里会有一个快捷指令


我们先查看下本地的busybox
docker images busybox
登录腾讯云容器镜像服务 Docker Registry


docker login ccr.ccs.tencentyun.com --username=100038760726
向 Registry 中推送镜像
针对指定的镜像打tag
docker tag busybox:1.36.0 ccr.ccs.tencentyun.com/undoom/busybox:v1.0
推送操作
docker push ccr.ccs.tencentyun.com/undoom/busybox:[tag]

从 Registry 拉取镜像
docker pull ccr.ccs.tencentyun.com/undoom/busybox:[tag]
登录镜像仓库
docker logout ccr.ccs.tencentyun.com
六:🔥 共勉
😋 以上就是我对 【Docker#4】Docker Registry 镜像仓库 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)