Docker网络模型(三)代理服务器

配置 Docker 的代理服务器

本页面描述了如何在容器里用 Docker CLI 配置环境变量来使用代理。

本页面不讲如何给 Dockers daemon 配置代理。关于如何给 Docker 桌面版配置 HTTP/HTTPS 代理,参考: proxies on Macproxies on Windows, 和 proxies on Linux

如果你跑的不是桌面版本的 Docker 引擎,参考 Configure the Docker daemon to use a proxy server 来给 Docker daemon (dockerd) 设置好代理服务器。

如果你的容器需要使用 HTTP, HTTPS, 或 FTP 代理服务器,可以像下面这么配置:

注意

不幸的是,目前还没有一个标准来定义网络客户端应该如何处理代理环境变量,也没有定义它们的格式。

如果你对这些变量的历史感兴趣,可以看看GitLab团队关于这个问题的博文: We need to talk: Can we standardize NO_PROXY?.

配置 Docker client

你可以给 Docker client 添加代理配置,配置文件位置是 ~/.docker/config.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 进行检索(inspect),或者在使用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 引擎本身的代理。参考 environment variables 跟 configure the Docker daemon to use a proxy server 部分来给 Docker CLI 跟 Docker 引擎配置。

代理配置在跑容器起作用

当你启动一个容器时,容器有关代理的环境变量会与在 ~/.docker/config.json里的配置映射起来。

比如,假设配置跟上面举的~/.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 client 配置文件中的代理设置自动预填充。

假设配置跟上面举的~/.docker/config.json 例子一样,构建过程的相关环境变量就会被设置如下::

$ 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

给每个 daemon 设置代理

daemon.json 文件里 proxies 下的 default 字段的配置对 Docker client 连接的所有的 daemons 都会生效。如果想单独给某个 daemon 进行配置,可以把  default 字段换成对应的 daemon 地址。

下面的例子同时配置了默认代理,以及对地址为 tcp://docker-daemon1.example.com 的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 client 代理,你也可以在跑 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 构建参数,参考这里:Predefined ARGs。这些参数只在构建容器时生效,不会影响构建的产物。

构建时用环境变量来设置代理

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

直接用环境参数来构建的话,会导致代理环境变量被集成到镜像里。此时如果代理是一个内部的东西,容器就会访问不了代理了。

把代理环境变量集成到镜像里也可能导致安全问题,因为这些代理环境配置里可能会包含一些敏感的信息。

猜你喜欢

转载自blog.csdn.net/weixin_42445065/article/details/130821404