一、为什么需要私有镜像仓库

  • 方便存储和管理自己构建的镜像(公司内部镜像、测试镜像等)。
  • 提高镜像分发速度(尤其是内网环境)。
  • 增强安全性(避免公开托管敏感镜像)。

二、环境准备

  • 一台win笔记本电脑 / 一台服务器(Linux,建议 CentOS / Ubuntu,内存≥2GB)。
  • 已安装 DockerDocker Compose

三、搭建步骤

本次示例搭建依托于win 10 环境

1. 新建目录

1
2
// 镜像仓库数据持久化目录 
D:\docker-an\myregistry\registry-data

2. 编写 registry 的配置文件

config.yml 示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
// 重要: 直接跨域,不然会出现请求200,但是报错跨域提示需要设置改项
Access-Control-Allow-Origin: [http://localhost:9080]
Access-Control-Allow-Methods: [HEAD, GET, OPTIONS, DELETE]
Access-Control-Allow-Headers: [Authorization, Accept]
Access-Control-Max-Age: [1728000]
Access-Control-Allow-Credentials: [true]
Access-Control-Expose-Headers: [Docker-Content-Digest]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3

3. 编写 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: "3.8"

services:
myregistry:
image: registry:2
container_name: myregistry
ports:
- "5000:5000"
volumes:
// 挂载数据目录进行持久化
- D:/docker-an/myregistry/registry-data:/var/lib/registry
// 挂载registry:2配置文件
- D:/docker-an/myregistry/config.yml:/etc/docker/registry/config.yml
restart: always

registry-ui:
image: joxit/docker-registry-ui:2.5.7
container_name: registry-ui
environment:
- REGISTRY_TITLE=MyRegistry
// 连接私库的地址
- REGISTRY_URL=http://host.docker.internal:5000
ports:
- "9080:80"
depends_on:
- myregistry
restart: always

4. 启动服务

1
docker-compose up -d
  • Registry 服务地址: http://localhost:5000
  • UI 管理页面: http://localhost:9080

四、客户端配置

1. 修改 Docker 配置(允许 HTTP 仓库)

编辑 daemon.json:

Docker for win 页面打开Setting–>Docker Engine

Linux上需要修改/etc/docker/daemon.json(文件不存在就自己创建一个)

1
2
 // 不是本地部署的 需要换成对应 ServerIP
"insecure-registries": ["localhost:5000"]

重启 Docker

Docker for win 点击 Apply & restart

Linux中执行如下命令即可

1
systemctl restart docker

2. 测试推送镜像

1
2
docker tag hello-world:latest localhost:5000/hello-world:local
docker push localhost:5000/hello-world:local

3. 查看UI 管理页面

观察到 hello-world 镜像已经成功推送到私库

img

img

4. 测试拉取镜像

1
docker pull localhost:5000/hello-world:local

五、与其他私库对比

特性 Docker Registry + UI Harbor Nexus3 (支持Docker) GitLab Container Registry
部署难度 简单(几分钟) 中等(需配置数据库、Redis) 中等 中等(依赖 GitLab)
功能 基础推送/拉取,UI 管理 企业级功能齐全(用户、RBAC、审计、复制、多租户) 通用制品库(Docker、Maven、npm 等) 与 GitLab CI/CD 深度集成
UI体验 简单直观 功能丰富,支持权限、项目分组 功能较多但略复杂 集成在 GitLab 界面中
安全性 默认弱(需额外配置 HTTPS、认证) 内置安全扫描、用户权限控制 支持用户认证 依赖 GitLab 权限
适用场景 个人/小团队快速搭建 企业级团队/生产环境 需要统一制品管理 使用 GitLab 的团队
运维复杂度 较高 中等 中等

六、总结

  • Docker Registry + UI:轻量、快速、适合个人/小团队测试和开发。
  • Harbor:最推荐的企业级方案,功能强大,但部署复杂。
  • Nexus3:适合需要多种制品统一管理的场景。
  • GitLab Registry:如果本身用 GitLab 做代码管理,推荐直接使用。

写在最后

如果只是想要一个 简单好用的个人私库,Docker Registry + UI 足够。
如果是企业生产环境,首选还是Harbor