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 CLI
或Docker 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.com
和foo.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.com
和foo.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