Docker 代理服务器设置

slug
docker-proxy-setting
tags
docker
proxy
date
Aug 12, 2024
summary
Docker 客户端及守护进程代理配置。
status
Published
type
Post

1. 配置 Docker 以使用代理服务器

如果您的容器需要使用 HTTP、HTTPS 或 FTP 代理服务器,您可以下面两种的方式进行配置:
  • 配置 Docker 客户端
  • 使用 CLI 设置代理
两种方式都是通过容器中的环境变量使用代理,一种是持久性的,另一种是临时性的。
特别注意:代理只在构建容器中生效,这点与 Docker 守护进程代理 不同。

1.1. 使用客户端配置文件设置代理

cat > ~/.docker/config.json << EOF { "proxies": { "default": { "httpProxy": "<http://127.0.0.1>::7890", "httpsProxy": "<http://127.0.0.1>::7890", "noProxy": "*.test.example.com,.example.org,127.0.0.0/8" } } } EOF
  • 保存文件后配置将生效,无需重启 Docker。
  • 该配置仅适用于新容器和构建,不会影响现有容器。
  • 该配置仅用于配置容器的代理环境变量,不用作 Docker CLIDocker Engine 本身。

1.1.1. 验证1:新运行容器是否使用代理

当您启动一个容器时,其与代理相关的环境变量会被自动设置。
$ docker run --rm alpine sh -c 'env | grep -i _PROXY' HTTPS_PROXY=http://127.0.0.1::7890 no_proxy=*.test.example.com,.example.org,127.0.0.0/8 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8 https_proxy=http://127.0.0.1::7890 http_proxy=http://127.0.0.1::7890 HTTP_PROXY=http://127.0.0.1::7890

1.1.2. 验证2:构建时是否使用代理

当您调用构建时,根据 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.149 HTTPS_PROXY=http://127.0.0.1::7890 #5 0.149 no_proxy=*.test.example.com,.example.org,127.0.0.0/8 #5 0.149 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8 #5 0.149 https_proxy=http://127.0.0.1::7890 #5 0.149 http_proxy=http://127.0.0.1::7890 #5 0.149 HTTP_PROXY=http://127.0.0.1::7890 #5 DONE 0.2s

1.2. 使用 CLI 设置代理

命令行上使用 --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

2. 配置 Docker 守护进程以使用代理

守护进程使用代理服务器访问存储在 Docker Hub 和其他注册表中的映像,并到达 Docker 群中的其他节点。
简单说 docker pull 操作需要配置守护进程代理。

2.1. 通过配置文件设置

vim /etc/docker/daemon.json
{ "proxies": { "default": { "httpProxy": "<http://127.0.0.1>::7890", "httpsProxy": "<http://127.0.0.1>::7890", "noProxy": "*.test.example.com,.example.org,127.0.0.0/8" } } }
更改配置文件后,需要启动
sudo systemctl restart docker

2.2. 通过环境环境变量设置

Docker 守护进程在其启动环境中检查以下环境变量:
  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

2.2.1. 常规设置

创建目录
sudo mkdir -p /etc/systemd/system/docker.service.d
创建代理配置文件:
/etc/systemd/system/docker.service.d/http-proxy.conf
[Service] Environment="HTTP_PROXY=http://proxy.example.com:3128" Environment="HTTPS_PROXY=https://proxy.example.com:3129" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
NO_PROXY 说明:
  • IP 地址 (1.2.3.4)
  • 域名或特殊 DNS 标签 ()
  • 域名匹配该名称及其所有子域。以“.”开头的域名仅匹配子域。例如 example.com 匹配 example.comfoo.example.com.example.com 仅匹配 foo.example.com
  • 单个星号 () 表示无需进行代理
  • IP 地址 1.2.3.4:80 和域名 foo.example.com:80 接受端口号
刷新更改并重启
sudo systemctl daemon-reload sudo systemctl restart docker
验证配置是否已加载
sudo systemctl show --property=Environment docker Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp

2.2.2. Rootless 模式

创建目录
mkdir -p ~/.config/systemd/user/docker.service.d
创建代理配置文件:
~/.config/systemd/user/docker.service.d/http-proxy.conf
[Service] Environment="HTTP_PROXY=http://proxy.example.com:3128" Environment="HTTPS_PROXY=https://proxy.example.com:3129" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
NO_PROXY 说明:
  • IP 地址 (1.2.3.4)
  • 域名或特殊 DNS 标签 ()
  • 域名匹配该名称及其所有子域。以“.”开头的域名仅匹配子域。例如 example.com 匹配 example.comfoo.example.com.example.com 仅匹配 foo.example.com
  • 单个星号 () 表示无需进行代理
  • IP 地址 1.2.3.4:80 和域名 foo.example.com:80 接受端口号
刷新更改并重新启动
systemctl --user daemon-reload systemctl --user restart docker
验证配置是否已加载
systemctl --user show --property=Environment docker Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
If you have any questions, please contact me.