守護程序代理配置
如果您的組織使用代理伺服器連線到網際網路,您可能需要配置 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,請選擇“無根模式”選項卡。
為
docker
服務建立一個 systemd drop-in 目錄$ 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 drop-in 目錄$ 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