守护程序代理配置
如果您的组织使用代理服务器连接到互联网,您可能需要配置 Docker 守护程序以使用该代理服务器。守护程序使用代理服务器访问存储在 Docker Hub 和其他仓库上的镜像,并连接到 Docker Swarm 中的其他节点。
本页面介绍如何为 Docker 守护程序配置代理。有关为 Docker CLI 配置代理设置的说明,请参阅配置 Docker CLI 以使用代理服务器。
重要
Docker Desktop 会忽略
daemon.json
中指定的代理配置。如果您使用 Docker Desktop,您可以使用Docker Desktop 设置配置代理。
您可以通过两种方式配置这些设置
直接配置守护程序的设置优先于环境变量。
守护程序配置
您可以在 daemon.json
文件中配置守护程序的代理行为,或使用 dockerd
命令的 --http-proxy
或 --https-proxy
CLI 标志进行配置。建议使用 daemon.json
进行配置。
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "https://proxy.example.com:3129",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
更改配置文件后,重新启动守护程序以使代理配置生效
$ sudo systemctl restart docker
环境变量
Docker 守护程序在其启动环境中检查以下环境变量,以配置 HTTP 或 HTTPS 代理行为
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
NO_PROXY
no_proxy
systemd 单元文件
如果您将 Docker 守护程序作为 systemd 服务运行,您可以创建一个 systemd drop-in 文件,为 docker
服务设置变量。
无根模式注意事项
在无根模式下运行 Docker 时,systemd 配置文件的位置不同。在无根模式下运行时,Docker 作为用户模式的 systemd 服务启动,并使用存储在每个用户主目录
~/.config/systemd/<user>/docker.service.d/
中的文件。此外,必须在没有sudo
的情况下使用--user
标志执行systemctl
。如果您在无根模式下运行 Docker,请选择“无根模式”选项卡。
为
docker
服务创建一个 systemd drop-in 目录$ sudo mkdir -p /etc/systemd/system/docker.service.d
创建一个名为
/etc/systemd/system/docker.service.d/http-proxy.conf
的文件,添加HTTP_PROXY
环境变量[Service] Environment="HTTP_PROXY=http://proxy.example.com:3128"
如果您在 HTTPS 代理服务器后面,请设置
HTTPS_PROXY
环境变量[Service] Environment="HTTPS_PROXY=https://proxy.example.com:3129"
可以设置多个环境变量;要同时设置非 HTTPS 代理和 HTTPS 代理;
[Service] Environment="HTTP_PROXY=http://proxy.example.com:3128" Environment="HTTPS_PROXY=https://proxy.example.com:3129"
注意
代理值中的特殊字符,如
#?!()[]{}
,必须使用%%
进行双重转义。例如[Service] Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
如果您有内部 Docker 仓库需要直接访问而无需通过代理,您可以通过
NO_PROXY
环境变量指定它们。NO_PROXY
变量指定一个字符串,其中包含以逗号分隔的需要排除在代理之外的主机值。以下是您可以指定来排除主机的选项- IP 地址前缀 (
1.2.3.4
) - 域名,或特殊的 DNS 标签 (
*
) - 域名匹配该名称及所有子域。带有前导“.”的域名仅匹配子域。例如,给定域名
foo.example.com
和example.com
example.com
匹配example.com
和foo.example.com
,以及.example.com
仅匹配foo.example.com
- 单个星号 (
*
) 表示不应使用代理 - IP 地址前缀 (
1.2.3.4:80
) 和域名 (foo.example.com:80
) 接受字面端口号
示例
[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"
- IP 地址前缀 (
刷新更改并重启 Docker
$ 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
为
docker
服务创建一个 systemd drop-in 目录$ mkdir -p ~/.config/systemd/user/docker.service.d
创建一个名为
~/.config/systemd/user/docker.service.d/http-proxy.conf
的文件,用于添加HTTP_PROXY
环境变量[Service] Environment="HTTP_PROXY=http://proxy.example.com:3128"
如果您在 HTTPS 代理服务器后面,请设置
HTTPS_PROXY
环境变量[Service] Environment="HTTPS_PROXY=https://proxy.example.com:3129"
可以设置多个环境变量;要同时设置非 HTTPS 代理和 HTTPS 代理;
[Service] Environment="HTTP_PROXY=http://proxy.example.com:3128" Environment="HTTPS_PROXY=https://proxy.example.com:3129"
注意
代理值中的特殊字符,如
#?!()[]{}
,必须使用%%
进行双重转义。例如[Service] Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"
如果您有内部 Docker 仓库需要直接访问而无需通过代理,您可以通过
NO_PROXY
环境变量指定它们。NO_PROXY
变量指定一个字符串,其中包含以逗号分隔的需要排除在代理之外的主机值。以下是您可以指定来排除主机的选项- IP 地址前缀 (
1.2.3.4
) - 域名,或特殊的 DNS 标签 (
*
) - 域名匹配该名称及所有子域。带有前导“.”的域名仅匹配子域。例如,给定域名
foo.example.com
和example.com
example.com
匹配example.com
和foo.example.com
,以及.example.com
仅匹配foo.example.com
- 单个星号 (
*
) 表示不应使用代理 - IP 地址前缀 (
1.2.3.4:80
) 和域名 (foo.example.com:80
) 接受字面端口号
示例
[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"
- IP 地址前缀 (
刷新更改并重启 Docker
$ 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