配置 Docker 使用代理伺服器
本頁面介紹如何配置 Docker CLI 以透過容器中的環境變數使用代理。
本頁面沒有介紹如何為 Docker 守護程式配置代理。有關如何配置 Docker Desktop 以使用 HTTP/HTTPS 代理的說明,請參閱 Mac 上的代理、Windows 上的代理 和 Linux 上的代理。
如果執行的是沒有 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_PROXY 和 http_proxy 環境變數以及構建引數。 |
httpsProxy | 設定 HTTPS_PROXY 和 https_proxy 環境變數以及構建引數。 |
ftpProxy | 設定 FTP_PROXY 和 ftp_proxy 環境變數以及構建引數。 |
noProxy | 設定 NO_PROXY 和 no_proxy 環境變數以及構建引數。 |
allProxy | 設定 ALL_PROXY 和 all_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.json
中 proxies
下的 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 build
和 docker 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 指令為構建指定代理設定。請改為使用構建引數。
使用環境變數進行代理會將配置嵌入到映象中。如果代理是內部代理,則從該映象建立的容器可能無法訪問它。
在映象中嵌入代理設定也存在安全風險,因為這些值可能包含敏感資訊。