将代理服务器与 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 客户端

您可以使用 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 中包含身份验证信息,或者将 address 可能会公开您公司环境的 IP 地址或主机名。

环境变量以纯文本形式存储在容器的配置中, 因此,可以通过远程 API 进行检查或提交到镜像 使用 .docker commit

保存文件后,配置将变为活动状态,您无需 重启 Docker。但是,该配置仅适用于新容器和 构建,并且不会影响现有容器。

下表描述了可用的配置参数。

财产描述
httpProxy设置 and 环境变量和 build 参数。HTTP_PROXYhttp_proxy
httpsProxy设置 and 环境变量和 build 参数。HTTPS_PROXYhttps_proxy
ftpProxy设置 and 环境变量和 build 参数。FTP_PROXYftp_proxy
noProxy设置 and 环境变量和 build 参数。NO_PROXYno_proxy
allProxy设置 and 环境变量和 build 参数。ALL_PROXYall_proxy

这些设置用于为容器配置代理环境变量 only,不用作 Docker CLI 或 Docker Engine 的代理设置 本身。 请参阅环境变量并将 Docker 守护程序配置为使用代理服务器部分来配置 CLI 和守护程序的代理设置。

使用代理配置运行容器

当您启动容器时,将设置其与代理相关的环境变量 以反映 中的代理配置。~/.docker/config.json

例如,假设代理配置(如示例所示) 如前面的 Environment 部分所示 您运行的容器的变量设置如下:

$ 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

配置每个守护程序的代理设置

in 下的键配置代理 客户端连接到的所有守护进程的设置。 要为各个守护进程配置代理, 使用守护程序的地址而不是密钥。defaultproxies~/.docker/config.jsondefault

以下示例配置了默认代理配置 以及 Docker 守护进程的 no-proxy override on address :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 客户端, 调用 and 命令时,可以在命令行上指定代理配置。docker builddocker run

命令行上的 Proxy 配置使用 build 的标志, 以及您希望使用代理运行容器的标志。--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

有关可与该命令一起使用的所有代理相关构建参数的列表,请参阅预定义的 ARG。 这些代理值仅在构建容器中可用。 它们不包含在 build 输出中。docker build

代理作为构建的环境变量

请勿使用 Dockerfile 指令为构建指定代理设置。 请改用 build arguments。ENV

对代理使用环境变量会将配置嵌入到镜像中。 如果代理是内部代理,则容器可能无法访问它 从该镜像创建。

在镜像中嵌入代理设置也会带来安全风险,因为 可能包含敏感信息。