You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Docker for Windows WSL2中配置容器使用CNTLM代理或PAC方案

解决Docker容器访问Windows CNTLM代理及PAC代理容器方案

一、为什么容器里的127.0.0.1:3128会连接失败?

Docker容器在WSL2环境下有独立的网络命名空间,容器内的localhost指向容器自身,而非Windows主机上的CNTLM代理。这就是你测试时提示“connection refused”的核心原因——你得让容器访问Windows主机在WSL2虚拟网络中的真实IP,而不是127.0.0.1

二、让容器能访问Windows上的CNTLM代理

按以下步骤操作即可打通连通性:

  1. 获取Windows主机在WSL2中的IP

    • 在WSL2终端执行:cat /etc/resolv.conf,输出里的nameserver对应的IP就是Windows主机的IP(比如172.17.0.1,具体以你的实际输出为准)。
    • 或者在Windows命令提示符里执行ipconfig,找到名称带"WSL"的网卡,它的IPv4地址就是目标IP。
  2. 修改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",右键选择重启。
  3. 验证容器连通性
    运行一个临时测试容器,用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文件的容器作为其他容器的统一代理,可以这么实现:

  1. 选择支持PAC的代理镜像
    找一个支持PAC文件的代理工具镜像(比如基于Polipo、Privoxy的镜像,或者专门的PAC代理实现),也可以自己写Dockerfile构建一个。

  2. 运行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
    
  3. 让其他容器使用这个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

火山引擎 最新活动