守护程序代理配置

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

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

重要

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

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

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

守护进程配置

您可以在daemon.json文件 或使用 CLI 标志--http-proxy--https-proxyflags 的dockerd命令。配置 usingdaemon.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旗。选择“无根” mode“选项卡。


  1. docker服务:

    $ 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"

    注意

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

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
  3. 如果您有需要联系的内部 Docker 注册表,而无需 proxying,您可以通过NO_PROXY环境变量。

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

    • 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. 验证配置是否已加载并与您所做的更改匹配 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. docker服务:

    $ 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"

    注意

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

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
  3. 如果您有需要联系的内部 Docker 注册表,而无需 proxying,您可以通过NO_PROXY环境变量。

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

    • 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. 验证配置是否已加载并与您所做的更改匹配 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