零基础吃透 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.168、10、172.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/8、172.16.0.0/12、192.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一起成长~
转载请注明原文链接:https://www.cnblogs.com/jyzhao/p/21753537
👋 感谢阅读,欢迎关注我的公众号 「赵靖宇」
浙公网安备 33010602011771号