配置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 服务创建一个特殊的配置目录和文件:

  1. 创建目录:

   sudo mkdir -p /etc/systemd/system/docker.service.d
  1. 创建/编辑 http-proxy.conf文件:

   sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
  1. 在文件中写入以下内容:

(请根据你的 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(针对当前用户生效)。