配置 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 客户端
您可以使用 JSON 配置文件为 Docker 客户端添加代理配置,该文件位于~/.docker/config.json
.构建和容器使用此文件中指定的配置。
{
"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 引擎本身的代理设置。请参阅 环境变量 并将 Docker 守护程序配置为使用代理服务器 部分来配置 CLI 和守护程序的代理设置。
使用代理配置运行容器
当您启动容器时,其与代理相关的环境变量将设置为反映~/.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
配置每个守护进程的代理设置
default
下面的键配置proxies
客户~/.docker/config.json
端连接到的所有守护程序的代理设置。要为各个守护程序配置代理,请使用守护程序的地址而不是密钥default
。
以下示例为地址上的 Docker 守护进程配置默认代理配置和无代理覆盖
tcp://docker-daemon1.example.com
:
{
"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
,请参阅
预定义 ARG。这些代理值仅在构建容器中可用。它们不包含在构建输出中。
代理作为构建的环境变量
不要使用ENV
Dockerfile 指令来指定构建的代理设置。请改用构建参数。
使用代理的环境变量将配置嵌入到映像中。如果代理是内部代理,则从该映像创建的容器可能无法访问它。
在图像中嵌入代理设置也会带来安全风险,因为这些值可能包含敏感信息。