对普通桥接网络容器而言,127.0.0.1 是容器自己的回环地址。监听在笔记本 localhost 上的代理,不会自动在每个容器内监听。

这能解释一种常见差异:看起来相同的代理 URL 在宿主机终端可用,容器内却提示连接被拒绝。这个地址在两处指向不同的网络端点。

公共代理可以直接使用

如果从服务或HTTP 代理列表选出的端点确实是可达的公网 IP,就把该地址传给应用,不要改成 localhost:

docker run --rm \
  -e HTTP_PROXY=http://203.0.113.10:8080 \
  -e HTTPS_PROXY=http://203.0.113.10:8080 \
  your-image

替换文档示例地址和镜像。镜像内的程序仍须支持这些环境变量;Docker 不会仅因变量存在,就把每个 socket 都变成代理请求。

代理运行在 Docker 宿主机上时

Docker Desktop 提供 host.docker.internal 来访问宿主机内部地址。在受支持的原生 Engine 环境中,可以通过主机映射提供这个约定名称:

docker run --rm \
  --add-host host.docker.internal=host-gateway \
  -e HTTP_PROXY=http://host.docker.internal:8080 \
  -e HTTPS_PROXY=http://host.docker.internal:8080 \
  your-image

这改变的是名称解析,不是端口转发命令。在原生 Linux 上,仅绑定宿主机回环地址的服务,通过宿主桥接地址仍可能无法访问。监听端、防火墙和容器路由都必须允许这条连接。如果修改监听配置,请限制为确实需要访问的客户端,避免创建未经认证的开放代理。

从与应用相同的位置测试

宿主机上的 curl 结果只检查宿主机路线。应从容器环境发送相关请求,确认它到达的是预期端点。

“宿主机”还指运行 Docker Engine 的机器。使用远程 Engine 时,它未必是你的笔记本。因此,从本地桌面应用复制的回环 IP,尤其不太可能原样适用于远程构建器或服务器。

镜像拉取问题应单独排查:守护进程下载镜像在先,应用使用上述环境变量在后。

相关文章