Docker Registry私有仓库搭建与使用

Docker Registry私有仓库搭建与使用

在实际工作中,我们经常需要管理自己的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"]}

六、踩坑与注意事项

  1. 防火墙问题 :如果推送失败,先检查hadoop109的5000端口是否开放,可以用 telnet 192.168.2.109 5000 测试。
  2. insecure-registries:一定要在客户端的daemon.json中配置,否则Docker会强制使用HTTPS导致无法推送。
  3. 镜像命名规范 :推送前必须将镜像名改为 仓库地址:端口/命名空间/镜像名:标签 的格式,否则默认会推到Docker Hub。
  4. 数据持久化:启动容器时务必挂载数据卷,否则容器删除后镜像数据就没了。

七、总结

通过Registry搭建私有仓库非常简单,十几分钟就能搞定。对于小型团队或个人学习,这种方式足够轻量、够用。如果你的环境更复杂,比如需要用户认证、镜像复制、漏洞扫描等功能,可以考虑升级到Harbor。不过从Registry入手,先理解私有仓库的工作原理,再过渡到Harbor也会更顺畅。

希望这篇分享对你有帮助,如果有问题欢迎留言交流!

相关推荐
开开心心就好1 小时前
实用PDF擦除隐藏信息工具,空白处理需留意
运维·服务器·windows·pdf·迭代器模式·桥接模式·1024程序员节
追随者永远是胜利者1 小时前
(LeetCode-Hot100)70. 爬楼梯
java·算法·leetcode·职场和发展·go
前路不黑暗@2 小时前
Java项目:Java脚手架项目的阿里云短信服务集成(十六)
android·java·spring boot·学习·spring cloud·阿里云·maven
海南java第二人2 小时前
Flink运行时组件深度解析:Java工程师的架构设计与实战指南
java·大数据·flink
落羽的落羽2 小时前
【Linux系统】磁盘ext文件系统与软硬链接
linux·运维·服务器·数据库·c++·人工智能·机器学习
WJX_KOI2 小时前
保姆级教程:Apache Flink CDC(standalone 模式)部署 MySQL CDC、PostgreSQL CDC 及使用方法
java·大数据·mysql·postgresql·flink
Codefengfeng2 小时前
Kali-linux中安装与使用Stegsolve
linux·运维·服务器
追随者永远是胜利者2 小时前
(LeetCode-Hot100)49. 字母异位词分组
java·算法·leetcode·职场和发展·go
吴声子夜歌2 小时前
RxJava——Flowable与背压
android·java·rxjava