Docker Hub 是什么?详细介绍 – wiki基地


Docker 生态系统的基石:深入理解 Docker Hub

在现代软件开发和运维领域,容器化技术以其轻量、可移植和一致性的特点,已经成为事实上的标准。而在这场容器化革命中,Docker 无疑是影响力最大、用户群体最广泛的平台之一。Docker 的核心在于其镜像(Image)的概念——一个轻量级、独立的可执行软件包,包含运行应用所需的一切:代码、运行时、库、环境变量和配置文件。

但有了镜像之后,如何分享、分发和管理这些镜像呢?这就是 Docker Hub 扮演的关键角色。对于许多初学或正在使用 Docker 的人来说,Docker Hub 只是一个用于 docker pull 命令下载镜像的地方。然而,Docker Hub 远不止一个简单的下载站点,它是 Docker 生态系统中不可或缺的核心组件,一个强大的云服务平台,集成了镜像的存储、分发、管理、构建和协作等多种功能。

本文将带领你深入探索 Docker Hub 的世界,从它是什么、为什么重要,到它的核心功能、使用方法、不同类型的镜像以及在现代软件开发流程中的作用,力求为你呈现一个全面而详细的 Docker Hub 画像。

一、 Docker Hub 是什么?核心概念解析

简单来说,Docker Hub 是 Docker 公司提供的一个基于云服务的 Registry(注册中心)

要理解 Docker Hub,首先需要理解 Docker 中的几个核心概念:

  1. Docker Image(Docker 镜像):这是一个静态的、只读的模板,包含了运行应用程序所需的所有文件、依赖和配置。镜像可以看作是容器的“蓝图”。例如,一个 Node.js 镜像可能包含了 Node.js 运行时、npm 包管理器以及你的应用程序代码。
  2. Docker Container(Docker 容器):镜像的运行实例。容器是动态的、可写的,它基于镜像启动,提供了一个隔离的环境来运行你的应用程序。
  3. Docker Registry(Docker 注册中心):一个集中存储和分发 Docker 镜像的服务。注册中心就像一个仓库,里面存放着各种各样的 Docker 镜像。当你想运行一个应用程序时,Docker 客户端(通过 docker 命令)会去注册中心查找并下载对应的镜像。

Docker Hub 正是 Docker 公司官方提供的、全球最大、最常用的公共 Docker 注册中心。 它是 Docker 用户的默认注册中心。当你执行 docker pull ubuntu 命令时,Docker 客户端默认就会去 Docker Hub 上查找并下载 ubuntu 镜像。

可以将 Docker Hub 类比为:

  • 智能手机的应用商店 (App Store / Google Play):开发者上传他们的应用(镜像),用户可以搜索、下载和安装应用(拉取镜像)。
  • 一个巨大的公共仓库或图书馆:里面存放着无数种软件的打包版本(镜像),任何人都可以来这里找到他们需要的软件并“借走”使用(拉取镜像)。

除了作为公共注册中心的角色,Docker Hub 还提供了额外的功能,使其成为一个功能强大的平台,而不仅仅是一个简单的文件存储服务。

二、 为什么 Docker Hub 如此重要?

Docker Hub 的重要性体现在以下几个方面:

  1. 镜像共享与分发中心: 这是 Docker Hub 最基础也是最重要的功能。它提供了一个便捷的方式,让个人、团队甚至整个社区能够分享他们构建的 Docker 镜像。开发者可以将自己打包好的应用程序镜像推送到 Docker Hub,其他人就可以轻松地拉取并运行它,极大地促进了软件的复用和分发。
  2. 加速开发与部署: 通过使用 Docker Hub 上现有的基础镜像(如操作系统的镜像 ubuntu, centos,编程语言环境镜像 node, python, java,数据库镜像 mysql, postgres 等),开发者无需从零开始构建环境,可以直接在这些基础镜像之上添加自己的应用代码和配置,显著提高了开发效率。
  3. 确保环境一致性: Docker 镜像的核心优势在于其一致性。通过从 Docker Hub 拉取同一个镜像,无论在开发、测试还是生产环境,都能确保运行环境完全相同,避免了“在我机器上可以运行”的问题。Docker Hub 作为这些一致性镜像的源头,起到了关键作用。
  4. 社区协作与生态建设: Docker Hub 是一个庞大的社区平台。数百万计的用户和组织在上面分享他们的镜像,形成了丰富的 Docker 生态系统。用户可以通过点赞(Stars)、下载量(Pulls)等指标了解镜像的受欢迎程度和使用情况。
  5. 提供自动化构建能力: Docker Hub 可以与 GitHub, GitLab, Bitbucket 等代码托管平台集成,实现镜像的自动化构建。每当代码仓库中的 Dockerfile 发生变化或有新的提交时,Docker Hub 可以自动触发镜像的构建过程,并将最新构建的镜像推送到对应的仓库,这对于持续集成/持续部署 (CI/CD) 流程至关重要。
  6. 安全与信任机制: 通过官方镜像(Official Images)和认证镜像(Certified Images)体系,Docker Hub 为用户提供了相对更安全、更可信的基础镜像来源。同时,Docker Hub 也提供了安全扫描等功能,帮助用户识别镜像中的潜在漏洞。
  7. 私有镜像管理: 除了公共仓库,Docker Hub 也提供私有仓库功能。组织和个人可以将包含敏感信息或专有代码的镜像存储在私有仓库中,并对访问进行控制,确保只有授权用户才能拉取和使用。

可以说,没有 Docker Hub 这样高效、便捷的镜像分发和管理平台,Docker 的普及和成功将大打折扣。它是连接镜像生产者和消费者的桥梁,是Docker生态系统蓬勃发展的基础。

三、 Docker Hub 的核心功能与组成部分详解

Docker Hub 不仅仅是一个简单的存储库,它提供了丰富的功能来支持镜像的生命周期管理和团队协作。以下是其主要组成部分和功能:

  1. 镜像仓库 (Image Repositories):

    • 这是 Docker Hub 中存储镜像的基本单元。每个仓库可以包含同一个镜像的不同版本,通过 标签 (Tag) 来区分。
    • 仓库通常以 [用户或组织名]/[仓库名] 的形式命名,例如 ubuntu (官方镜像,省略了组织名),library/ubuntu (完整的官方库路径), myuser/mywebapp
    • 公共仓库 (Public Repositories): 任何人都可以搜索、查看和拉取这些仓库中的镜像。
    • 私有仓库 (Private Repositories): 只有仓库的创建者、所属组织的成员或被授权的用户才能拉取这些镜像。私有仓库对于存储企业内部应用、包含敏感数据的镜像或处于开发阶段的镜像至关重要。免费用户通常有一个或少数几个私有仓库的限制,付费计划则提供更多。
  2. 标签 (Tags):

    • 标签用于标识同一仓库中不同版本的镜像。例如,ubuntu:latest, ubuntu:20.04, ubuntu:22.04 分别代表 Ubuntu 镜像的不同版本。
    • latest 是一个特殊的默认标签,通常指向最新构建或最新稳定版本的镜像。然而,在生产环境中,强烈推荐使用具体的版本标签,而不是依赖 latest,以确保部署的可重复性和稳定性。
    • 创建镜像时,你可以使用 docker tag 命令为镜像打上多个标签,并在推送时指定标签。
  3. 自动化构建 (Automated Builds):

    • 这是 Docker Hub 最受欢迎的功能之一,它连接到 GitHub, GitLab, Bitbucket 等 Git 代码仓库。
    • 用户指定代码仓库中的一个 Dockerfile(或其他构建源,如 buildpack)。
    • 当指定分支或标签发生代码提交时,Docker Hub 会自动从 Git 仓库拉取最新的代码,并在其构建环境中执行 Dockerfile 指令来构建镜像。
    • 构建成功后,Docker Hub 会自动将新生成的镜像推送到对应的 Docker Hub 仓库中,并根据配置打上相应的标签。
    • 优势: 确保构建过程的一致性、自动化更新镜像、提高透明度(Dockerfile 是公开的)、简化 CI/CD 流程。
    • 设置: 可以配置不同的构建规则,例如监听特定分支(如 main/master 分支自动构建并打 latest 标签),或监听特定的 Git 标签(如 v1.0 标签触发构建并打 v1.0 标签)。
  4. Webhooks:

    • Webhooks 允许你在 Docker Hub 仓库发生特定事件(例如,自动化构建完成或新镜像被推送到仓库)时,触发外部服务的动作。
    • 例如,你可以设置一个 Webhook,当新的应用镜像推送到 Docker Hub 后,自动触发一个部署服务(如 Kubernetes, Swarm, Jenkins 等)来拉取最新镜像并更新运行中的应用。
    • 这进一步增强了 Docker Hub 在 CI/CD 流程中的自动化能力。
  5. 组织与团队 (Organizations and Teams):

    • 对于企业或团队用户,Docker Hub 提供了组织功能。一个组织可以拥有多个仓库。
    • 在组织内部,可以创建团队,并为不同的团队分配对组织内仓库的不同访问权限(如只读、读写、管理员)。
    • 这方便了团队成员之间的协作,集中管理镜像资源,并提供了权限控制,尤其对于私有仓库的管理非常重要。
  6. 安全扫描 (Security Scanning / Docker Scout):

    • Docker Hub 集成了安全扫描功能(通过 Docker Scout)。它可以分析镜像中的层,识别其中包含的软件包,并检查已知漏洞(CVEs)。
    • 扫描结果会显示漏洞的严重程度,帮助用户评估镜像的风险。
    • 虽然扫描并不能完全保证镜像的安全,但它提供了重要的风险评估信息,鼓励用户使用更安全、更少漏洞的基础镜像,并及时更新修复漏洞。
  7. 官方镜像 (Official Images):

    • 这是一组由 Docker 官方或其信赖的第三方维护的、高质量、经过良好文档记录和频繁更新的镜像。
    • 它们通常是基础操作系统(如 Alpine, Ubuntu, Debian)、流行编程语言运行时(如 Python, Node.js, Go, Java)、数据库(如 MySQL, PostgreSQL, MongoDB)和 Web 服务器(如 Nginx, Apache)等。
    • 使用官方镜像作为基础,可以大大提高你构建的镜像的可靠性和安全性。它们通常位于 Docker Hub 的 library 命名空间下,但拉取时可以省略 library/,例如 docker pull ubuntu 等同于 docker pull library/ubuntu
  8. 认证镜像 (Certified Images):

    • 这些镜像由经过 Docker 认证的商业软件供应商提供。它们是企业级软件的官方容器化版本,经过供应商和 Docker 的测试和认证,通常提供额外的支持和维护。
    • 例如,一些商业数据库、中间件或安全软件会提供认证镜像。它们通常可以在 Docker Hub 的 Marketplace 中找到。
  9. 社区镜像 (Community Images):

    • 除了官方和认证镜像,绝大多数 Docker Hub 上的镜像都是由个人和组织创建和分享的社区镜像。
    • 社区镜像种类繁多,覆盖了各种应用和服务。使用社区镜像时需要谨慎,建议查看其来源(Dockerfile 是否公开)、流行程度(Stars 和 Pulls)、更新频率以及其他用户的评论,以评估其可靠性和安全性。
  10. 用户个人资料与活动 (User Profiles and Activity):

    • 每个用户都有一个个人资料页面,显示其公开的仓库、Starred 的仓库以及一些活动信息。
    • 仓库页面会显示仓库的描述、Dockerfile(如果使用自动化构建)、标签列表、构建状态、下载量、星标数、安全扫描结果等信息。
  11. 搜索功能 (Search):

    • Docker Hub 提供了强大的搜索功能,用户可以通过关键词搜索公共镜像仓库。
    • 可以通过 Web 界面或命令行 (docker search) 进行搜索。搜索结果会显示仓库名、描述、星标数、官方/自动构建标记等信息,帮助用户快速找到所需的镜像。

这些功能共同构成了 Docker Hub,使其成为一个集镜像存储、分发、自动化、协作和安全于一体的综合性平台。

四、 如何使用 Docker Hub?基本操作指南

使用 Docker Hub 主要涉及以下几个步骤:

  1. 注册与登录:

    • 访问 Docker Hub 网站 (hub.docker.com) 并注册一个免费账户。
    • 在本地命令行中,使用 docker login 命令登录你的 Docker Hub 账户。系统会提示你输入用户名和密码。
      bash
      docker login

      登录成功后,你的凭据通常会被存储在本地配置文件中(例如 ~/.docker/config.json),以便后续操作。
  2. 搜索镜像:

    • 通过网站: 直接在 Docker Hub 网站的搜索框中输入关键词进行搜索。
    • 通过命令行: 使用 docker search 命令。
      bash
      docker search ubuntu

      这将列出所有名称或描述中包含 “ubuntu” 的公共镜像仓库,并显示其星标数、是否官方等信息。
  3. 拉取镜像 (Pulling Images):

    • 使用 docker pull 命令从 Docker Hub 下载镜像到本地。
    • 拉取官方镜像(无需用户/组织名前缀):
      bash
      docker pull ubuntu # 拉取 ubuntu:latest 镜像
      docker pull ubuntu:22.04 # 拉取 ubuntu 22.04 版本镜像
    • 拉取特定用户或组织的镜像:
      bash
      docker pull myuser/mywebapp # 拉取 myuser 用户下的 mywebapp:latest 镜像
      docker pull myuser/mywebapp:v1.0 # 拉取 myuser 用户下的 mywebapp v1.0 版本镜像

      如果未指定标签,默认会拉取 latest 标签的镜像。
  4. 构建镜像 (Building Images):

    • 你可以在本地编写 Dockerfile,然后使用 docker build 命令构建自己的镜像。
      “`bash

    假设你在当前目录有一个名为 Dockerfile 的文件

    docker build -t myuser/mywebapp:v1.0 .
    ``
    这里的
    -t选项用于给构建的镜像打标签。标签格式通常是[用户名]/[仓库名]:[标签]`。如果你打算将镜像推送到 Docker Hub,这个标签格式必须与你的 Docker Hub 用户名或组织名匹配。

  5. 标记镜像 (Tagging Images):

    • 如果你已经有一个本地镜像,但它的标签不符合 Docker Hub 的命名规范(例如,你构建时只用了 mywebapp:v1.0),或者你想给同一个镜像打多个标签,可以使用 docker tag 命令。
      “`bash

    将本地镜像 mywebapp:v1.0 标记为 myuser/mywebapp:v1.0

    docker tag mywebapp:v1.0 myuser/mywebapp:v1.0

    给同一个本地镜像再打一个 latest 标签

    docker tag mywebapp:v1.0 myuser/mywebapp:latest
    ``docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]`

  6. 推送镜像 (Pushing Images):

    • 构建或标记好符合 Docker Hub 命名规范的镜像后,使用 docker push 命令将其上传到你的 Docker Hub 仓库。
    • 推送公共仓库:
      bash
      docker push myuser/mywebapp:v1.0
      docker push myuser/mywebapp:latest

      如果 myuser/mywebapp 仓库是公共的,其他人就可以拉取这些镜像了。
    • 推送私有仓库: 如果你想推送到一个私有仓库,确保该仓库在 Docker Hub 上已经被设置为私有。推送命令是一样的,但只有授权用户才能拉取。
  7. 管理仓库 (Managing Repositories):

    • 通过 Docker Hub 网站界面,你可以创建新仓库(选择公共或私有)、查看仓库信息、管理标签、设置自动化构建、配置 Webhooks、邀请协作者等。
    • 对于组织用户,还可以管理组织成员、团队和权限。

五、 Docker Hub 在 CI/CD 流程中的作用

Docker Hub 在现代持续集成/持续部署 (CI/CD) 流程中扮演着至关重要的角色。它通常位于构建阶段和部署阶段之间,充当两者之间的桥梁。

典型的 CI/CD 流程中 Docker Hub 的参与方式:

  1. 代码提交: 开发者向代码仓库 (如 GitHub, GitLab) 提交代码。
  2. 持续集成 (CI) 服务器触发: CI 服务器 (如 Jenkins, GitLab CI, GitHub Actions) 检测到代码提交,触发构建流程。
  3. 构建 Docker 镜像: CI 服务器拉取最新代码,并执行 docker build 命令,根据 Dockerfile 构建新的应用程序镜像。
  4. 测试镜像: 构建的镜像可以在 CI 服务器上进行自动化测试(单元测试、集成测试等)。
  5. 标记并推送镜像到 Docker Hub: 如果测试通过,CI 服务器会使用 docker tag 命令为构建好的镜像打上一个具有唯一性的标签(通常包含 Commit ID 或版本号),然后使用 docker push 命令将其推送到 Docker Hub 上的特定仓库(通常是私有仓库)。这里的 Docker Hub 充当了经过测试和验证的应用程序构建物(镜像)的中央存储库。
  6. (可选)Docker Hub 自动化构建: 如果配置了 Docker Hub 自动化构建,步骤 3-5 的部分或全部可以由 Docker Hub 完成。代码提交后,Docker Hub 自动拉取代码、构建镜像、标记并存储。
  7. 持续部署 (CD) 服务器触发:
    • 可以配置 Docker Hub 的 Webhook,当新镜像成功推送到仓库后,触发 CD 服务器的部署流程。
    • 或者,CD 服务器可以定期检查 Docker Hub 仓库,或者由 CI 流程显式通知。
  8. 部署应用: CD 服务器 (如 Kubernetes, Docker Swarm, 或其他部署脚本) 从 Docker Hub 拉取最新版本的应用程序镜像 (docker pull)。
  9. 更新运行中的应用: CD 服务器使用新拉取的镜像来更新集群中运行的应用容器,实现零停机或滚动更新部署。

在这个流程中,Docker Hub 作为存放“可部署单元”(Docker 镜像)的中心枢纽,确保了:

  • 构建与部署的分离: 构建环境和部署环境解耦,部署只关心从 Docker Hub 拉取哪个标签的镜像。
  • 版本控制: Docker Hub 的标签系统提供了对应用版本的清晰管理和回溯能力。
  • 环境一致性: 无论在哪里部署,使用的都是从同一个 Docker Hub 仓库拉取的同一个标签的镜像,保证了环境的一致性。
  • 高效分发: Docker Hub 针对镜像分发进行了优化。

六、 Docker Hub 的不同订阅计划与限制

Docker Hub 提供了不同的订阅计划,以满足个人用户、小型团队和大型企业的不同需求。这些计划主要在以下方面有所区别:

  • 私有仓库数量: 免费计划通常只有有限的私有仓库数量(例如,1 个),而付费计划提供更多或无限量的私有仓库。
  • 自动化构建并发数: 付费计划通常允许更多的自动化构建任务同时运行。
  • 团队与组织功能: 更高级的计划提供更完善的组织、团队和权限管理功能。
  • 安全扫描: 高级计划通常包含更全面或更高频率的镜像安全扫描。
  • 拉取速率限制 (Pull Rate Limits): 这是 Docker Hub 近年引入的一项重要限制,尤其影响免费用户和匿名用户。
    • 匿名用户: 每 6 小时有一定数量的拉取请求限制(例如,目前是 100 次)。
    • 免费用户 (已登录): 每 6 小时有更高的拉取请求限制(例如,目前是 200 次)。
    • 付费用户: 拉取速率限制会大大提高甚至取消限制,具体取决于计划。

这些限制可能会影响到 CI/CD 流程或大规模部署,因此对于企业用户来说,升级到付费计划或考虑使用私有注册中心(如 Docker Trusted Registry 或云服务商提供的注册中心)是常见的选择。你可以通过 docker info 命令或 API 查询当前的拉取速率限制使用情况。

七、 Docker Hub vs. 其他镜像注册中心

虽然 Docker Hub 是最流行和默认的公共注册中心,但市面上也存在许多其他的 Docker Registry 解决方案:

  1. 云服务商提供的注册中心:

    • Amazon Elastic Container Registry (ECR)
    • Google Container Registry (GCR) / Google Artifact Registry
    • Azure Container Registry (ACR)
    • 阿里云容器镜像服务 (ACR)
    • 腾讯云容器镜像服务 (CCR) 等。
      这些服务通常与各自的云平台深度集成,提供高性能、高可用、安全且付费按量计费的私有镜像存储和分发服务。它们是许多企业在特定云上部署应用时的首选私有注册中心。
  2. 自建注册中心:

    • Docker Registry (开源): Docker 公司提供了开源的 Registry 项目,用户可以在自己的服务器上搭建私有的、基本的注册中心。
    • Harbor: 一个流行的开源企业级 Registry 项目,提供了身份认证、访问控制、安全扫描、镜像复制等更丰富的功能。
  3. 集成到代码托管平台的注册中心:

    • GitLab Container Registry: GitLab 集成了容器镜像注册中心功能,可以直接与 GitLab CI/CD 集成。

何时选择 Docker Hub?

  • 需要查找和使用大量的公共开源镜像。
  • 分享自己的开源项目镜像给社区。
  • 个人开发者或小型团队,需要少量私有仓库和自动化构建功能(免费计划或基本付费计划即可满足)。
  • 作为学习和入门 Docker 的首选平台。

何时选择其他注册中心?

  • 企业需要存储大量敏感或专有代码的私有镜像,对安全性、稳定性和性能有更高要求。
  • 已经在特定的云平台上构建基础设施,使用云服务商的注册中心可以获得更好的集成、性能和成本效益。
  • 需要更高级的注册中心功能,如漏洞扫描策略强制、镜像复制、精细的访问控制等(Harbor 或 Docker Trusted Registry)。
  • 受 Docker Hub 拉取速率限制的影响,需要更高配额。

尽管存在这些替代方案,但 Docker Hub 凭借其庞大的公共镜像库、用户基础和便利性,仍然是Docker生态系统中最核心、最常用的注册中心,尤其是在公共镜像的发现和使用方面无可匹敌。

八、 使用 Docker Hub 的最佳实践

为了更高效、安全地使用 Docker Hub,以下是一些建议的最佳实践:

  1. 始终使用具体的标签,避免 latest: latest 标签是不稳定的,它可能随时指向一个更新的版本。在生产环境或任何需要稳定性的场景下,务必使用如 v1.0.0 或包含 Commit Hash 的具体标签,确保每次部署都使用完全相同的镜像版本。
  2. 选择可信的基础镜像: 优先使用 Docker 官方镜像(Official Images)或经过认证的镜像(Certified Images)作为你应用的基石。它们通常更稳定、更新及时,并经过更严格的安全审查。
  3. 保持镜像精简: 使用更小的基础镜像(如 Alpine),在 Dockerfile 中只安装必要的软件和依赖,利用多阶段构建(Multi-Stage Builds)减小最终镜像的体积。这不仅加快拉取速度,也减少了攻击面。
  4. 利用自动化构建: 配置自动化构建可以确保你的镜像始终与代码仓库同步,简化更新流程,并提高构建过程的透明度(Dockerfile 是公开的)。
  5. 定期进行安全扫描: 利用 Docker Hub 的安全扫描功能,或者结合第三方扫描工具,定期检查你的镜像是否存在已知漏洞,并及时更新基础镜像或修复代码。
  6. 为公共仓库编写清晰的 README: 如果你的镜像仓库是公共的,提供一个详细的 README 文件,说明镜像的用途、如何使用、包含哪些组件、版本信息以及构建来源(如果是自动化构建),这将极大地帮助其他用户。
  7. 谨慎使用社区镜像: 在使用非官方或非认证的社区镜像时,务必进行评估。查看其 Dockerfile(如果公开)、构建过程、更新频率、星标数和用户评论。对于关键应用,最好基于可信的基础镜像自己构建。
  8. 管理好私有仓库权限: 如果使用私有仓库,合理设置组织、团队和成员的权限,确保只有授权人员才能访问和修改镜像。
  9. 关注拉取速率限制: 如果是免费用户或匿名用户,了解拉取速率限制,并在自动化脚本或大量部署场景中考虑其影响,必要时升级计划或使用私有注册中心。

九、 总结:Docker Hub 的价值与地位

总而言之,Docker Hub 是 Docker 生态系统中一个极其核心且富有价值的组成部分。它不仅是一个巨大的公共镜像仓库,更是连接开发者、运维人员和整个 Docker 社区的枢纽。

从提供海量可复用的基础和应用镜像,到支持镜像的自动化构建、安全扫描和团队协作,Docker Hub 极大地简化了基于 Docker 的应用程序的构建、分发和部署过程。它是许多 CI/CD 流程中不可或缺的一环,为实现持续交付和环境一致性提供了强有力的支持。

尽管存在其他注册中心选项,各有其优势和适用场景,但 Docker Hub 凭借其先发优势、庞大的用户群体、丰富的公共镜像资源以及持续发展的功能集,依然是 Docker 容器化世界中最重要的平台之一,是每个 Docker 用户都应该理解和掌握的关键工具。

理解 Docker Hub 的工作原理、功能和最佳实践,将帮助你更有效地利用 Docker 容器技术,构建、分享和运行你的应用程序。它是你踏上容器化旅程中,不可或缺的伙伴。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部