Docker Registry私有仓库搭建与使用
-
- 一、几种镜像仓库方案的对比
- 二、环境准备
- 三、服务端搭建(hadoop109)
-
- [1. 安装Docker](#1. 安装Docker)
- [2. 拉取Registry镜像](#2. 拉取Registry镜像)
- [3. 创建数据卷](#3. 创建数据卷)
- [4. 启动容器](#4. 启动容器)
- [5. 验证服务](#5. 验证服务)
- 四、客户端配置(hadoop108)
-
- [1. 安装Docker](#1. 安装Docker)
- [2. 配置daemon.json](#2. 配置daemon.json)
- [3. 重启Docker](#3. 重启Docker)
- 五、推送镜像到私有仓库
-
- [1. 准备一个本地镜像](#1. 准备一个本地镜像)
- [2. 给镜像打上仓库标签](#2. 给镜像打上仓库标签)
- [3. 执行推送](#3. 执行推送)
- [4. 验证仓库](#4. 验证仓库)
- 六、踩坑与注意事项
- 七、总结
在实际工作中,我们经常需要管理自己的Docker镜像。虽然Docker Hub提供了海量的公共镜像,但出于安全、速度或管理上的考虑,很多团队会选择搭建私有的镜像仓库。之前我尝试过直接把镜像保存为tar包再导入,但对于节点稍多的集群来说实在麻烦。后来用上了Registry镜像仓库,操作简单,对小型集群非常友好。今天就和大家分享一下从零搭建Docker Registry的过程,顺便把客户端配置和镜像推送也讲清楚。
一、几种镜像仓库方案的对比
在开始搭建之前,先简单梳理一下目前常见的镜像仓库方案,方便大家根据实际场景选择:
| 方案 | 特点 |
|---|---|
| 镜像保存为压缩包 | 通过 docker save/load 导入导出,节点极少时应急还行,但镜像一多就难以管理,不推荐。 |
| Registry 镜像仓库 | Docker官方的轻量级仓库,命令行操作,适合镜像不多、环境简单的小型集群,也是本文要搭建的。 |
| Harbor 镜像仓库 | 企业级仓库,支持图形化界面、权限管理、镜像复制等,适合与Kubernetes配合的中大型团队。 |
| 公有云镜像服务 | 像阿里云容器镜像服务、腾讯云TCR这类,免维护,全球加速,个人或企业直接使用非常省心。 |
如果你的集群只有几台机器,镜像数量也不多,用Registry快速搭一个私有仓库完全够用。
二、环境准备
我准备了两台虚拟机,都安装了CentOS 7,具体规划如下:
| 主机名 | 角色 | IP地址 |
|---|---|---|
| hadoop108 | 客户端 | 192.168.2.108 |
| hadoop109 | Registry服务 | 192.168.2.109 |
两台机器都需要安装Docker,版本选20.10.5(这个版本比较稳定,安装包可以提前下载好)。
三、服务端搭建(hadoop109)
1. 安装Docker
先把准备好的安装包解压并执行安装脚本:
bash
[root@hadoop109 software]# tar -xzvf docker-20.10.5-install.tar.gz
[root@hadoop109 software]# cd docker-20.10.5-install/
[root@hadoop109 docker-20.10.5-install]# sh install.sh
[root@hadoop109 software]# systemctl start docker
2. 拉取Registry镜像
Registry镜像很小,只有20多MB,直接pull或者从本地tar包加载都行:
bash
[root@hadoop109 ~]# docker pull registry
# 或者从离线包加载
[root@hadoop109 ~]# docker load -i save-registry.tar.gz
检查一下镜像:
bash
[root@hadoop109 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 4bb5ea59f8e0 2 years ago 24MB
3. 创建数据卷
Registry容器内部默认把镜像数据存放在 /var/lib/registry,为了容器删除后数据不丢失,我们创建一个数据卷挂载进去:
bash
[root@hadoop109 ~]# docker volume create registry
registry
[root@hadoop109 ~]# docker volume ls
DRIVER VOLUME NAME
local registry
4. 启动容器
用以下命令启动Registry容器,映射宿主机5000端口,同时把刚才创建的数据卷挂载到容器的存储目录,并设置容器重启策略为always:
bash
[root@hadoop109 software]# docker run -d --name "docker_registry" -p 5000:5000 -v registry:/var/lib/registry --restart=always registry:latest
573430e2f9e38a6e79c75eb51661d15e299ad3c8da977602f8a3c2515bd4af38
[root@hadoop109 software]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
573430e2f9e3 registry:latest "/entrypoint.sh /etc..." 6 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp docker_registry
这里也可以用docker-compose,但单容器我习惯直接run,省事。
5. 验证服务
浏览器访问 http://192.168.2.109:5000/v2/_catalog,应该能看到一个空的json列表 {"repositories":[]},说明Registry服务正常运行。

四、客户端配置(hadoop108)
1. 安装Docker
同样在hadoop108上安装Docker,步骤与上面一样,不再重复。
2. 配置daemon.json
由于我们的Registry是HTTP协议(默认Docker只信任HTTPS或本地仓库),所以需要在客户端明确声明允许访问这个不安全的仓库。同时可以配置镜像加速器、修改数据目录等。编辑 /etc/docker/daemon.json:
json
{
"registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"],
"insecure-registries": ["hadoop109:5000"],
"data-root": "/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"]
}
关键就是 insecure-registries 这一项,写上你的Registry地址和端口。其他配置根据实际情况调整。
3. 重启Docker
bash
[root@hadoop108 ~]# systemctl restart docker
重启后用 docker info 查看,确认 Insecure Registries 里包含了 hadoop109:5000。
五、推送镜像到私有仓库
1. 准备一个本地镜像
我本地已经有一个tengine:2.3.3的镜像,用来做测试:
bash
[root@hadoop108 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tengine 2.3.3 25f29f6c517a 27 hours ago 389MB
2. 给镜像打上仓库标签
推送前需要按照 仓库地址/命名空间/镜像名:标签 的格式重新打标签,这里我用 hadoop109:5000/lmc/tengine:2.3.3,其中 lmc 可以理解为项目组或用户名,随意定义:
bash
[root@hadoop108 ~]# docker tag tengine:2.3.3 hadoop109:5000/lmc/tengine:2.3.3
查看一下,新标签的镜像ID与原镜像相同,说明只是增加了一个引用:
bash
[root@hadoop108 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tengine 2.3.3 25f29f6c517a 28 hours ago 389MB
hadoop109:5000/lmc/tengine 2.3.3 25f29f6c517a 28 hours ago 389MB
3. 执行推送
bash
[root@hadoop108 ~]# docker push hadoop109:5000/lmc/tengine:2.3.3
The push refers to repository [hadoop109:5000/lmc/tengine]
5eff95b17bc4: Pushed
f5bb4f853c84: Pushed
2.3.3: digest: sha256:4b3e9eff84e96d7bc45e12262b01696cd001120290a0f9de3c74bef6b4750546 size: 742
看到 Pushed 字样,说明推送成功。
4. 验证仓库
再次访问 http://192.168.2.109:5000/v2/_catalog,这回能看到仓库列表里已经有了 lmc/tengine:

或者用API查看某个镜像的标签列表:
bash
curl http://192.168.2.109:5000/v2/lmc/tengine/tags/list
{"name":"lmc/tengine","tags":["2.3.3"]}
六、踩坑与注意事项
- 防火墙问题 :如果推送失败,先检查hadoop109的5000端口是否开放,可以用
telnet 192.168.2.109 5000测试。 - insecure-registries:一定要在客户端的daemon.json中配置,否则Docker会强制使用HTTPS导致无法推送。
- 镜像命名规范 :推送前必须将镜像名改为
仓库地址:端口/命名空间/镜像名:标签的格式,否则默认会推到Docker Hub。 - 数据持久化:启动容器时务必挂载数据卷,否则容器删除后镜像数据就没了。
七、总结
通过Registry搭建私有仓库非常简单,十几分钟就能搞定。对于小型团队或个人学习,这种方式足够轻量、够用。如果你的环境更复杂,比如需要用户认证、镜像复制、漏洞扫描等功能,可以考虑升级到Harbor。不过从Registry入手,先理解私有仓库的工作原理,再过渡到Harbor也会更顺畅。
希望这篇分享对你有帮助,如果有问题欢迎留言交流!