守护进程代理配置

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

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

重要

Docker Desktop 忽略在daemon.json中指定的代理配置。如果您使用 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 嵌入式文件来设置docker服务的变量。

无根模式说明

无根模式下运行 Docker 时,systemd 配置文件的位置不同。在无根模式下,Docker 作为用户模式 systemd 服务启动,并使用存储在每个用户主目录中的文件~/.config/systemd/<user>/docker.service.d/。此外,必须在没有sudo且使用--user标志的情况下执行systemctl。如果您在无根模式下运行 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 地址前缀 (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 嵌入式目录

    $ 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