30分钟用zot搭建私有OCI镜像仓库
本文带你快速部署 zot 私有镜像仓库,完成基础认证、镜像推送/拉取、按需同步与垃圾回收配置。解决内网镜像管理痛点,适合需轻量级替代方案的团队。
30分钟用zot搭建私有OCI镜像仓库
开篇:你还在被镜像仓库折磨吗?
团队迁移服务时遇到了典型问题:Docker Hub公开仓库拉取慢,Harbor依赖和配置太重。实际需求很简单:内网搭建私有镜像仓库,能推能拉、支持基础认证与同步。
zot 是纯 Go 编写的 OCI-native 容器镜像仓库,完全遵循 OCI 规范,提供轻量、可扩展的替代方案。本文将带你完成从部署到核心功能配置的全流程。
你将完成以下实操任务:
- 在 Linux 机器上部署 zot 并启动服务
- 配置基础认证和文件存储路径
- 成功推送和拉取私有容器镜像
- 掌握镜像同步与垃圾回收配置方法
前置条件
确保环境满足以下基础要求:
- 操作系统:Linux(以 Ubuntu 22.04 为例,其他发行版操作逻辑相同)
- Docker:已安装并正常运行(用于镜像测试)
- 网络:可访问 GitHub 下载资源
- 知识储备:了解 Docker 基础命令和容器镜像概念即可
无需 Go 语言经验,zot 提供开箱即用的预编译二进制文件。
快速部署 zot 实例
下载与安装
zot 采用静态编译,单个二进制即可运行:
bash
## 下载 Linux amd64 版本(按需替换架构标识)
wget https://github.com/project-zot/zot/releases/latest/download/zot-linux-amd64
## 赋予权限并安装到系统路径
chmod +x zot-linux-amd64
sudo mv zot-linux-amd64 /usr/local/bin/zot
## 验证版本
zot --version
macOS 用户替换为 zot-darwin-amd64,ARM 架构使用 zot-linux-arm64。
创建配置目录与文件
bash
mkdir -p /opt/zot/config /opt/zot/data
生成 /opt/zot/config/zot.json 基础配置:
json
{
"storage": {
"rootDirectory": "/opt/zot/data"
},
"http": {
"address": "0.0.0.0",
"port": "5000"
},
"log": {
"level": "info"
}
}
配置要点:
rootDirectory:镜像实际存储路径,预留充足磁盘空间address设为0.0.0.0开放外部访问,本地调试可改127.0.0.1- 端口 5000 与 Docker Registry 默认端口一致,便于后续替换
启动服务
bash
## 前台启动(调试模式)
zot serve /opt/zot/config/zot.json
## 生产环境后台运行
nohup zot serve /opt/zot/config/zot.json > /opt/zot/zot.log 2>&1 &
访问 http://<IP>:5000/v2/ 返回 {} 即表示 OCI API 就绪。
镜像推送与拉取实战
配置 Docker 信任
未配置 HTTPS 时 Docker 会拒绝连接,需添加信任策略:
bash
sudo vim /etc/docker/daemon.json
追加配置:
json
{
"insecure-registries": ["<你的IP地址>:5000"]
}
重启 Docker 生效:
bash
sudo systemctl restart docker
安全提醒: 生产环境必须配置 TLS 证书,zot 支持 http.tls 字段指定 cert 和 key 路径。
推送测试镜像
bash
## 拉取公开镜像
docker pull nginx:alpine
## 重定向标签
docker tag nginx:alpine <你的IP地址>:5000/my-nginx:1.0
## 推送到 zot
docker push <你的IP地址>:5000/my-nginx:1.0
成功时显示类似输出:
The push refers to repository [<IP>:5000/my-nginx]
xxxxx: Pushed
1.0: digest: sha256:xxxxx size: xxx
验证拉取功能
bash
## 清理本地镜像
docker rmi <你的IP地址>:5000/my-nginx:1.0
## 重新拉取
docker pull <你的IP地址>:5000/my-nginx:1.0
## 验证存在
docker images | grep my-nginx
进阶配置指南
Htpasswd 认证
bash
## 安装工具
sudo apt-get install apache2-utils -y
## 创建认证文件
cd /opt/zot/config
htpasswd -Bbc htpasswd admin password123
更新 zot.json 添加认证:
json
{
"http": {
"address": "0.0.0.0",
"port": "5000",
"auth": {
"htpasswd": {
"path": "/opt/zot/config/htpasswd"
}
}
}
}
重启后操作需通过 docker login <IP>:5000 认证。
镜像按需同步
配置 sync 字段实现拉取缓存:
json
{
"sync": {
"credentialsFile": "/opt/zot/config/credentials.json",
"registries": [
{
"urls": ["https://index.docker.io/v1/"],
"onDemand": true,
"tlsVerify": true,
"maxRetries": 3,
"content": [
{
"destination": "local-nginx",
"tags": {
"regex": "alpine"
}
}
]
}
]
}
}
注意:同步功能需使用带 sync tag 的预编译版本(文件名含 -sync 后缀)。
垃圾回收(GC)
定期清理未引用镜像层释放空间:
bash
zot gc /opt/zot/config/zot.json
建议配置 cron 定时任务在低峰期执行。
常见问题排查
- 推送报证书错误:确认已添加
insecure-registries或配置有效 TLS 证书 - 403 认证失败:检查 htpasswd 路径权限及密码正确性
- 磁盘空间告急:优先执行 GC 清理,配置存储监控阈值(建议 80%)
- 同步功能不可用:确认使用的二进制包含 sync tag(文件名后缀
-sync)
总结
通过单二进制部署、JSON 配置与标准 OCI 协议支持,zot 大幅降低了私有镜像仓库的运维门槛。对比传统方案,其轻量特性完美契合中小团队的内网镜像管理需求。
延伸探索方向:
- 使用 Nginx/Traefik 配置反向代理与 HTTPS
- 集成 cosign 实现镜像签名验证
- 通过 systemd 或 Docker Compose 管理生产级部署
仓库地址:https://github.com/project-zot/zot
官方文档:https://zotregistry.dev
遇到具体问题欢迎在评论区讨论交流!