手把手教你用Docker部署Registry私有镜像仓库
为什么需要自建Registry
团队内部或跨服务器分发镜像时,频繁推送到Docker Hub既不安全又受网速限制。
自建一个私有Registry可以完全控制镜像存储、访问权限,并且拉取速度极快。
Docker官方提供了registry镜像,几行命令就能跑起来。
准备工作
- 一台Linux服务器(CentOS 7+或Ubuntu 18.04+),已安装Docker和docker-compose(可选)。
- 一个域名(如
registry.example.com)并解析到服务器IP。 - 为域名申请SSL证书(Let's Encrypt免费证书即可),或使用自签名证书(需客户端配置跳过验证)。
- 服务器防火墙开放443端口(HTTPS)和5000端口(如果不用HTTPS直接暴露)。
- 确认Docker服务运行正常:
systemctl status docker。
启动Registry容器
最简方式直接运行容器,将数据持久化到宿主机,避免容器删除后镜像丢失。
mkdir -p /data/registry
docker run -d \
--restart=always \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
--name registry \
registry:2
此时Registry已监听本机5000端口(HTTP)。
如果需要HTTPS,需挂载证书并指定配置。
配置HTTPS(推荐)
将证书和私钥放在/data/certs/下,例如domain.crt和domain.key,然后启动容器时添加证书路径和环境变量:
docker run -d \
--restart=always \
-p 443:5000 \
-v /data/registry:/var/lib/registry \
-v /data/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
--name registry-ssl \
registry:2
访问https://registry.example.com/v2/_catalog应返回{"repositories":[]}。
测试推拉镜像
- 在客户端给本地镜像打标签:
docker pull nginx:alpine && docker tag nginx:alpine registry.example.com/nginx:alpine - 登录Registry(如果配置了认证):
docker login registry.example.com - 推送镜像:
docker push registry.example.com/nginx:alpine - 从其他主机拉取:
docker pull registry.example.com/nginx:alpine
若未配置HTTPS且Docker守护进程未配置insecure-registries,推送会报错http: server gave HTTP response to HTTPS client。
解决办法见下文。
常见问题与避坑
Q:客户端报错“http: server gave HTTP response to HTTPS client”
A:Registry默认要求HTTPS。若仅测试用,可在客户端Docker配置中添加"insecure-registries": ["registry.example.com"](或IP加端口),然后重启Docker:systemctl restart docker。
Q:容器重启后镜像丢失
A:启动容器时必须使用-v将/var/lib/registry挂载到宿主机持久目录。
Q:如何限制存储大小或启用认证?
A:通过挂载自定义config.yml配置storage.delete.enabled、auth.htpasswd等。官方文档有详细说明。
Q:推送到一半网络中断怎么办?
A:Registry支持断点续传,重新执行docker push即可覆盖同标签的层。
总结
从零搭建私有Docker Registry只需要几行命令,但生产环境一定要开启HTTPS并考虑认证与存储限制。
遇到异常时,先查看容器日志docker logs registry,大多问题都能定位。
希望本文能帮你顺利跑起自己的镜像仓库。