一次配齐所有国内镜像:pip / npm / Docker / apt / Homebrew / Go / Cargo 的配置与验证速查

· 约 4 分钟 🪞 国内镜像源

每换一台电脑、每带一个新人,都要把「pip 换源」「npm 换源」「docker 加速」挨个搜一遍——这页把七个包管理器的配置、验证和各自的坑集中收编。镜像站地址本身有时效性,具体地址以国内镜像源速查里维护的清单为准,本文管「怎么配、怎么验、哪里会翻车」。

总表

工具配置方式验证命令特有的坑
pippip config set global.index-url <url>pip config list多级配置互相覆盖
npm/pnpmnpm config set registry <url>npm config get registrylockfile 固化旧 URL
Dockerdaemon.jsonregistry-mirrorsdocker info终端环境变量无效;只对 docker.io 生效
apt改源文件后 apt updateupdate 输出域名24.04 起换 deb822 格式
Homebrewshell 里 export 环境变量安装时看下载域名靠环境变量不是配置文件
Gogo env -w GOPROXY=<url>,directgo env GOPROXY私有库要配 GOPRIVATE
Cargo~/.cargo/config.toml source 替换cargo add 看日志用 sparse 索引别用 git 索引

Python / Node:一条命令,一个陷阱

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
npm config set registry https://registry.npmmirror.com

临时单次使用不改全局:pip install xxx -i <url>npm i --registry=<url>。pnpm 和 yarn 读同一套 .npmrc,配一次全家生效。

npm 的 lockfile 陷阱值得单独画重点package-lock.json 给每个包固化了 resolved 字段的完整下载 URL。换源前生成的 lockfile,npm ci 照旧按老 URL 下载——你以为换了源,其实一个字节都没走镜像。解法:删 node_modules 和 lockfile 重装一次,让新 URL 落盘;团队项目直接把 .npmrc 提交进仓库,从第一天锁定。pip、Go、Cargo 的锁文件记录的是版本与哈希而非 URL,没有这个问题。

Docker:环境变量到不了守护进程

Docker 拉镜像的翻车点几乎全在一个认知上:docker pull 的下载由 dockerd 守护进程执行,你终端里 export 的代理变量它完全看不见。正确入口只有两个:

// /etc/docker/daemon.json
{ "registry-mirrors": ["https://<加速器地址>"] }

改完 systemctl restart docker,用 docker info 确认底部列出了 Registry Mirrors——没出现在 docker info 里就是没生效,别靠体感判断。要走代理则写 systemd drop-in(/etc/systemd/system/docker.service.d/proxy.confEnvironment="HTTPS_PROXY=...")。Docker Desktop 用户在 Settings → Docker Engine 里改同样的 JSON。

两个范围限制:registry-mirrors 只对 Docker Hub 生效,ghcr.io / quay.io / registry.k8s.io 不走它;K8s 节点上的 containerd 也不读 Docker 的配置,要单独配。Docker Hub 具体拉不动时的完整出路(前缀替换、代理、云上同步),展开在Docker Hub 拉不动的几条出路

apt / Homebrew:系统级的两个注意点

apt:Ubuntu 22.04 及以前改 /etc/apt/sources.list,把 archive.ubuntu.comsecurity.ubuntu.com 替换为镜像域名;24.04 起源移到了 /etc/apt/sources.list.d/ubuntu.sources(deb822 格式),改的是 URIs: 字段——按老教程去改 sources.list 会发现它几乎是空的。改完 apt update 看输出域名。安全提醒:security 通道换成镜像站的同步源没问题,但别为省事注释掉。

Homebrew:不用配置文件,靠环境变量——HOMEBREW_API_DOMAINHOMEBREW_BOTTLE_DOMAIN 等写进 ~/.zshrc,中科大、清华镜像站都给出成套的官方配置片段,照抄即可。

Go / Cargo:各有一个专属注意项

go env -w GOPROXY=https://goproxy.cn,direct

尾部 direct 表示镜像缺失时回源直连。Go 专属注意项是私有仓库GOPRIVATE=*.corp.example.com 必须配,否则内部模块名会被发往公网代理和校验服务器——既拉不到,还泄露了内部包名。

Cargo 在 ~/.cargo/config.toml 里做 source 替换,认准 sparse 索引sparse+https://.../crates.io-index/ 形式,rsproxy、高校站均提供)——按需拉取索引,比老式 git 全量索引快一个量级。

配完之后:验证和三个「换了还是慢」

每配一个立刻验一个:先 config list最终生效值(pip 的 user/global 多级、npm 的项目级 .npmrc 都会互相覆盖,看生效值而不是看你改的那个文件),再实际装个小包看下载域名。全配完统一排错会分不清哪层坏了。

换了源仍然翻车的三大原因:

  1. 镜像同步延迟——镜像站周期性从上游同步,刚发布的版本有分钟到小时级的空窗,症状是「官网有、镜像 404」。临时指回官方源装这一个包即可。
  2. 残留代理变量——env | grep -i proxy,失效代理还挂着的话,请求根本没到镜像站。
  3. 走了镜像但瓶颈不在源——DNS 解析、公司网络出口的问题,换源救不了,排查思路见换了国内镜像还是慢,DNS 层的问题见国内 DNS 污染诊断

❓ 常见问题

pip 和 npm 换源的标准命令是什么?怎么确认生效了?

pip:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple(清华源,亦可换阿里等),验证用 pip config list 看配置、pip download requests 看下载走的域名。临时用一次不改全局:pip install xxx -i <镜像地址>。npm:npm config set registry https://registry.npmmirror.com,验证 npm config get registry;pnpm 与 yarn 同样读 .npmrc,pnpm config set registry 等价。npm 特有的坑:package-lock.json 里每个包都固化了 resolved 字段的完整 URL——换源前生成的 lockfile,npm ci / npm i 仍会按旧 URL 下载,换源等于没换。处理:项目内删除 node_modules 与 lockfile 重装一次生成新 URL;或团队统一在项目根放 .npmrc 提交进仓库,从第一天就锁定源。回原厂源:pip config unset global.index-url;npm config delete registry。

Docker 为什么在终端 export http_proxy 或改了 shell 配置都不生效?

因为 docker pull 的下载动作由 dockerd 守护进程发起,你终端里的环境变量它一个都看不见正确入口只有两个:(1) 镜像加速:写 /etc/docker/daemon.json 的 registry-mirrors 数组,然后 systemctl restart docker——注意 registry-mirrors 只对 Docker Hub(docker.io)生效,ghcr.io、quay.io、registry.k8s.io 一概不走它;(2) 守护进程代理:systemd drop-in 文件(/etc/systemd/system/docker.service.d/proxy.conf)里写 Environment="HTTPS_PROXY=...",daemon-reload 后重启 docker。验证:docker info 底部会列出 Registry Mirrors 和 HTTP Proxy,没出现就是没生效。Docker Desktop(Mac/Win)不同:在 Settings → Docker Engine 里改 daemon.json 字段,代理在 Settings → Resources → Proxies。另注意 containerd/K8s 拉镜像不读 Docker 的配置,要在 containerd 的 config.toml 里单独配 mirror。

apt / Homebrew 这类系统级的怎么换?

apt:Ubuntu 22.04 及以前改 /etc/apt/sources.list,把 archive.ubuntu.com 和 security.ubuntu.com 批量替换为镜像域名;Ubuntu 24.04 起换了格式——源写在 /etc/apt/sources.list.d/ubuntu.sources(deb822 格式),改其中的 URIs 字段。Debian 同理对应 deb.debian.org。改完 apt update,看输出里的域名确认。Homebrew:靠环境变量而不是配置文件——在 ~/.zshrc 里 export HOMEBREW_API_DOMAIN、HOMEBREW_BOTTLE_DOMAIN 指向镜像(中科大/清华都提供成套地址和官方文档),brew 本体与 tap 的 git remote 也可一并切换;验证跑一次 brew install 看下载域名。共同提醒:系统源涉及安全更新通道,只用可信的大型镜像站(高校镜像站、大厂开源站),并保留 security 源指向镜像站同步的安全通道,不要图省事注释掉。

Go 和 Rust 的镜像怎么配?和 pip/npm 有什么不一样?

Go:一条命令 go env -w GOPROXY=https://goproxy.cn,direct(或 goproxy.io),写进 go 自己的 env 文件,全局生效;末尾的 direct 表示镜像取不到时回源直连。Go 的特别之处是校验和数据库(GOSUMDB)——模块哈希要对 sum.golang.org 验证,主流 Go 代理会一并代理校验请求,通常无需额外设置;公司内部私有仓库要配 GOPRIVATE 跳过代理和校验,否则内部模块名会被发到公网代理。Rust/Cargo:改 ~/.cargo/config.toml,用 source replacement 把 crates-io 替换为镜像的 sparse 索引(形如 sparse+https://<镜像站>/crates.io-index/,rsproxy、中科大、清华都提供),sparse 协议按需拉取索引,比老的 git 全量索引快得多。验证:go get / cargo add 任意包,看拉取日志里的域名。与 pip/npm 的差异:这两家的锁文件记录的是版本和哈希而非下载 URL,换源不会遇到 npm 那种 lockfile 固化旧地址的问题。

换了镜像还是拉不到最新版本的包,怎么回事?

最常见的原因是镜像同步延迟——镜像站按周期从上游同步,新发布的版本存在几分钟到几小时的窗口期不存在于镜像上症状:昨天刚发布的新版本 404 / no matching version,但官网明明有。处理:(1) 临时指回官方源装这一个包(pip -i、npm --registry 均支持单次指定);(2) 大镜像站的同步周期通常在分钟到小时级,等一等再试;(3) CI 里对刚发版的内部依赖,直接固定官方源。其他两个高频原因:(1) 公司代理与镜像叠加——终端里还残留着失效的 http_proxy 环境变量,请求根本没到镜像站,env | grep -i proxy 查一下;(2) 配置写了但没生效——pip 有 user/global 多级配置互相覆盖,npm 有项目 .npmrc 覆盖全局,用各自的 config list 命令看最终生效值,而不是看你改过的那个文件。

🪞 打开 国内镜像源 pip/npm/pnpm/Ubuntu/Fedora/Docker 等 33 个工具·清华/阿里/华为/腾讯 8 大源·一键复制配置命令

📖 同一工具的其他教程

🔗 相关阅读

全部教程 →