1. 概述

Docker 是一个基于操作系统级虚拟化的平台,用于在容器中运行应用程序。Docker 的一个显著特性是,它为应用程序提供一致的运行环境。CI/CD 工具也可以通过自动从仓库中拉取或推送镜像,实现生产环境的自动化部署。

本文将介绍 Docker 公共仓库和私有仓库的使用,重点讲解如何搭建一个私有 Docker 仓库,并演示如何将镜像推送到私有仓库,以及如何从私有仓库拉取镜像。

2. Docker 私有仓库与公共仓库

Docker 支持将镜像创建、存储和管理在私有服务器上。同时,Docker 也提供了免费的公共仓库,如 Docker Hub。虽然我们可以将镜像托管在 Docker Hub 上,但它们默认是公开的。对于包含敏感代码或配置的镜像,我们通常会选择使用 Docker Hub 的付费私有账户,或者自行搭建私有仓库。

✅ Docker Hub 的私有仓库需要付费,而私有仓库可以免费搭建。
✅ 使用私有仓库可以实现负载均衡、自定义认证与日志记录等功能,具备更高的灵活性和安全性。
✅ 镜像通常由多个层组成,这些层也可以被推送到私有或公共仓库中。

3. 搭建私有仓库

为了加快构建速度,我们可以将镜像集中存放在私有或公共仓库中。这样可以从仓库中直接拉取打包好的镜像,避免在不同环境中重复安装依赖。

3.1 配置私有仓库

Docker 提供了基于 registry 镜像来搭建私有仓库的功能。在开始之前,我们首先需要修改 Docker 的默认配置。

编辑 /etc/docker/daemon.json 文件,添加如下内容:

{
    "insecure-registries": [
        "localhost:5000"
    ]
}

⚠️ 添加 insecure-registries 是为了允许 Docker 使用 HTTP(非 HTTPS)访问本地私有仓库。
⚠️ 修改完成后,需要重载 Docker 配置:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

3.2 启动私有仓库

从 Docker Hub 拉取 registry 镜像:

$ docker pull registry

查看本地镜像列表:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              773dbf02e42e        21 hours ago        24.1MB

启动私有仓库容器:

$ docker run -itd -p 5000:5000 --name baeldung-registry registry

验证容器是否运行正常:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e2d09cd3a5ef        registry            "/entrypoint.sh /etc…"   3 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   baeldung-registry

此时私有仓库已成功启动并运行。

4. 将镜像推送到私有仓库

centos 镜像为例,演示如何将镜像推送到私有仓库。

首先从 Docker Hub 拉取 centos 镜像:

$ docker pull centos

为镜像打标签,指向私有仓库地址:

$ docker tag centos:latest localhost:5000/baeldung-centos

查看本地镜像:

$ docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
registry                            latest              773dbf02e42e        22 hours ago        24.1MB
localhost:5000/baeldung-centos   latest              5d0da3dc9764        8 months ago        231MB
centos                              latest              5d0da3dc9764        8 months ago        231MB

推送镜像到私有仓库:

$ docker push localhost:5000/baeldung-centos
The push refers to repository [localhost:5000/baeldung-centos]
74ddd0ec08fa: Pushed 
latest: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529

✅ 镜像已成功推送到本地私有仓库。

5. 从私有仓库拉取镜像

从私有仓库拉取镜像的命令与从 Docker Hub 拉取类似。

先删除本地的 baeldung-centos 镜像:

$ docker rmi 5d0da3dc9764

验证本地镜像是否已删除:

$ docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
registry                         latest              773dbf02e42e        22 hours ago        24.1MB

从私有仓库拉取镜像:

$ docker pull localhost:5000/baeldung-centos
Using default tag: latest
latest: Pulling from baeldung-centos
a1d0c7532777: Pull complete 
Digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
Status: Downloaded newer image for localhost:5000/baeldung-centos:latest
localhost:5000/baeldung-centos:latest

✅ 镜像已成功从私有仓库拉取。

6. 为私有仓库配置认证

为了防止私有仓库被未授权访问,我们可以为其配置基础的认证机制,例如使用 htpasswd

创建认证目录:

$ mkdir -p Docker_registry/auth

使用 httpd 容器生成认证文件:

$ cd Docker_registry &&
  docker run --entrypoint htpasswd httpd:2 -Bbn baeldung-user baeldung > auth/htpasswd

启动带认证的私有仓库容器:

$ docker run -itd \
  -p 5000:5000 \
  --name registry \
  -v "$(pwd)"/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry

测试登录:

$ docker login localhost:5000 -u baeldung-user -p baeldung
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

⚠️ 建议使用 --password-stdin 参数避免密码暴露在命令历史中。
✅ 登录成功后即可正常推送和拉取镜像。

7. 总结

本文演示了如何搭建 Docker 私有仓库,并完成以下操作:

  • ✅ 配置 Docker 支持私有仓库访问
  • ✅ 启动私有仓库服务
  • ✅ 推送和拉取镜像
  • ✅ 为私有仓库添加基础认证

通过私有仓库,我们可以更安全、灵活地管理 Docker 镜像,适用于企业内部 CI/CD 流程和镜像分发场景。


原始标题:A Guide to Docker Private Registry