如何在Docker for Windows WSL2中配置容器使用CNTLM代理或PAC方案
一、为什么容器里的127.0.0.1:3128会连接失败?
Docker容器在WSL2环境下有独立的网络命名空间,容器内的localhost指向容器自身,而非Windows主机上的CNTLM代理。这就是你测试时提示“connection refused”的核心原因——你得让容器访问Windows主机在WSL2虚拟网络中的真实IP,而不是127.0.0.1。
二、让容器能访问Windows上的CNTLM代理
按以下步骤操作即可打通连通性:
获取Windows主机在WSL2中的IP
- 在WSL2终端执行:
cat /etc/resolv.conf,输出里的nameserver对应的IP就是Windows主机的IP(比如172.17.0.1,具体以你的实际输出为准)。 - 或者在Windows命令提示符里执行
ipconfig,找到名称带"WSL"的网卡,它的IPv4地址就是目标IP。
- 在WSL2终端执行:
修改CNTLM配置,允许外部访问
- 打开Windows上的CNTLM配置文件(通常路径是
C:\Program Files (x86)\Cntlm\cntlm.ini)。 - 将
Listen行从默认的Listen 127.0.0.1:3128改成Listen 0.0.0.0:3128,这样就能允许WSL2和Docker容器访问了。 - 重启CNTLM服务:在Windows服务列表找到"Cntlm Proxy",右键选择重启。
- 打开Windows上的CNTLM配置文件(通常路径是
验证容器连通性
运行一个临时测试容器,用curl验证代理是否可用:docker run --rm alpine curl -x http://<windows-wsl-ip>:3128 https://your-corporate-url把
<windows-wsl-ip>换成你刚才获取的IP,your-corporate-url换成公司内部地址,如果能正常返回内容,说明代理连通正常。
三、修复Docker代理配置不生效的问题
1. 针对Jenkins容器自身的代理设置
在Jenkins的全局代理配置界面,把代理地址从127.0.0.1:3128改成刚才获取的Windows WSL IP:3128,保存后再测试连接,应该就能成功了。
2. 针对Docker容器/构建过程的代理配置
如果你希望Docker daemon或者镜像构建过程使用代理,需要修改WSL2中的/etc/docker/daemon.json(没有的话直接创建):
{ "proxies": { "default": { "httpProxy": "http://<windows-wsl-ip>:3128", "httpsProxy": "http://<windows-wsl-ip>:3128", "noProxy": "localhost,127.0.0.1,内部Docker服务地址" } } }
修改完成后重启Docker daemon:sudo systemctl restart docker
如果只是单个容器运行时需要代理,直接通过环境变量传递即可:
docker run -e HTTP_PROXY=http://<windows-wsl-ip>:3128 \ -e HTTPS_PROXY=http://<windows-wsl-ip>:3128 \ -e NO_PROXY=localhost,127.0.0.1 \ 你的容器镜像名
四、理想方案:用PAC代理容器统一管理
想要一个能加载PAC文件的容器作为其他容器的统一代理,可以这么实现:
选择支持PAC的代理镜像
找一个支持PAC文件的代理工具镜像(比如基于Polipo、Privoxy的镜像,或者专门的PAC代理实现),也可以自己写Dockerfile构建一个。运行PAC代理容器
假设你本地有proxy.pac文件,运行容器时挂载该文件并暴露代理端口:docker run -d \ --name pac-proxy \ -p 3129:3129 \ -v /本地/pac文件路径/proxy.pac:/etc/proxy.pac \ # 替换成对应镜像的启动命令,指定PAC文件路径和监听端口 你的PAC代理镜像名 --pac-file /etc/proxy.pac --listen 0.0.0.0:3129让其他容器使用这个PAC代理
其他容器可以通过PAC代理容器的IP或者容器名(如果在同一个Docker网络)来设置代理:docker run -e HTTP_PROXY=http://pac-proxy:3129 \ -e HTTPS_PROXY=http://pac-proxy:3129 \ --network 你的共享网络名 \ 你的业务容器镜像名这样所有容器的流量都会通过这个PAC代理容器自动路由,不用每个容器单独配置规则,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者dermoritz




