守护进程代理配置
如果您的组织使用代理服务器连接互联网,您可能需要配置 Docker 守护进程以使用该代理服务器。守护进程使用代理服务器访问存储在 Docker Hub 和其他注册表上的镜像,并访问 Docker 群集中的其他节点。
本页面描述如何为 Docker 守护进程配置代理。有关为 Docker CLI 配置代理设置的说明,请参阅 配置 Docker CLI 使用代理服务器。
重要
Docker Desktop 会忽略在
daemon.json中指定的代理配置。如果您使用 Docker Desktop,可以通过 Docker Desktop 设置来配置代理。
您可以通过以下两种方式配置这些设置:
直接配置守护进程优先于环境变量。
守护进程配置
您可以在 daemon.json 文件中配置守护进程的代理行为,
或者使用 CLI 标志为 --http-proxy 或 --https-proxy 标志配置 dockerd 命令。
推荐使用 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_PROXYhttp_proxyHTTPS_PROXYhttps_proxyNO_PROXYno_proxy
systemd 单元文件
如果您将 Docker 守护进程作为 systemd 服务运行,您可以创建一个 systemd drop-in 文件,为 docker 服务设置变量。
无根模式注意事项
在 无根模式 下运行 Docker 时,systemd 配置文件的位置会有所不同。在无根模式下,Docker 作为用户模式的 systemd 服务启动,并使用存储在每个用户主目录中的文件,位于
~/.config/systemd/<user>/docker.service.d/中。此外,systemctl必须在不带sudo的情况下执行,并带有--user标志。如果您正在无根模式下运行 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