使用官方registry:2镜像可快速搭建私有仓库:docker run -d -p 5000:5000 --restart=always --name registry registry:2;需持久化则挂载-v /opt/registry:/var/lib/registry;HTTP测试需配置insecure-registries,生产环境必须配TLS及认证。

搭建私有 Registry 服务
使用官方 registry 镜像最简单可靠。运行以下命令即可启动一个默认监听 5000 端口的私有仓库:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
若需持久化存储镜像数据,务必挂载本地目录(如 /opt/registry)到容器内 /var/lib/registry:
docker run -d -p 5000:5000 --restart=always -v /opt/registry:/var/lib/registry --name registry registry:2
如需 HTTPS 支持(生产环境必需),必须配置 TLS 证书,并通过 -e REGISTRY_HTTP_TLS_* 环境变量指定证书路径;同时客户端需信任该证书,否则会报 http: server gave HTTP response to HTTPS client 错误。
配置 Docker 客户端信任私有 Registry
默认情况下,Docker 只信任 HTTPS 的 registry 或明确标记为 insecure 的 HTTP 地址。若用 HTTP 协议(仅限测试),需在所有需推送/拉取的节点上修改 Docker daemon 配置:
- 编辑
/etc/docker/daemon.json,添加 insecure-registries 条目:
{"insecure-registries":["192.168.1.100:5000"]}
- 重启 Docker:
sudo systemctl restart docker - 登录 registry(即使不鉴权,也建议启用 basic auth 防未授权写入):
docker login 192.168.1.100:5000
若启用了 basic auth,需先用 htpasswd 创建用户文件并挂载进 registry 容器,再通过 REGISTRY_AUTH 环境变量启用。
推送与拉取镜像并打标签
私有 registry 要求镜像名必须带地址前缀。例如将本地 nginx 推送到 192.168.1.100:5000:
- 重打标签:
docker tag nginx:alpine 192.168.1.100:5000/myapp/nginx:1.24 - 推送:
docker push 192.168.1.100:5000/myapp/nginx:1.24 - 拉取:
docker pull 192.168.1.100:5000/myapp/nginx:1.24
推荐使用项目/团队命名空间(如 myapp/、infra/)组织镜像,避免顶层命名冲突。语义化版本号(如 1.24.0)比 latest 更利于追踪和回滚。
实现镜像生命周期管理
官方 registry 自身不提供 UI 或自动清理能力,需结合外部工具或手动操作:
-
查看镜像列表:调用 registry v2 API,例如
curl -X GET http://192.168.1.100:5000/v2/_catalog?n=100 -
获取某镜像的所有 tag:
curl -X GET http://192.168.1.100:5000/v2/myapp/nginx/tags/list -
删除镜像:registry 默认禁用删除。需在启动时加
-e REGISTRY_STORAGE_DELETE_ENABLED=true,再调用 delete API 或使用 registry-browser 等第三方 Web UI - 自动清理策略:可用 garbage-collect 工具定期扫描未被 manifest 引用的 blob 并释放空间
生产环境中建议接入 Harbor —— 它原生支持权限控制、镜像扫描、保留策略(按时间/数量自动清理旧 tag)、Web 控制台和 webhook 通知,大幅降低运维复杂度。


















