守护进程代理配置

如果您的组织使用代理服务器连接互联网,您可能需要配置 Docker 守护进程以使用该代理服务器。守护进程使用代理服务器访问存储在 Docker Hub 和其他注册表上的镜像,并访问 Docker 群集中的其他节点。

本页面描述如何为 Docker 守护进程配置代理。有关为 Docker CLI 配置代理设置的说明,请参阅 配置 Docker CLI 使用代理服务器

重要

Docker Desktop 会忽略在 daemon.json 中指定的代理配置。如果您使用 Docker Desktop,可以通过 Docker Desktop 设置来配置代理。

您可以通过以下两种方式配置这些设置:

直接配置守护进程优先于环境变量。

守护进程配置

您可以在 daemon.json 文件中配置守护进程的代理行为, 或者使用 CLI 标志为 --http-proxy--https-proxy 标志配置 dockerd 命令。 推荐使用 daemon.json 进行配置。

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

更改配置文件后,重新启动守护进程以使代理配置生效:

$ sudo systemctl restart docker

环境变量

Docker 守护进程在其启动环境中检查以下环境变量,以配置 HTTP 或 HTTPS 代理行为:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

systemd 单元文件

如果您将 Docker 守护进程作为 systemd 服务运行,您可以创建一个 systemd drop-in 文件,为 docker 服务设置变量。

无根模式注意事项

无根模式 下运行 Docker 时,systemd 配置文件的位置会有所不同。在无根模式下,Docker 作为用户模式的 systemd 服务启动,并使用存储在每个用户主目录中的文件,位于 ~/.config/systemd/<user>/docker.service.d/ 中。此外,systemctl 必须在不带 sudo 的情况下执行,并带有 --user 标志。如果您正在无根模式下运行 Docker,请选择“无根模式”选项卡。


  1. docker 服务创建 systemd drop-in 目录:

    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. 创建一个名为 /etc/systemd/system/docker.service.d/http-proxy.conf 的文件, 该文件添加 HTTP_PROXY 环境变量:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"

    如果您位于 HTTPS 代理服务器后面,请设置 HTTPS_PROXY 环境变量:

    [Service]
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    可以设置多个环境变量;要同时设置非HTTPS和HTTPS代理;

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    注意

    代理值中的特殊字符,如 #?!()[]{},必须使用 %% 进行双重转义。例如:

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
  3. 如果您有需要在不通过代理的情况下访问的内部 Docker 注册表,您可以通过 NO_PROXY 环境变量指定它们。

    NO_PROXY 变量指定了一个字符串,其中包含应从代理中排除的主机的逗号分隔值。这些是您可以指定以排除主机的选项:

    • IP地址前缀 (1.2.3.4)
    • 域名,或特殊的 DNS 标签(*
    • 域名匹配该名称及所有子域名。以“.”开头的域名仅匹配子域名。例如,给定域名 foo.example.comexample.com
      • example.com 匹配 example.comfoo.example.com,以及
      • .example.com 仅匹配 foo.example.com
    • 单个星号 (*) 表示不应进行代理
    • IP地址前缀(1.2.3.4:80)和域名(foo.example.com:80)接受字面端口号

    示例:

    [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"
  4. 刷新更改并重启 Docker

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
    
  5. 验证配置是否已加载,并且与您所做的更改相符,例如:

    $ sudo systemctl show --property=Environment docker
    
    Environment=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,.corp
    
  1. docker 服务创建 systemd drop-in 目录:

    $ mkdir -p ~/.config/systemd/user/docker.service.d
    
  2. 创建一个名为 ~/.config/systemd/user/docker.service.d/http-proxy.conf 的文件, 该文件添加 HTTP_PROXY 环境变量:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"

    如果您位于 HTTPS 代理服务器后面,请设置 HTTPS_PROXY 环境变量:

    [Service]
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    可以设置多个环境变量;要同时设置非HTTPS和HTTPS代理;

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=https://proxy.example.com:3129"

    注意

    代理值中的特殊字符,如 #?!()[]{},必须使用 %% 进行双重转义。例如:

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
  3. 如果您有需要在不通过代理的情况下访问的内部 Docker 注册表,您可以通过 NO_PROXY 环境变量指定它们。

    NO_PROXY 变量指定了一个字符串,其中包含应从代理中排除的主机的逗号分隔值。这些是您可以指定以排除主机的选项:

    • IP地址前缀 (1.2.3.4)
    • 域名,或特殊的 DNS 标签(*
    • 域名匹配该名称及所有子域名。以“.”开头的域名仅匹配子域名。例如,给定域名 foo.example.comexample.com
      • example.com 匹配 example.comfoo.example.com,以及
      • .example.com 仅匹配 foo.example.com
    • 单个星号 (*) 表示不应进行代理
    • IP地址前缀(1.2.3.4:80)和域名(foo.example.com:80)接受字面端口号

    示例:

    [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"
  4. 刷新更改并重启 Docker

    $ systemctl --user daemon-reload
    $ systemctl --user restart docker
    
  5. 验证配置是否已加载,并且与您所做的更改相符,例如:

    $ systemctl --user show --property=Environment docker
    
    Environment=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,.corp