守护进程代理配置

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

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

重要

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

有两种方法可以配置这些设置:

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

守护进程配置

您可以在daemon.json文件中配置守护进程的代理行为, 或者使用dockerd命令的--http-proxy--https-proxy标志。 建议使用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//docker.service.d/。此外,systemctl必须在没有sudo的情况下执行,并且需要带上--user标志。如果您在无根模式下运行Docker,请选择“无根模式”标签。


  1. docker服务创建一个systemd覆盖目录:

    $ 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 address prefix (1.2.3.4)
    • Domain name, or a special DNS label (*)
    • A domain name matches that name and all subdomains. A domain name with a leading "." matches subdomains only. For example, given the domains foo.example.com and example.com:
      • example.com matches example.com and foo.example.com, and
      • .example.com matches only foo.example.com
    • A single asterisk (*) indicates that no proxying should be done
    • Literal port numbers are accepted by IP address prefixes (1.2.3.4:80) and domain names (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覆盖目录:

    $ 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 address prefix (1.2.3.4)
    • Domain name, or a special DNS label (*)
    • A domain name matches that name and all subdomains. A domain name with a leading "." matches subdomains only. For example, given the domains foo.example.com and example.com:
      • example.com matches example.com and foo.example.com, and
      • .example.com matches only foo.example.com
    • A single asterisk (*) indicates that no proxying should be done
    • Literal port numbers are accepted by IP address prefixes (1.2.3.4:80) and domain names (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