在 Docker CLI 中使用代理伺服器

本頁面說明如何透過容器中的環境變數來設定 Docker CLI 以使用代理伺服器。

本頁面不包含 Docker Desktop 的代理設定說明。如需相關指引,請參閱設定 Docker Desktop 使用 HTTP/HTTPS 代理伺服器

如果您是在沒有 Docker Desktop 的情況下執行 Docker Engine,請參考設定 Docker 常駐程式以使用代理伺服器,了解如何為 Docker 常駐程式 (dockerd) 本身設定代理伺服器。

如果您的容器需要使用 HTTP、HTTPS 或 FTP 代理伺服器,您可以透過多種方式進行設定

注意

很遺憾地,目前尚無標準定義 Web 客戶端應如何處理代理環境變數,或其定義格式為何。

如果您對這些變數的歷史感興趣,可以查看 GitLab 團隊關於此主題的部落格文章:我們需要談談:我們能標準化 NO_PROXY 嗎? (We need to talk: Can we standardize NO_PROXY?)

設定 Docker 客戶端

您可以使用位於 ~/.docker/config.json 的 JSON 設定檔,為 Docker 客戶端新增代理設定。建置過程和容器將會使用此檔案中指定的設定。

{
 "proxies": {
   "default": {
     "httpProxy": "http://proxy.example.com:3128",
     "httpsProxy": "https://proxy.example.com:3129",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
   }
 }
}
警告

代理設定可能包含敏感資訊。例如,某些代理伺服器要求在 URL 中包含驗證資訊,或者其位址可能會暴露您公司環境的 IP 位址或主機名稱。

環境變數在容器設定中以純文字形式儲存,因此可以透過遠端 API 進行檢視,或者在使用 docker commit 時被提交至映像檔中。

設定會在儲存檔案後立即生效,您無需重新啟動 Docker。不過,此設定僅適用於新的容器和建置,不會影響現有的容器。

下表說明了可用的設定參數。

屬性描述
httpProxy設定 HTTP_PROXYhttp_proxy 環境變數及建置引數。
httpsProxy設定 HTTPS_PROXYhttps_proxy 環境變數及建置引數。
ftpProxy設定 FTP_PROXYftp_proxy 環境變數及建置引數。
noProxy設定 NO_PROXYno_proxy 環境變數及建置引數。
allProxy設定 ALL_PROXYall_proxy 環境變數及建置引數。

這些設定僅用於設定容器的代理環境變數,並不用作 Docker CLI 或 Docker Engine 本身的代理設定。若要為 CLI 和常駐程式設定代理,請參閱環境變數設定 Docker 常駐程式以使用代理伺服器章節。

使用代理設定執行容器

當您啟動容器時,其與代理相關的環境變數會被設定為反映您在 ~/.docker/config.json 中的代理設定。

例如,假設代理設定如先前章節中的範例所示,您執行的容器環境變數將設定如下

$ docker run --rm alpine sh -c 'env | grep -i  _PROXY'
https_proxy=http://proxy.example.com:3129
HTTPS_PROXY=http://proxy.example.com:3129
http_proxy=http://proxy.example.com:3128
HTTP_PROXY=http://proxy.example.com:3128
no_proxy=*.test.example.com,.example.org,127.0.0.0/8
NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8

使用代理設定進行建置

當您呼叫建置時,與代理相關的建置引數會根據您 Docker 客戶端設定檔中的代理設定自動預先填入。

假設代理設定如先前章節中的範例所示,環境變數在建置期間會設定如下

$ docker build \
  --no-cache \
  --progress=plain \
  - <<EOF
FROM alpine
RUN env | grep -i _PROXY
EOF
#5 [2/2] RUN env | grep -i _PROXY
#5 0.100 HTTPS_PROXY=https://proxy.example.com:3129
#5 0.100 no_proxy=*.test.example.com,.example.org,127.0.0.0/8
#5 0.100 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8
#5 0.100 https_proxy=https://proxy.example.com:3129
#5 0.100 http_proxy=http://proxy.example.com:3128
#5 0.100 HTTP_PROXY=http://proxy.example.com:3128
#5 DONE 0.1s

針對每個常駐程式設定代理

~/.docker/config.jsonproxies 下的 default 鍵會設定客戶端連線的所有常駐程式之代理設定。若要針對個別常駐程式設定代理,請使用該常駐程式的位址,而非 default 鍵。

以下範例同時設定了預設代理設定,以及針對位址為 tcp://docker-daemon1.example.com 的 Docker 常駐程式的 no-proxy 覆寫設定

{
 "proxies": {
   "default": {
     "httpProxy": "http://proxy.example.com:3128",
     "httpsProxy": "https://proxy.example.com:3129",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
   },
   "tcp://docker-daemon1.example.com": {
     "noProxy": "*.internal.example.net"
   }
 }
}

使用 CLI 設定代理

除了設定 Docker 客戶端外,您也可以在呼叫 docker builddocker run 指令時,於指令列中指定代理設定。

在指令列使用代理設定時,建置使用 --build-arg 旗標,而執行容器時則使用 --env 旗標。

$ docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
$ docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis

如需您可以在 docker build 指令中使用的所有與代理相關建置引數列表,請參閱預定義 ARG。這些代理值僅在建置容器中可用,不會包含在建置輸出中。

作為建置環境變數的代理

請勿使用 ENV Dockerfile 指令來指定建置的代理設定。請改用建置引數。

使用環境變數設定代理會將設定嵌入到映像檔中。如果代理是內部代理,則從該映像檔建立的容器可能無法存取它。

在映像檔中嵌入代理設定也會帶來安全風險,因為這些值可能包含敏感資訊。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.