在实际工作中,我们经常需要管理自己的Docker镜像。
虽然Docker
Hub提供了海量的公共镜像,但出于安全、速度或管理上的考虑,很多团队会选择搭建私有的镜像仓库。
之前我尝试过直接把镜像保存为tar包再导入,但对于节点稍多的集群来说实在麻烦。
后来用上了Registry镜像仓库,操作简单,对小型集群非常友好。
今天就和大家分享一下从零搭建Docker
Registry的过程,顺便把客户端配置和镜像推送也讲清楚。
一、几种镜像仓库方案的对比
在开始搭建之前,先简单梳理一下目前常见的镜像仓库方案,方便大家根据实际场景选择:
| 方案 | 特点 |
|---|---|
| 镜像保存为压缩包 | 通过docker导入导出,节点极少时应急还行,但镜像一多就难以管理,不推荐。 |
| 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
先把准备好的安装包解压并执行安装脚本:
[root@hadoop109tar
docker-20.10.5-install.tar.gz[root@hadoop109
docker-20.10.5-install/[root@hadoop109
docker-20.10.5-install]#
install.sh[root@hadoop109
systemctl
docker
2.
拉取Registry镜像
Registry镜像很小,只有20多MB,直接pull或者从本地tar包加载都行:
[root@hadoop109docker
或者从离线包加载[root@hadoop109
docker
save-registry.tar.gz
检查一下镜像:
[root@hadoop109查看,确认docker
4bb5ea59f8e02years
ago
创建数据卷
Registry容器内部默认把镜像数据存放在
/var/lib/registry,为了容器删除后数据不丢失,我们创建一个数据卷挂载进去:[root@hadoop109docker
registryregistry[root@hadoop109
docker
NAMElocalregistry
4.
启动容器
用以下命令启动Registry容器,映射宿主机5000端口,同时把刚才创建的数据卷挂载到容器的存储等。
编辑
/etc/docker/daemon.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
[root@hadoop108systemctl
docker
重启后用
dockerinfo
Insecure里包含了Registries
hadoop109:5000。准备一个本地镜像
我本地已经有一个tengine:2.3.3的镜像,用来做测试:
[root@hadoop108docker
25f29f6c517a27hours
ago
给镜像打上仓库标签
推送前需要按照
仓库地址/命名空间/镜像名:标签的格式重新打标签,这里我用hadoop109:5000/lmc/tengine:2.3.3,其中lmc可以理解为项目组或用户名,随意定义:[root@hadoop108docker
hadoop109:5000/lmc/tengine:2.3.3
查看一下,新标签的镜像ID与原镜像相同,说明只是增加了一个引用:
[root@hadoop108docker
25f29f6c517a28hours
ago
hadoop109:5000/lmc/tengine2.3.3
25f29f6c517a28hours
ago
执行推送
[root@hadoop108docker
hadoop109:5000/lmc/tengine:2.3.3The
push
repository[hadoop109:5000/lmc/tengine]5eff95b17bc4:
Pushed
sha256:4b3e9eff84e96d7bc45e12262b01696cd001120290a0f9de3c74bef6b4750546
size:742
看到
Pushed字样,说明推送成功。4.
验证仓库
再次访问
http://192.168.2.109:5000/v2/_catalog,这回能看到仓库列表里已经有了lmc/tengine:
/>
或者用API查看某个镜像的标签列表:
curlhttp://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导致无法推送。
- 镜像命名规范:推送前必须将镜像名改为
仓库地址:端口/命名空间/镜像名:标签的格式,否则默认会推到DockerHub。
- 数据持久化:启动容器时务必挂载数据卷,否则容器删除后镜像数据就没了。
/>
七、总结
通过Registry搭建私有仓库非常简单,十几分钟就能搞定。
对于小型团队或个人学习,这种方式足够轻量、够用。
如果你的环境更复杂,比如需要用户认证、镜像复制、漏洞扫描等功能,可以考虑升级到Harbor。
不过从Registry入手,先理解私有仓库的工作原理,再过渡到Harbor也会更顺畅。
希望这篇分享对你有帮助,如果有问题欢迎留言交流!


