配置守護程式以使用代理

如果您的組織使用代理伺服器連線到網際網路,則可能需要配置 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