修改 Docker 的代理设置主要有三种场景,可以根据需求选择合适的方法。

💻 场景一:为 Docker 守护进程设置代理(最常用)

当你遇到 docker pull 无法拉取镜像,或 docker build 无法下载基础镜像时,通常是 Docker 后台守护进程(daemon)需要配置代理。它负责与镜像仓库(如 Docker Hub)通信。

对于使用 systemd 管理服务的 Linux 系统(如 Ubuntu、CentOS 7+、Debian),推荐通过创建配置文件来设置。

  1. 创建配置文件目录(如果不存在):

    sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. 创建并编辑代理配置文件: 使用文本编辑器创建一个 http-proxy.conf 文件:

    sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
    
  3. 填入代理配置: 根据你的代理服务器类型,将以下内容粘贴进去(请将 proxy.example.com:3128 替换为你的实际地址和端口):

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=http://proxy.example.com:3128"
    Environment="NO_PROXY=localhost,127.0.0.1,.local,*.example.com"
    
    • NO_PROXY:非常重要!请在此处添加你公司内网的域名或 IP,告知 Docker 这些地址不走代理,避免内网访问故障。
    • SOCKS代理:如果你的代理是 SOCKS5 协议,可以这样写:Environment="HTTP_PROXY=socks5://127.0.0.1:1080"
  4. 重新加载配置并重启 Docker

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  5. 验证配置是否生效

    sudo systemctl show --property=Environment docker
    

    如果输出显示了刚才设置的变量,就说明配置成功了。

📦 场景二:为 Docker 客户端设置代理(影响容器内部)

如果你希望所有新启动的容器内部都能自动使用代理环境变量,可以通过修改 Docker 客户端的配置文件来实现。这种方式不影响 docker pull,只影响容器。

  1. 编辑(或创建)~/.docker/config.json 文件:

    vi ~/.docker/config.json
    
  2. 添加或修改 proxies 字段:

    {
      "proxies": {
        "default": {
          "httpProxy": "http://proxy.example.com:3128",
          "httpsProxy": "https://proxy.example.com:3129",
          "noProxy": "localhost,127.0.0.1,.example.com"
        }
      }
    }
    

    保存文件后,无需重启 Docker,后续新建的容器都会自动包含这些环境变量。

⚙️ 场景三:临时或针对特定任务设置代理

  • 运行单个容器时指定: 使用 docker run-e--env 参数,只为这一个容器设置代理:

    docker run -it --env HTTP_PROXY="http://proxy.example.com:3128" --env HTTPS_PROXY="http://proxy.example.com:3128" ubuntu bash
    
  • 构建镜像时指定: 在 docker build 过程中使用 --build-arg 传递代理,这样在构建镜像时(如下载依赖包)就可以使用代理:

    docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" --build-arg HTTPS_PROXY="http://proxy.example.com:3128" -t your-image .
    

✅ 如何选择配置方式?

  • 如果你遇到的是 docker pull 拉取镜像失败,请使用方法一(守护进程配置)
  • 如果你希望容器启动后自动继承代理,请使用方法二(客户端配置)
  • 如果只是偶尔需要,用**方法三(临时指定)**最方便。