配置守护程序以使用代理
如果您的组织使用代理服务器连接到互联网,则可能需要配置 Docker 守护程序以使用代理服务器。守护程序使用代理服务器访问存储在 Docker Hub 和其他注册表上的镜像,并连接到 Docker Swarm 中的其他节点。
本页介绍如何为 Docker 守护程序配置代理。有关为 Docker CLI 配置代理设置的说明,请参阅 配置 Docker 以使用代理服务器。
您可以通过两种方式配置这些设置
直接配置守护程序优先于环境变量。
守护程序配置
您可以在 daemon.json
文件中配置守护程序的代理行为,或者使用 dockerd
命令的 --http-proxy
或 --https-proxy
标志。建议使用 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 插入文件,该文件为 docker
服务设置变量。
无根模式说明
在 无根模式 下运行 Docker 时,systemd 配置文件的位置会有所不同。在无根模式下运行时,Docker 作为用户模式 systemd 服务启动,并使用存储在每个用户主目录中的
~/.config/systemd/<user>/docker.service.d/
中的文件。此外,systemctl
必须在没有sudo
的情况下执行,并且使用--user
标志。如果您在无根模式下运行 Docker,请选择“无根模式”选项卡。
为
docker
服务创建一个 systemd 插入目录$ 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 插入目录$ 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