终端怎么走代理?git、npm、Docker 的代理设置
终端程序默认不读系统代理,要让 git、npm、Docker 走代理,可以设环境变量、用各工具自己的代理配置,或直接开 TUN。Docker 要分清拉取镜像的守护进程代理和容器内代理。端口以你的客户端显示为准,设完要逐项验证。
终端代理要单独设置,因为终端里的程序默认不读系统代理。命令行工具通常只认环境变量或自己的配置文件,所以你开了客户端、浏览器能上,但 git clone、npm install、docker pull 依然很慢或直接失败。解决思路有三种:设环境变量、给每个工具配代理、直接开 TUN。下面按这个顺序,把 git、npm 和 Docker 逐个讲清楚,命令里的端口都是占位,以你的客户端显示为准。
终端为什么不走系统代理,有哪几种办法
你在客户端里打开的“系统代理”,只是往操作系统里写了一项设置,浏览器等图形程序会去读,原理见系统代理怎么设置。命令行工具大多不读这项设置,而是自己约定了一套读法:先看环境变量,再看自己的配置文件。
让终端代理生效,有三条路:
| 做法 | 怎么做 | 优点 | 缺点 | 适合 |
|---|---|---|---|---|
| 环境变量 | 在终端里设置代理变量 | 通用,多数命令行工具都认 | 每个终端窗口要单独设,容易忘记关 | 临时使用 |
| 工具自己的配置 | 给 git、npm 等分别写代理配置 | 持久,可以只对特定地址生效 | 每个工具要各配一遍 | 常用工具长期使用 |
| TUN 模式 | 在网络层接管全部流量 | 不用逐个工具设置,覆盖面广 | 需要更高权限,可能与其他软件冲突 | 工具太多,懒得逐个设 |
没有哪一种是标准答案,下面按这个顺序展开。
环境变量:最通用的命令行代理
多数命令行工具会读下面几个变量,名字大小写在不同工具里有差异,同时设置大小写两种写法最省事:
| 变量 | 作用 |
|---|---|
| http_proxy | HTTP 请求使用的代理 |
| https_proxy | HTTPS 请求使用的代理 |
| all_proxy | 所有协议使用的代理,常用来填 SOCKS 地址 |
| no_proxy | 不走代理的地址列表,用逗号隔开 |
代理地址的写法是协议加本机地址再加端口。客户端的混合端口同时支持 HTTP 和 SOCKS,端口请填你的客户端显示的数字,下面用“端口号”占位:
macOS 和 Linux 的 bash、zsh 里这样写:
export http_proxy=http://127.0.0.1:端口号
export https_proxy=http://127.0.0.1:端口号
export all_proxy=socks5://127.0.0.1:端口号
export no_proxy=localhost,127.0.0.1
Windows 的 PowerShell 里这样写:
$env:http_proxy = "http://127.0.0.1:端口号"
$env:https_proxy = "http://127.0.0.1:端口号"
$env:no_proxy = "localhost,127.0.0.1"
在 Windows 的命令提示符里,写法是 set https_proxy=http://127.0.0.1:端口号。这些设置只对当前窗口有效,关掉窗口就没了。
不建议把它们永久写进配置文件,否则客户端一关,终端里所有联网命令都会报“连接被拒绝”。更稳妥的做法是写成一对开关,需要时开、用完关:
proxy_on() { export http_proxy=http://127.0.0.1:端口号 https_proxy=http://127.0.0.1:端口号; }
proxy_off() { unset http_proxy https_proxy all_proxy; }
git 代理怎么设置:HTTPS 和 SSH 两种地址不一样
用 git 克隆仓库,地址有两种形式,代理的设置方式完全不同。这两种形式的区别和认证,可以参考 GitHub 文档。
| 仓库地址形式 | 例子 | 怎么走代理 |
|---|---|---|
| HTTPS 地址 | 以 https 开头 | 设置 git 的 http.proxy,或用环境变量 |
| SSH 地址 | 形如“用户名@主机:路径” | git 的 http.proxy 不管用,需要在 SSH 配置里设转发方式,或改用 HTTPS 地址 |
对 HTTPS 地址,git 代理可以这样设:
git config --global http.proxy http://127.0.0.1:端口号
git config --global http.https://example.com.proxy http://127.0.0.1:端口号
git config --global --unset http.proxy
三条命令依次是:全局生效,所有 HTTP 和 HTTPS 地址都走代理;只让某个域名走代理,其余保持直连,这里的 example.com 要换成你自己需要的域名;取消全局设置。
第二条更值得推荐:只对确实需要代理的域名生效,国内的仓库和公司内部的仓库就不会被误带去绕路。
SSH 地址的转发写法因系统和工具而异,容易出错,最省事的办法往往是把仓库的远程地址改成 HTTPS 形式,再用上面的方式设置。想深入了解时以 SSH 工具和 GitHub 文档为准。
另外,开发者日常用到的 GitHub 访问问题,场景层面的思路可以看GitHub 打开慢用什么梯子。
npm 代理和其他包管理工具
npm 自己有一套代理配置,也认环境变量:
npm config set proxy http://127.0.0.1:端口号
npm config set https-proxy http://127.0.0.1:端口号
npm config delete proxy
npm config delete https-proxy
前两条是设置,后两条是取消。
查看当前值:npm config get proxy 和 npm config get https-proxy。
其他常用工具的做法大同小异,下表只描述思路,具体配置项以各工具文档为准:
| 工具类型 | 一般的做法 |
|---|---|
| curl、wget | 认环境变量,也有各自的命令行选项 |
| pip 等语言包管理器 | 认环境变量,通常也有命令行选项或配置项 |
| yarn、pnpm | 各有自己的配置项,或沿用环境变量,以文档为准 |
| 命令行里的 AI 编程工具 | 多数认环境变量,见 AI 编程工具用什么梯子 |
要注意:设置 npm 代理后,如果你同时在用国内的镜像源,这些请求也会被带去走代理,可能反而变慢。要么只在需要访问海外源时开,要么用例外名单把国内地址排除。
Docker 的代理:拉镜像和容器内是两件事
Docker 的代理最容易搞混,因为有两个独立的环节:
| 环节 | 谁在联网 | 要配在哪里 |
|---|---|---|
| 拉取和推送镜像 | Docker 的守护进程 | 守护进程自己的代理设置,不继承终端环境变量 |
| 容器里运行的程序联网 | 容器内部的进程 | 容器自己的环境变量,或 Docker 客户端的配置 |
第一件,守护进程的代理。 Linux 上通常通过服务管理器给守护进程加环境变量,大意是在它的服务配置里写入代理变量,然后重新加载并重启 Docker。Docker Desktop 则在设置里提供代理选项,位置随版本变化。具体步骤以 Docker 官方文档为准。
第二件,容器内的代理。 有两种常见方式:运行时用参数传入代理变量,或者在 Docker 客户端的配置文件里统一设置,示意如下:
{
"proxies": {
"default": {
"httpProxy": "http://主机地址:端口号",
"httpsProxy": "http://主机地址:端口号",
"noProxy": "localhost,127.0.0.1"
}
}
}
这里最大的坑是地址。容器里的 127.0.0.1 指的是容器自己,不是你的电脑。要让容器访问宿主机上的代理,需要填宿主机对容器可见的地址:Docker Desktop 一般提供一个指向宿主机的主机别名,Linux 上要用宿主机的网络地址,具体写法以 Docker 文档为准。
同时,客户端必须允许来自局域网或容器网络的连接,这意味着代理端口会对外开放,只在需要时开,不要长期暴露,局域网共享的注意事项见局域网共享代理。
什么时候直接开 TUN 更省事
如果你要配的工具太多,或者遇到的程序连环境变量都不认,直接开 TUN 模式 往往更省事:它在网络层接管整台电脑的流量,宿主机上发出的命令行流量一般都会被接住。
按你的情况选:
- 只用 git 和 npm、偶尔用: 环境变量加开关函数就够了。
- 长期用某几个工具: 给它们各配一次,做成持久的设置,最好限定到具体域名。
- 工具多、不想逐个配: 开 TUN,但要接受权限和冲突的代价。
- Docker 要拉镜像: 不论用哪种办法,都要验证守护进程那一环,别只验证终端。
TUN 对容器内部流量是否也生效,要看容器的网络模式,以你的实际验证为准。
怎么确认终端代理已经生效
设置完不要靠感觉,按工具逐项验证:
- 环境变量。 在终端运行
echo $https_proxy(PowerShell 里是$env:https_proxy),看到你设的地址才算设上。 - curl 的详细输出。 运行
curl -v访问任意网址时,输出里会有一行说明是否使用了环境变量里的代理,可以直接看到它读到了什么。 - 客户端的连接页面。 这是最可靠的一步。执行一条联网命令,看客户端的连接记录里有没有出现这条连接、命中了什么规则。没有记录,说明请求根本没到客户端。
- git。 运行
git config --global --get http.proxy查看配置。想看细节可以在命令前加上GIT_CURL_VERBOSE=1。 - npm。 运行
npm config get proxy查看配置,再用npm ping测试能否连通仓库。 - Docker。 运行
docker info,输出里会显示守护进程当前使用的 HTTP 和 HTTPS 代理。容器内部可以进入容器后查看环境变量。
出问题时,对照这张表:
| 现象 | 常见原因 | 先做什么 |
|---|---|---|
| 提示连接被拒绝 | 客户端没开,或端口不对 | 打开客户端,核对端口 |
| 设了但连接页面没记录 | 环境变量没设上,或工具不读它 | 重新检查变量,或改用工具自己的配置 |
| 国内地址变慢 | 国内地址也被带去走代理 | 用例外名单,或只对特定域名生效 |
| Docker 拉镜像失败,终端正常 | 守护进程没配代理 | 在守护进程的设置里配置 |
| 容器里连不上宿主机的代理 | 地址写成了 127.0.0.1,或代理端口不允许外部连接 | 改成宿主机对容器可见的地址,并检查是否允许局域网连接 |
| 关了客户端后命令一直报错 | 环境变量或工具配置还指向它 | 执行 unset 或 –unset 清理 |
下一步:先设环境变量,再按需持久化
- 先用开关函数在一个终端窗口里试通,并在客户端连接页面确认有记录。
- 常用的 git、npm 再各配一次持久设置,尽量限定到需要的域名。
- 用 Docker 的话,分清守护进程和容器内两件事,分别验证。
- 觉得逐个配置太繁琐,考虑 TUN 模式;想知道哪些软件管不到,看某个 App 不走代理怎么办。
- 还没有稳定的订阅,先到梯子推荐按开发用途筛选候选,再核对退款和设备数规则。
这篇没有覆盖的
- 命令示例里的端口、地址均为占位,请替换为你的客户端实际显示的值。
- 各工具的配置项和 Docker 的设置位置会随版本变化,具体写法以对应工具的官方文档为准。
- 本文不提供测速结果,也不涉及任何公司内网或受管设备的特殊限制。
选梯子推荐榜目前排在前面的机场
下面是推荐榜的前几名。名次不是测速名次;价格与线路按资料原样列出,付款前到官网结账页面再核对一遍。
| 推荐名次 | 机场 | 推荐档 | 资料里的价格 | 线路 |
|---|---|---|---|---|
| 1 | 无忧链接 | 首推 | 合¥6/月 · 40GB/月(按年付费) | IPLC |
| 2 | 暮光加速 | 重点推荐 | 年付¥109(约¥9.1/月) · 70GB(按年付费) | IEPL |
| 3 | 微风网络 | 重点推荐 | ¥27/月 · 200GB(按月付费) | IEPL |
| 4 | 飞猫云 | 重点推荐 | 约¥7/月起(年付¥84) · 50GB(按年付费) | IPLC |
| 5 | Firefly | 重点推荐 | 约¥8/月起 · 60GB(按年付费) | IPLC |
| 6 | 灵动云 | 优先考虑 | 年付¥99(约¥8.3/月) · 70GB(按年付费) | IEPL |
| 7 | 隐形人 | 优先考虑 | 年付¥109(约¥9.08/月) · 80GB(按年付费) | 纯专线 |
| 8 | 梯子云 | 优先考虑 | 年付¥89(约¥7.4/月) · 60GB(按年付费) | IEPL |
本文引用的官方来源
- GitHub 文档(docs.github.com)
以上链接均为官方页面,选梯子在 2026-10-08 核对过;个别网站会拦截自动化访问,用浏览器直接打开即可。平台规则可能随时调整,以官方页面当前内容为准。
终端代理常见问题
为什么开了系统代理,终端里的 git 和 npm 还是很慢?
因为系统代理只是一项系统设置,由应用自己决定读不读。命令行工具通常只读环境变量或自己的配置文件,不会读系统设置,所以请求还是走了直连。解决办法是给它们设环境变量、配置工具自己的代理,或者开 TUN 让流量在网络层被接管。
环境变量里的代理该写成 http 还是 socks5?
客户端的混合端口同时支持两种,写哪种都能用,最通用的是 http 开头的写法。个别工具只认 socks5,就按它的要求写。如果希望域名交给代理端解析,可以用工具文档里关于远程解析的写法,例如部分工具的 socks5h,具体以工具文档为准。
git 用 SSH 地址克隆时怎么走代理?
git 配置里的 http.proxy 只对 HTTP 和 HTTPS 地址生效,SSH 地址不读它。可以改用 HTTPS 形式的仓库地址,或者在 SSH 配置里设置通过代理转发的方式,写法因系统而异,以 SSH 工具和 GitHub 文档为准。
Docker 拉镜像要配代理,为什么在终端设了环境变量没用?
因为拉取镜像的是 Docker 的守护进程,它不继承你当前终端的环境变量。需要在守护进程自己的配置里设置代理,或者在 Docker Desktop 的设置里填写。容器内部要不要代理,则是另一件事,需要单独配置。
设了代理之后,国内的仓库和镜像源反而变慢,怎么办?
说明国内地址也被带去走了代理。可以用不走代理的例外名单,把国内地址排除;git 可以只给特定域名配置代理,只让需要的地址走代理。终端代理的原则是:只给确实需要的工具、需要的地址开。
接着读
- 使用场景 · GitHub 打开慢用什么梯子?开发者的代理配置思路
- 使用场景 · AI 编程工具用什么梯子?Copilot 与 Cursor
- 使用教程 · TUN 模式是什么?什么时候该开、怎么开
- 使用教程 · 系统代理怎么设置?和 TUN 模式的区别与适用场景
- 故障排查 · 某个 App 不走代理怎么办?系统代理管不到的流量
- 使用教程 · 局域网共享代理:让电视、游戏机用上电脑的梯子