Nginx反向代理下Docker私有仓库出现unknown blob错误求助
嘿,我来帮你排查这个问题!你遇到的unknown blob错误在Docker Registry搭配Nginx反向代理时挺常见的,咱们一步步来捋可能的原因和解决办法:
1. 补全Nginx反向代理的核心转发规则
你贴出的Nginx配置里,HTTPS的server块只配置了证书信息,但没有把请求转发到Docker Registry的5000端口——这会导致用户请求根本没到达Registry服务,自然会返回错误。
请把HTTPS的server块补全成下面这样:
server { listen 443 ssl; server_name domain.of.the.registry; ssl_certificate /etc/letsencrypt/live/domain.of.the.registry/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.of.the.registry/privkey.pem; # 一定要补全私钥文件路径 # 新增反向代理核心配置 location / { proxy_pass http://localhost: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; } }
注意:ssl_certificate_key的路径要准确指向你的SSL私钥文件,这部分你之前的配置没写完,必须补全。
2. 确保Registry的Secret与请求头正确匹配
你启动Registry时设置了REGISTRY_HTTP_SECRET=banana,这个密钥用于Registry内部的请求签名校验。上面的Nginx配置里已经添加了proxy_set_header Host $host;,这很关键——如果Host头传递不正确,Registry可能会拒绝请求,进而引发unknown blob这类模糊错误。
3. 验证自签证书的配置正确性
你提到已经把证书放到了/etc/docker/certs.d/domain.of.the.registry/目录下,再检查这几点:
- 证书文件名要符合规范:如果是自签根证书,命名为
ca.crt;如果是域名证书,命名为domain.of.the.registry.crt - 确保Docker能读取该证书:执行
chmod 644 /etc/docker/certs.d/domain.of.the.registry/你的证书文件名.crt - 重启Docker服务让证书生效:
systemctl restart docker
4. 针对性排查日志细节
之前你说看日志没头绪,可以聚焦这两个日志源:
- 查看Registry的实时运行日志:
docker logs -f docker_registry,然后尝试推送/拉取镜像,看有没有具体的错误提示(比如权限不足、请求被拒绝的原因) - 查看Nginx的错误日志:
tail -f /var/log/nginx/error.log,排查是否有转发失败、证书无效等记录
5. 分步测试连通性
先验证Registry本身是否正常:在虚拟机本地执行curl http://localhost:5000/v2/_catalog,如果返回{"repositories":[]},说明Registry服务本身没问题。
再验证Nginx转发是否正常:执行curl https://domain.of.the.registry/v2/_catalog,如果同样返回正确的JSON,说明Nginx的转发链路是通的。
6. 排查镜像推送环节的问题
如果前面的测试都正常,推送镜像仍报错,试试这些操作:
- 用官方镜像测试:拉取一个官方镜像(比如
nginx:alpine),重新打标签后推送:
如果这个操作也报错,说明问题不在你自己的镜像上;如果成功,那可能是你原镜像本身损坏。docker tag nginx:alpine domain.of.the.registry/test-nginx docker push domain.of.the.registry/test-nginx - 检查Docker daemon配置:查看
/etc/docker/daemon.json,如果之前配置过insecure-registries,可能和证书配置冲突,建议暂时注释掉该配置,重启Docker后再测试。
修改完配置后,记得重启Nginx(systemctl restart nginx)和Registry服务,再重新测试哦!
备注:内容来源于stack exchange,提问作者Alvaro Maceda

