Janvh's Blog

Janvh's Blog

Dcoker配置Proxy

12
2025-09-15

Docker 配置 Proxy 全面指南

在企业或校园网络中,经常需要通过代理服务器访问外部资源(如 Docker Hub 的镜像仓库)。如果不进行代理配置,docker pull、构建镜像、安装依赖等操作可能会失败。Docker 提供了在 Docker Daemon(守护进程) 中设置代理的方法。本文将结合 Docker 官方文档,总结如何为 Docker 配置代理。

为什么需要配置 Proxy

在许多内网环境下,服务器并不能直接访问公网,而是需要借助企业代理服务器才能访问外部资源。Docker Daemon 本身运行在后台环境中,它不会继承你在 Shell 中设置的 HTTP_PROXYHTTPS_PROXY 环境变量,因此需要单独为它配置。

基于 systemd 的配置方法

Docker Daemon 通常由 systemd 管理,因此代理配置也是通过 systemd 的服务配置文件来完成。

  1. 创建配置目录

    sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. 新建代理配置文件
    在上面的目录下创建 http-proxy.conf 文件,填入:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
    
    • HTTP_PROXY:HTTP 代理地址
    • HTTPS_PROXY:HTTPS 代理地址
    • NO_PROXY:无需走代理的主机或域名(如 localhost 及内网 Docker 私有仓库)
  3. 重新加载并重启 Docker

    sudo systemctl daemon-reexec
    sudo systemctl restart docker
    

    上述命令会让新的代理配置生效。

验证代理设置

执行以下命令检查环境变量:

systemctl show --property=Environment docker

你应当能看到 HTTP_PROXY 等配置是否已正确生效。

针对 Rootless 模式的配置

如果你在使用 Rootless 模式 运行 Docker,则 Docker Daemon 是以用户 systemd 服务运行的。此时需要在 ~/.config/systemd/user/docker.service.d/http-proxy.conf 中添加同样的配置,然后执行:

systemctl --user daemon-reexec
systemctl --user restart docker

注意事项

  • 不要在 /etc/docker/daemon.json 中配置 Proxy,这是无效的。
  • 如果同时使用了 Docker Desktop,其图形界面中也提供了专门的代理配置入口,不建议直接修改 systemd。
  • 企业网络可能会限制仅允许走指定白名单域名,因此确保 NO_PROXY 中包括必要的内部仓库地址。

在为 Docker Daemon 配置代理的同时,Docker CLI(客户端) 也可能需要配置代理环境变量,尤其当 CLI 命令本身需要访问外部资源而 Docker Daemon 环境未继承代理时。CLI 的代理配置通常是通过设置环境变量来完成的。

Docker CLI 的代理配置方法

  1. 直接在命令行中设置环境变量
    在执行命令时临时指定代理:

    HTTP_PROXY=http://proxy.example.com:3128 \
    HTTPS_PROXY=https://proxy.example.com:3129 \
    NO_PROXY=localhost,127.0.0.1,docker-registry.example.com \
    docker pull ubuntu
    

    这种方式仅对当前命令有效。

  2. 配置成全局环境变量
    将代理环境变量写入用户 Shell 配置文件,如 ~/.bashrc~/.zshrc

    export HTTP_PROXY="http://proxy.example.com:3128"
    export HTTPS_PROXY="https://proxy.example.com:3129"
    export NO_PROXY="localhost,127.0.0.1,.corp,docker-registry.example.com"
    

    修改后执行 source ~/.bashrc 使其生效。

    • 优点:所有 Docker CLI 命令都自动使用代理。
    • 缺点:同时影响其他依赖 HTTP(S) 请求的命令行工具。
  3. 为单用户或脚本单独设置
    如果只想为 Docker CLI 配置而不影响全局环境变量,可以在调用 Docker CLI 的脚本中直接写入上述 export 行。

验证 CLI 代理是否生效

执行一个需要访问外网的命令,比如拉取 Docker Hub 镜像:

docker pull alpine

若成功下载则说明 CLI 已正确通过代理访问。