在 Docker CLI 中使用代理伺服器

本頁介紹如何配置 Docker CLI 以在容器中透過環境變數使用代理。

本頁不介紹如何為 Docker Desktop 配置代理。有關說明,請參閱配置 Docker Desktop 使用 HTTP/HTTPS 代理

如果您在沒有 Docker Desktop 的情況下執行 Docker Engine,請參閱配置 Docker 守護程序以使用代理,瞭解如何為 Docker 守護程序(dockerd)本身配置代理伺服器。

如果您的容器需要使用 HTTP、HTTPS 或 FTP 代理伺服器,您可以透過不同方式進行配置:

注意

不幸的是,目前沒有標準來定義 Web 客戶端應如何處理代理環境變數,也沒有定義它們的格式。

如果您對這些變數的歷史感興趣,可以檢視 GitLab 團隊關於此主題的博文:我們需要談談:我們能標準化 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 命令一起使用的所有與代理相關的構建引數列表,請參閱預定義 ARGs。這些代理值僅在構建容器中可用。它們不包含在構建輸出中。

將代理作為構建的環境變數

不要使用 ENV Dockerfile 指令為構建指定代理設定。請改用構建引數。

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

將代理設定嵌入映象中也存在安全風險,因為這些值可能包含敏感資訊。