配置clash
这是因为 Docker 守护进程(dockerd)是一个系统服务,它不会直接读取你终端 shell 里的 export http_proxy 等变量。
以下是详细操作步骤:
1. 确认 Clash 代理地址
假设你的 Clash 运行在本地,默认代理端口通常是:
- HTTP/HTTPS 代理:
http://127.0.0.1:7890 - 注意: 如果你的 Docker 运行在虚拟机或远程服务器上,而 Clash 运行在宿主机或另一台机器,你需要确保 Clash 开启了 "Allow LAN" (允许局域网连接) ,并使用该机器的局域网 IP(如
http://192.168.1.5:7890)。
2. 创建 Docker 代理配置文件
你需要为 Docker 服务创建一个特殊的配置目录和文件:
- 创建目录:
sudo mkdir -p /etc/systemd/system/docker.service.d
- 创建/编辑
http-proxy.conf 文件:
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
- 在文件中写入以下内容:
(请根据你的 Clash 实际端口进行修改,通常是 7890)
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
-
HTTP_PROXY 和HTTPS_PROXY:告诉 Docker 走代理。 -
NO_PROXY:告诉 Docker 哪些地址不需要走代理(通常包含本地地址和私有镜像库)。
3. 刷新配置并重启 Docker
修改完成后,必须刷新 systemd 配置并重启 Docker 服务才能生效:
# 重新加载 systemd 管理器配置
sudo systemctl daemon-reload
sudo systemctl restart docker
4. 验证代理是否生效
使用 docker info 命令查看配置是否成功注入:
docker info | grep -i proxy
输出示例:
如果你看到以下内容,说明配置成功:
Proxy:
HTTP PROXY: http://127.0.0.1:7890
HTTPS PROXY: http://127.0.0.1:7890
NO PROXY: localhost,127.0.0.1
5. 常见问题排查
- 依然报错 "Connection refused"?
- 检查 Clash 是否开启。
- 检查 Clash 的端口是否确实是
7890。 - 如果你是在 WSL2 中运行 Docker,
127.0.0.1 可能指向的是 WSL 内部。你可能需要将地址改为 Windows 宿主机的 IP,或者使用cat /etc/resolv.conf里的 nameserver IP。 - 容器内部需要代理吗?
- 上述步骤仅解决 Docker 宿主机拉取镜像(docker pull) 的问题。
- 如果你希望在 容器内部(如编译代码、安装依赖) 也使用代理,你需要在运行容器时传入参数:
docker run -e http_proxy="http://127.0.0.1:7890" -e https_proxy="http://127.0.0.1:7890" my_image
- 或者修改全局的
~/.docker/config.json(针对当前用户生效)。