守護程序代理配置

如果您的組織使用代理伺服器連線到網際網路,您可能需要配置 Docker 守護程序以使用該代理伺服器。守護程序使用代理伺服器訪問儲存在 Docker Hub 和其他登錄檔中的映象,並訪問 Docker Swarm 中的其他節點。

本頁描述瞭如何為 Docker 守護程序配置代理。有關為 Docker CLI 配置代理設定的說明,請參閱配置 Docker CLI 以使用代理伺服器

重要

daemon.json 中指定的代理配置會被 Docker Desktop 忽略。如果您使用 Docker Desktop,您可以透過 Docker Desktop 設定來配置代理。

您可以透過兩種方式配置這些設定

直接配置守護程序的優先順序高於環境變數。

守護程序配置

您可以在 daemon.json 檔案中配置守護程序的代理行為,或使用 dockerd 命令的 --http-proxy--https-proxy CLI 標誌。推薦使用 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 單元檔案

如果您以 systemd 服務的形式執行 Docker 守護程序,您可以建立一個 systemd drop-in 檔案來為 docker 服務設定這些變數。

關於無根模式的說明

在以無根模式執行 Docker 時,systemd 配置檔案的位置是不同的。在無根模式下執行時,Docker 作為使用者模式 systemd 服務啟動,並使用儲存在每個使用者主目錄中 ~/.config/systemd/<user>/docker.service.d/ 裡的檔案。此外,systemctl 必須在不使用 sudo 且帶有 --user 標誌的情況下執行。如果您正在無根模式下執行 Docker,請選擇“無根模式”選項卡。

  1. docker 服務建立一個 systemd drop-in 目錄

    $ 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 drop-in 目錄

    $ 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