Files
docker_practice/02_basic_concept/2.3_repository.md
2026-02-12 16:51:50 -08:00

11 KiB
Raw Blame History

2.3 Docker Registry

Docker Registry 是镜像分发和管理的核心组件。本节将介绍 Registry 的基本概念、公共和私有服务的选择,以及镜像的安全管理。

一句话理解 Registry

Docker Registry 是存储和分发 Docker 镜像的服务,类似于代码的 GitHub 或包管理的 npm。

镜像构建完成后,可以在当前机器上运行。但如果需要在其他服务器上使用这个镜像,就需要一个集中的存储和分发服务——这就是 Docker Registry。

核心概念

要熟练使用 Docker Registry首先需要理清它与仓库Repository、标签Tag之间的关系。

Registry、仓库、标签的关系

Docker Registry 中可以包含多个 Repository每个 Repository 可以包含多个 Tag。下图清晰地展示了它们之间的层级关系。

┌─────────────────────────────────────────────────────────────────────┐
│                         Docker Registry                             │
│                      (如 Docker Hub                               │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  Repository仓库: nginx                                    │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐         │   │
│  │  │ :latest │  │ :1.25   │  │ :1.24   │  │ :alpine │   ...   │   │
│  │  │  (tag)  │  │  (tag)  │  │  (tag)  │  │  (tag)  │         │   │
│  │  └─────────┘  └─────────┘  └─────────┘  └─────────┘         │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  Repository仓库: mysql                                    │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐                      │   │
│  │  │ :latest │  │ :8.0    │  │ :5.7    │   ...                │   │
│  │  └─────────┘  └─────────┘  └─────────┘                      │   │
│  └─────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────┘
概念 说明 示例
Registry 存储镜像的服务 Docker Hub、ghcr.io
Repository仓库 同一软件的镜像集合 nginxmysqlmycompany/myapp
Tag标签 仓库内的版本标识 latest1.25alpine

镜像的完整名称

一个完整的 Docker 镜像名称由 Registry 地址、用户名/组织名、仓库名和标签组成。了解其结构有助于我们更准确地定位镜像。

[registry地址/][用户名/]仓库名[:标签]

示例:

## 完整格式

registry.example.com/mycompany/myapp:v1.2.3
│                    │         │     │
│                    │         │     └── 标签
│                    │         └── 仓库名
│                    └── 用户名/组织名
└── Registry 地址

## Docker Hub 官方镜像(省略 registry 和用户名)

nginx:1.25
ubuntu:24.04

## Docker Hub 用户镜像

jwilder/nginx-proxy:latest

## 其他 Registry

ghcr.io/username/myapp:v1.0
gcr.io/google-containers/pause:3.6

💡 笔者提示:如果不指定 Registry 地址,默认使用 Docker Hub。如果不指定标签默认使用 latest

公共 Registry 服务

公共 Registry 服务为开发者提供了便捷的镜像获取途径。其中最著名的是 Docker Hub。

Docker Hub默认

Docker Hub 是最大的公共 Registry也是 Docker 的默认 Registry。

特点

  • 拥有大量官方镜像nginx、mysql、redis 等)
  • 免费账户可以创建公开仓库
  • 付费账户支持私有仓库
## 从 Docker Hub 拉取镜像

$ docker pull nginx              # 官方镜像
$ docker pull bitnami/redis      # 第三方镜像

## 推送镜像到 Docker Hub

$ docker login
$ docker push username/myapp:v1.0

其他公共 Registry

Registry 地址 说明
GitHub Container Registry ghcr.io GitHub 提供,与 GitHub Actions 集成好
Google Container Registry gcr.io Google Cloud 提供Kubernetes 镜像常用
Quay.io quay.io Red Hat 提供
阿里云容器镜像服务 registry.cn-*.aliyuncs.com 国内访问快
腾讯云容器镜像服务 ccr.ccs.tencentyun.com 国内访问快

镜像加速器

由于网络原因,在国内直接访问 Docker Hub 可能会很慢。可以配置镜像加速器Registry Mirror来加速下载。

// /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://your-accelerator-url"
  ]
}

详细配置方法请参考镜像加速器章节。

⚠️ 笔者提醒:镜像加速器的可用性经常变化,使用前建议先测试是否可用。

私有 Registry

出于安全和隐私的考虑,企业往往需要搭建自己的私有 Registry。以下是几种常见的搭建方案。

官方 Registry 镜像

Docker 官方提供了 registry 镜像,可以快速搭建私有 Registry

## 启动一个本地 Registry

$ docker run -d -p 5000:5000 --name registry registry:2

## 推送镜像到本地 Registry

$ docker tag myapp:v1.0 localhost:5000/myapp:v1.0
$ docker push localhost:5000/myapp:v1.0

## 从本地 Registry 拉取

$ docker pull localhost:5000/myapp:v1.0

企业级解决方案

官方 Registry 功能较为基础,企业环境常用以下方案:

方案 特点
Harbor CNCF 项目,功能全面(用户管理、漏洞扫描、镜像签名)
Nexus Repository 支持多种制品类型Docker、Maven、npm 等)
云厂商服务 阿里云 ACR、腾讯云 TCR、AWS ECR 等

笔者建议:

  • 小团队:可以先用官方 Registry够用即可
  • 中大型团队:推荐 Harbor功能完善且开源免费
  • 已使用云服务:直接用云厂商的 Registry 服务更省心

镜像的推送和拉取

掌握镜像的推送Push和拉取Pull是使用 Docker Registry 的基本功。

完整工作流程

下图展示了从开发环境构建镜像,推送到 Registry再到生产环境拉取运行的完整流程。

开发者机器                    Registry                    生产服务器
     │                           │                             │
     │  docker build             │                             │
     │  构建镜像                  │                             │
     │                           │                             │
     │  docker push ─────────────▶                             │
     │  推送镜像                  │  存储镜像                   │
     │                           │                             │
     │                           │  ◀───────────── docker pull │
     │                           │                  拉取镜像    │
     │                           │                             │
     │                           │                  docker run │
     │                           │                  运行容器    │

常用命令

运行以下命令:

## 登录 Registry

$ docker login                      # 登录 Docker Hub
$ docker login registry.example.com # 登录其他 Registry

## 拉取镜像

$ docker pull nginx:1.25

## 标记镜像(准备推送)

$ docker tag myapp:latest registry.example.com/myteam/myapp:v1.0

## 推送镜像

$ docker push registry.example.com/myteam/myapp:v1.0

## 登出

$ docker logout

镜像的安全性

在使用公共镜像或维护私有镜像时,安全性是不容忽视的重要环节。

使用官方镜像

Docker Hub 的官方镜像(标有 "Official Image" 标识)经过 Docker 团队审核,相对更安全。

## 官方镜像示例

nginx          # ✅ 官方
mysql          # ✅ 官方
redis          # ✅ 官方

## 第三方镜像(需要自行评估可信度)

bitnami/redis  # ⚠️ 需要评估
someuser/myapp # ⚠️ 需要评估

镜像签名

使用 Docker Content Trust (DCT) 验证镜像来源:

## 启用镜像签名验证

$ export DOCKER_CONTENT_TRUST=1

## 此后的 pull/push 会验证签名

$ docker pull nginx:latest

漏洞扫描

运行以下命令:

## 使用 Docker Scout 扫描镜像漏洞

$ docker scout cves nginx:latest

## 使用 Trivy开源工具

$ trivy image nginx:latest

本章小结

概念 要点
Registry 存储和分发镜像的服务
仓库Repository 同一软件的镜像集合
标签Tag 版本标识,默认为 latest
Docker Hub 默认的公共 Registry
私有 Registry 企业内部使用,推荐 Harbor

现在你已经了解了 Docker 的三个核心概念:镜像容器和仓库。接下来,让我们开始安装 Docker,动手实践!

延伸阅读