配置 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_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 指令为构建指定代理设置。请改为使用构建参数。

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

在镜像中嵌入代理设置也存在安全风险,因为这些值可能包含敏感信息。