代码改变世界

零基础吃透 Linux & Docker 代理:别再让内网请求翻车

2026-07-21 23:49  AlfredZhao  阅读(0)  评论(0)    收藏  举报

很多企业内网服务器、测试机器不能直接访问外网,但又需要调用外网接口、大模型 API,或者下载软件包。常见做法是配置 HTTP/HTTPS 正向代理。

真正容易踩坑的地方不在“怎么让外网通”,而在“别让内网也被代理”。只配代理、不配内网豁免,常见结果就是:外网能访问,本机服务、内网数据库、缓存却开始超时。

01 | Linux 代理的核心逻辑

代理可以理解成一个“跑腿”。机器不能直接访问外网,就把请求交给代理服务器,由代理去访问外网,再把结果带回来。

Linux 上最常见的配置是环境变量:

export http_proxy=http://代理IP:端口
export https_proxy=http://代理IP:端口

但这只是半套配置。Linux 不会自动排除内网网段。虽然新版curl会自动放行localhost、127.0.0.1,但Java、Python、Go等程序没有这套兜底逻辑。一旦开启代理,内网地址请求会全部转发代理,引发超时故障,例如会导致本机服务访问异常,192.16810172.16 等内网地址连接失败,项目里的本地接口、内网数据库、缓存也可能超时。

正确配置必须同时包含 no_proxy

export http_proxy=http://你的代理IP:端口
export https_proxy=http://你的代理IP:端口
export no_proxy=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
export NO_PROXY=$no_proxy

其中 no_proxy 表示这些地址不走代理,直接内网访问。大写 NO_PROXY 是为了兼容只识别大写变量的程序。

临时测试时,直接在当前终端执行即可;如果要长期生效,可以写入 /etc/profile

vi /etc/profile
source /etc/profile

验证时可以分别测试外网、本机和内网:

curl 外网大模型地址
curl localhost
curl 内网服务器IP

02 | Docker 容器代理不能想当然

Docker 容器不会自动继承宿主机的系统代理变量。即使 Linux 本机代理已经配好,容器内部程序也需要单独配置。

很多人启动容器时只写:

docker run \
-e http_proxy=http://代理IP:端口 \
-e https_proxy=http://代理IP:端口 \
镜像名

这和 Linux 本机的错误一样:缺少 no_proxy。容器里的本机和内网请求也可能被送去代理,最后表现为连接超时或服务不可用。

更完整的写法是:

docker run \
-e http_proxy=http://你的代理IP:端口 \
-e https_proxy=http://你的代理IP:端口 \
-e no_proxy=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 \
-e NO_PROXY=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 \
你的镜像名

已经运行的旧容器,不能直接新增或修改启动时的环境变量。临时补救可以进入容器手动设置,但重启会失效:

docker exec -it 容器名 bash
export no_proxy=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
export NO_PROXY=$no_proxy

长期稳定使用时,应停止并删除旧容器,再用完整参数重新启动。这里只删除容器,不会删除镜像。

还要分清三类 Docker 代理:docker run -e 影响容器内部程序访问外网;Docker daemon 代理影响 docker pull 拉镜像;config.json 全局容器代理则适合让新建容器自动带代理。

03 | 最后记住这份模板

只要配置 HTTP/HTTPS 代理,就必须同时配置 no_proxy。Linux 本机代理和 Docker 容器代理互相独立,不能混为一谈。内网三大网段 10.0.0.0/8172.16.0.0/12192.168.0.0/16,建议全部加入豁免。

Linux 本机模板:

export http_proxy=http://代理IP:端口
export https_proxy=http://代理IP:端口
export no_proxy=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
export NO_PROXY=$no_proxy

Docker 容器模板:

docker run \
-e http_proxy=http://代理IP:端口 \
-e https_proxy=http://代理IP:端口 \
-e no_proxy=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 \
-e NO_PROXY=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 \
你的镜像名

关注我,和AI一起成长~