Sonatype Nexus Docker代理出现Bad Request错误该如何调试?
排查解决步骤
- 修正Docker客户端的镜像代理配置逻辑:你当前混淆了Docker全局HTTP代理和镜像仓库代理的配置方式,对接Nexus Docker镜像代理不需要配置
httpsProxy参数,该参数是用于Docker daemon走HTTP代理访问外部网络的场景,不是用于指定私有镜像仓库代理的。先删除三处错误的httpsProxy配置:- 删除
/home/myuser/.docker/config.json中的httpsProxy相关配置 - 删除
/etc/systemd/system/docker.service.d/https-proxy.conf文件 - 执行
systemctl daemon-reload重载系统服务配置
- 删除
- 正确配置镜像仓库代理:在
/etc/docker/daemon.json中添加registry-mirrors配置,指向你的Nexus Docker代理地址,示例如下:
{ "registry-mirrors": ["https://<你的Nexus服务域名或IP>:8443"], "debug": true }
配置完成后执行systemctl restart docker重启Docker服务。
- 验证Nexus服务连通性:在客户端执行curl命令测试接口可用性
允许匿名拉取的情况下应返回200状态码,如果返回证书错误,检查证书存放路径:curl -v https://<你的Nexus服务域名或IP>:8443/v2//etc/docker/certs.d/下的子目录名必须和Nexus访问地址完全一致(含端口),证书文件必须命名为ca.crt。 - 检查Nexus侧端口暴露情况:确认docker-compose配置中已将8443端口映射到宿主机,且服务器防火墙、安全组已开放8443端口的入站访问权限。
- 测试指定仓库地址拉取:如果配置镜像代理后还是报错,直接执行
docker pull <你的Nexus服务域名或IP>:8443/library/hello-world:latest测试,如果该命令执行成功,说明镜像代理配置未生效,可检查docker info输出的Registry Mirrors字段是否为你配置的Nexus地址。 - 查看Nexus请求日志:之前你查看的是服务运行日志,Nexus默认会在日志目录生成
request.log,记录所有入站请求的路径、状态码、来源IP,可通过该日志确认客户端请求是否到达Nexus,以及Nexus返回的状态码具体是多少。 - 抓包确认请求流向:如果还是无法定位问题,在客户端执行
tcpdump抓包,确认pull请求的目标地址是Nexus还是Docker Hub,以及返回Bad Request的具体服务端。
内容的提问来源于stack exchange,提问作者EdwardTeach
相关产品推荐
相关产品推荐

