配置守护程序以使用代理

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

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

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

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

守护程序配置

您可以在 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/ 中的文件。此外,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 地址前缀 (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