Daemon 代理伺服器設定
如果您的組織使用代理伺服器連線到網際網路,您可能需要將 Docker 守護行程設定為使用代理伺服器。守護行程使用代理伺服器存取儲存在 Docker Hub 和其他儲存庫中的映像檔,以及連線到 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 置入檔案,為 docker
服務設定變數。
無根模式注意事項
在無根模式下執行 Docker 時,systemd 設定檔的位置會有所不同。在無根模式下執行時,Docker 會以使用者模式 systemd 服務啟動,並使用儲存在每個使用者家目錄中
~/.config/systemd/<user>/docker.service.d/
的檔案。此外,執行systemctl
時不得使用sudo
,且必須使用--user
旗標。如果您在無根模式下執行 Docker,請選擇「無根模式」分頁。
為
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"
注意事項
代理值中的特殊字元,例如
#?!()[]{}
,必須使用%%
進行雙重跳脫。例如[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"
注意事項
代理值中的特殊字元,例如
#?!()[]{}
,必須使用%%
進行雙重跳脫。例如[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