守護程式代理設定

如果您的組織使用代理伺服器連接網際網路,您可能需要設定 Docker 守護程式以使用該代理伺服器。守護程式會使用代理伺服器來存取 Docker Hub 及其他登錄庫(registry)中儲存的映像檔,並連接 Docker Swarm 中的其他節點。

本頁說明如何為 Docker 守護程式設定代理伺服器。有關為 Docker CLI 設定代理伺服器的說明,請參閱 將 Docker CLI 設定為使用代理伺服器

重要

Docker Desktop 會忽略在 daemon.json 中指定的代理伺服器設定。如果您使用 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 單元檔案

如果您將 Docker 守護程式作為 systemd 服務執行,可以建立一個 systemd 插入式檔案(drop-in file)來為 docker 服務設定這些變數。

Rootless 模式注意事項

Rootless 模式下執行 Docker 時,systemd 設定檔的位置會有所不同。在 Rootless 模式下,Docker 作為使用者模式的 systemd 服務啟動,並使用儲存在每個使用者家目錄下的 ~/.config/systemd/<user>/docker.service.d/ 中的檔案。此外,執行 systemctl 時必須不加 sudo 並帶上 --user 參數。如果您在 Rootless 模式下執行 Docker,請選擇「Rootless 模式」分頁。

  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"
    注意

    代理伺服器值中的特殊字元(如 #?!()[]{})必須使用 %% 進行雙重跳脫(escape)。例如:

    [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"
    注意

    代理伺服器值中的特殊字元(如 #?!()[]{})必須使用 %% 進行雙重跳脫(escape)。例如:

    [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
    
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.