在用上 Zot 之前,xiaoz 一直用 Nexus 3 搭建容器镜像仓库。但这个重量级工具内存占用高,上手复杂,出了问题也不好排查。现在,xiaoz 已经彻底告别 Nexus 3,投入 Zot 的怀抱了。

注意:这篇文章具有一定专业性,推荐开发者或运维人员阅读,不建议新手小白尝试!!!
什么是Zot?
Zot 就是一个像 Docker Hub 一样的容器镜像仓库,但它是轻量级、私有的,你可以随便部署在自己的服务器上。它专门用来存储和分发你的容器镜像,也可以用来加速Docker hub镜像,从而解决国内无法拉取Docker镜像的问题。
Zot具有以下特点
- 私有镜像存储:在自己的服务器上搭建私有的 Docker 镜像仓库,团队内部安全共享。
- 镜像推送与拉取:完全兼容 Docker 命令,像使用 Docker Hub 一样
push和pull。 - 安全漏洞扫描:自动检查镜像里的已知安全风险,提前发现隐患。
- 权限访问控制:支持用户认证和授权,谁可以推、谁可以拉,由你掌控。
- 垃圾数据清理:自动回收无用的镜像层和冗余数据,节省存储空间。
- 数据去重:相同内容只存一份,避免重复占用磁盘。
- 跨平台支持:Linux、Mac、树莓派等都能跑,云上、本地、边缘环境通吃。
- 极简部署:整个软件就是一个单文件,下载即用,无需安装依赖或额外服务。
使用Docker Compose部署Zot
下面xiaoz将根据我的实际需求出发,然后使用Docker Compose部署Zot
1、生成密码文件
Zot支持多种用户认证方式,最简单的就是使用Basic认证,先用下面的命令生成htpasswd文件:
docker run --rm httpd:alpine htpasswd -Bbn username password > ./htpasswd- username:改成你自己的用户名
- password:改成你自己的密码
2、编写配置文件
说实话,虽然Zot这个软件本身比较轻量,但Zot的配置还是蛮复杂的,xiaoz在结合AI的情况折腾了半天才编写出符合自己需求的配置。
先来说说我的需求:
- 加速Docker官方和GitHub容器镜像仓库,使国内网络能够正常拉取
- 建立自己的私有容器镜像仓库
如果您和xiaoz的需求一样,那么恭喜你,可以直接抄作业了,先新建一个config.json,内容如下:
{
"storage": {
"rootDirectory": "/var/lib/registry",
"commit": true,
"dedupe": true,
"gcInterval": "24h",
"retention": {
"policies": [
{
"repositories": [
"username/**"
],
"deleteUntagged": true,
"keepTags": [
{
"patterns": ".*"
}
]
},
{
"repositories": [
"**"
],
"deleteUntagged": true,
"keepTags": [
{
"pushedWithin": "24h",
"pulledWithin": "24h"
}
]
}
]
}
},
"http": {
"address": "0.0.0.0",
"port": "5000",
"auth": {
"htpasswd": {
"path": "/etc/zot/htpasswd"
}
},
"accessControl": {
"repositories": {
"**": {
"defaultPolicy": [
"read",
"create",
"update",
"delete"
]
}
}
}
},
"extensions": {
"sync": {
"enable": true,
"registries": [
{
"urls": [
"https://ghcr.io"
],
"onDemand": true,
"tlsVerify": true,
"maxRetries": 3,
"retryDelay": "5m",
"content": [
{
"prefix": "**"
}
]
},
{
"urls": [
"https://registry-1.docker.io"
],
"onDemand": true,
"tlsVerify": true,
"maxRetries": 3,
"retryDelay": "5m"
}
]
},
"search": {
"enable": true,
"cve": {
"updateInterval": "2h"
}
},
"ui": {
"enable": true
}
}
}注意:上面的username改成你自己的用户名(参考上面的第一个步骤),更多配置参数可以参考官方文档:https://zotregistry.dev/v2.1.17/admin-guide/admin-configuration/
3、创建compose.yaml文件,内容如下:
services:
zot:
image: ghcr.io/project-zot/zot-linux-amd64:latest
container_name: reg_xphub
restart: always
ports:
- "5000:5000"
volumes:
- ./config.json:/etc/zot/config.json:ro
- ./htpasswd:/etc/zot/htpasswd:ro
- ./data:/var/lib/registry最后输入docker compose up -d启动,并访问WebUI:http://IP:5000进行登录。

注意:如果你想使用Zot来解决国内无法拉取Docker镜像的问题,你应该将Zot部署到海外服务器!!!
使用
由于Docker客户端默认不支持http,我们可以通过反向代理http://IP:5000来配置SSL证书,使其支持https
注意:如果您使用CDN来配置,CDN请不要设置缓存,否则可能导致认证出现异常!!!
SSL证书配置成功后,我们就可以使用Docker的命令行进行登录:docker login pub.tcp.mk
注意:
pub.tcp.mk改成你自己的域名,前面不需要加https://,末尾也不需要路径。
然后再拉取镜像:
docker pull pub.tcp.mk/helloz/zmark结语
如果您也想搭建一个轻量、私有的容器镜像仓库,或者需要加速国内Docker镜像拉取,不妨试试Zot。相比Nexus 3/Harbor这类重型工具,Zot省资源、部署简单,配置文件虽然需要花点心思,但一次配好就能一劳永逸。










