Docker私有仓库搭建步骤详解,零基础也能一次完成
前置准备
在开始 Docker私有仓库搭建 之前,你需要准备好以下环境:
- 一台 Linux 服务器(Ubuntu 20.04 / CentOS 7+ 均可)
- 已安装 Docker(若未安装,请先执行
curl -fsSL https://get.docker.com | sh) - 开放端口 5000(仓库默认端口,云服务器需在安全组中放行)
- 域名或 IP(生产环境建议绑定域名并配置 SSL)
- 磁盘空间(镜像存储会很占空间,建议预留 20GB 以上)
注意:自建仓库默认仅支持 HTTP,生产环境必须使用 HTTPS。文中会给出两种方式:测试用 HTTP 和正规 HTTPS。
分步操作
1. 拉取 Registry 镜像
docker pull registry:2此命令会自动从 Docker Hub 拉取最新版 Registry 镜像(约 26MB),你也可以指定版本,例如 registry:2.8。
2. 运行容器(HTTP 测试版)
docker run -d \
--name my-registry \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
registry:2-d:后台运行--name:容器名称,方便管理-p:映射宿主机 5000 端口到容器 5000 端口-v:挂载数据卷,将镜像数据保存到宿主机/data/registry目录
检查容器是否运行:docker ps应看到my-registry状态为 Up。
3. 测试推送镜像(需修改 Docker 配置)
由于仓库使用 HTTP,需在 Docker 客户端添加 insecure-registries 配置。
编辑 /etc/docker/daemon.json:
{
"insecure-registries": ["你的服务器IP:5000"]
}重启 Docker:
sudo systemctl restart docker然后拉一个测试镜像并打标签:
docker pull nginx:latest
docker tag nginx:latest 你的服务器IP:5000/nginx:latest
docker push 你的服务器IP:5000/nginx:latest如果返回 successfully pushed,则搭建成功!
4. 配置 HTTPS(生产环境必做)
推荐使用 Nginx 反代 + Let's Encrypt 证书。
a. 获得证书(以 certbot 为例):
sudo apt install certbot nginx
sudo certbot --nginx -d reg.yourdomain.comb. 配置 Nginx 反向代理:
server {
listen 443 ssl;
server_name reg.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/reg.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/reg.yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
重启 Nginx:sudo systemctl restart nginx。
c. 客户端:现在可以直接用域名推送了,无需再配置 insecure-registries。
docker tag nginx:latest reg.yourdomain.com/nginx:latest
docker push reg.yourdomain.com/nginx:latest避坑指南
- 端口冲突:如果 5000 端口被占用,可以换其他端口,注意同时在防火墙和安全组放行。
- 证书问题:使用自签名证书时,客户端需要信任该 CA,否则会报 x509 错误。建议用免费证书(Let's Encrypt)。
- 权限问题:
/data/registry目录所有者必须是 uid 1000(Registry 容器内用户),否则启动会报 permission denied。解决方法:sudo chown 1000:1000 /data/registry。 - 镜像删除后磁盘不释放:Registry 默认采用 GC(垃圾回收)机制,需手动触发:
docker exec my-registry bin/registry garbage-collect /etc/docker/registry/config.yml。 - Docker 版本过旧:建议使用 Docker 20.10+,旧版本可能不支持
insecure-registries或推送限制。
高频问题解答
Q1:如何查看仓库中的镜像列表?
通过 Registry API:curl http://你的IP:5000/v2/_catalog,返回 JSON 格式的镜像名列表。
Q2:如何删除仓库中的镜像?
Registry 默认不提供 HTTP DELETE 接口,需要启用 delete 配置。编辑 /etc/docker/registry/config.yml(挂载配置文件),添加 storage.delete.enabled: true,然后重启容器。之后可以用 curl -X DELETE 删除,但还需手动执行 GC 才能释放空间。
Q3:可以设置用户名密码吗?
可以。使用 htpasswd 创建密码文件,然后通过 REGISTRY_AUTH 环境变量启用基本认证。具体可参考官方文档。
Q4:仓库占用磁盘越来越大怎么办?
定期执行 GC 清理未引用的层。建议配合定时任务(cron)每月执行一次。
Q5:内网可以用域名吗?
当然可以,内网搭好 DNS 或 hosts 指向即可。如果域名没有公网解析,客户端需把域名解析到服务器内网 IP。
效果验证
- 浏览器访问
http://你的服务器IP:5000/v2/_catalog,应返回{"repositories":[]}或包含已推送的镜像。 - 执行
docker pull 你的服务器IP:5000/nginx:latest,若能正常下载则说明仓库正常工作。 - 检查数据目录:
ls -lh /data/registry/docker/registry/v2/repositories/应看到你的镜像名。
就这样,整个 Docker私有仓库搭建 流程就走通了。
如果你正在处理 Docker私有仓库搭建,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。