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 流程和镜像分发场景。