守護程式代理設定
如果您的組織使用代理伺服器連接網際網路,您可能需要設定 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_PROXYhttp_proxyHTTPS_PROXYhttps_proxyNO_PROXYno_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 模式」分頁。
為
docker服務建立一個 systemd 插入式目錄:$ sudo mkdir -p /etc/systemd/system/docker.service.d建立一個名為
/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/"如果您有需要繞過代理伺服器連接的內部 Docker 登錄庫,可以透過
NO_PROXY環境變數指定它們。NO_PROXY變數指定一個包含逗號分隔值的字串,用於列出應排除在代理之外的主機。您可以透過以下選項來排除主機:- IP 位址前綴 (
1.2.3.4) - 網域名稱或特殊 DNS 標籤 (
*) - 網域名稱符合該名稱及其所有子網域。名稱開頭帶有「.」的網域名稱僅符合子網域。例如,給定網域
foo.example.com和example.com:example.com符合example.com和foo.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"- IP 位址前綴 (
重新載入變更並重新啟動 Docker:
$ sudo systemctl daemon-reload $ sudo systemctl restart docker驗證設定是否已載入並與您的變更相符,例如:
$ 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
為
docker服務建立一個 systemd 插入式目錄:$ mkdir -p ~/.config/systemd/user/docker.service.d建立一個名為
~/.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/"如果您有需要繞過代理伺服器連接的內部 Docker 登錄庫,可以透過
NO_PROXY環境變數指定它們。NO_PROXY變數指定一個包含逗號分隔值的字串,用於列出應排除在代理之外的主機。您可以透過以下選項來排除主機:- IP 位址前綴 (
1.2.3.4) - 網域名稱或特殊 DNS 標籤 (
*) - 網域名稱符合該名稱及其所有子網域。名稱開頭帶有「.」的網域名稱僅符合子網域。例如,給定網域
foo.example.com和example.com:example.com符合example.com和foo.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"- IP 位址前綴 (
重新載入變更並重新啟動 Docker:
$ systemctl --user daemon-reload $ systemctl --user restart docker驗證設定是否已載入並與您的變更相符,例如:
$ 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