搭配 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_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 本身的代理設定。請參閱環境變數和設定 Docker Daemon 使用代理伺服器章節,以了解如何設定 CLI 和 Daemon 的代理設定。
使用代理伺服器設定執行容器
當您啟動容器時,其代理相關的環境變數會設定為反映您在 ~/.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
鍵會設定用戶端連線的所有 Daemon 的代理設定。要設定個別 Daemon 的代理,請使用 Daemon 的位址,而不是 default
鍵。
以下範例設定了預設代理設定,以及位址為 tcp://docker-daemon1.example.com
的 Docker Daemon 的無代理覆寫:
{
"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 指令來指定建置的代理設定。請改用建置參數。
使用環境變數設定代理會將設定嵌入映像檔中。如果代理是內部代理,則從該映像檔建立的容器可能無法存取它。
將代理設定嵌入映像檔中也會造成安全風險,因為這些值可能包含敏感資訊。