使用代理服务器与Docker CLI

本页描述了如何通过容器中的环境变量配置Docker CLI以使用代理。

本页面不描述如何为Docker Desktop配置代理。 有关说明,请参阅 配置Docker Desktop以使用HTTP/HTTPS代理

如果您在没有Docker Desktop的情况下运行Docker Engine,请参考 配置Docker守护进程以使用代理 了解如何为Docker守护进程(dockerd)本身配置代理服务器。

如果您的容器需要使用HTTP、HTTPS或FTP代理服务器,您可以通过不同的方式进行配置:

注意

不幸的是,没有标准定义网络客户端应如何处理代理环境变量,或定义它们的格式。

如果您对这些变量的历史感兴趣,请查看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。然而,该配置仅适用于新容器和构建,不会影响现有容器。

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

PropertyDescription
httpProxySets the HTTP_PROXY and http_proxy environment variables and build arguments.
httpsProxySets the HTTPS_PROXY and https_proxy environment variables and build arguments.
ftpProxySets the FTP_PROXY and ftp_proxy environment variables and build arguments.
noProxySets the NO_PROXY and no_proxy environment variables and build arguments.
allProxySets the ALL_PROXY and all_proxy environment variables and build arguments.

这些设置仅用于配置容器的代理环境变量,不用于Docker CLI或Docker Engine本身的代理设置。 请参阅 环境变量配置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

为每个守护进程配置代理设置

~/.docker/config.json 文件中的 proxies 下的 default 键配置了客户端连接的所有守护进程的代理设置。要为单个守护进程配置代理,请使用守护进程的地址而不是 default 键。

以下示例配置了默认的代理配置,并为地址为 tcp://docker-daemon1.example.com 的 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"
   },
   "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命令一起使用的所有代理相关构建参数的列表,请参阅预定义参数。这些代理值仅在构建容器中可用。它们不包含在构建输出中。

构建时的环境变量代理

不要使用ENV Dockerfile指令来指定构建的代理设置。请改用构建参数。

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

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