守护程序代理配置

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

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

重要

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

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

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

守护进程配置

您可以在文件中为守护进程配置代理行为, 或者对命令使用 CLI 标志或 标志。建议使用 Configuration using。daemon.json--http-proxy--https-proxydockerddaemon.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 服务启动,并使用 存储在 中每个用户主目录中的文件。此外,必须 在没有 和 有标志的情况下执行。选择“无根” mode“选项卡。~/.config/systemd/<user>/docker.service.d/systemctlsudo--user


  1. 为服务创建一个 systemd 插入式目录:docker

    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. 创建一个名为 的文件,用于添加环境变量:/etc/systemd/system/docker.service.d/http-proxy.confHTTP_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 注册表,而无需 proxying,您可以通过环境变量指定它们。NO_PROXY

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

    • IP 地址前缀 (1.2.3.4)
    • 域名或特殊 DNS 标签 (*)
    • 域名与该名称和所有子域匹配。具有 前导 “.” 仅匹配子域。例如,给定域 和 :foo.example.comexample.com
      • example.commatches 和 、 和example.comfoo.example.com
      • .example.com仅匹配项foo.example.com
    • 单个星号 () 表示不应进行代理*
    • 文本端口号由 IP 地址前缀 () 和 域名 (1.2.3.4:80foo.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. 验证配置是否已加载并与您所做的更改匹配 made 等实例:

    $ 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. 为服务创建一个 systemd 插入式目录:docker

    $ mkdir -p ~/.config/systemd/user/docker.service.d
    
  2. 创建一个名为 的文件,用于添加环境变量:~/.config/systemd/user/docker.service.d/http-proxy.confHTTP_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 注册表,而无需 proxying,您可以通过环境变量指定它们。NO_PROXY

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

    • IP 地址前缀 (1.2.3.4)
    • 域名或特殊 DNS 标签 (*)
    • 域名与该名称和所有子域匹配。具有 前导 “.” 仅匹配子域。例如,给定域 和 :foo.example.comexample.com
      • example.commatches 和 、 和example.comfoo.example.com
      • .example.com仅匹配项foo.example.com
    • 单个星号 () 表示不应进行代理*
    • 文本端口号由 IP 地址前缀 () 和 域名 (1.2.3.4:80foo.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. 验证配置是否已加载并与您所做的更改匹配 made 等实例:

    $ 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