守护进程代理配置
如果您的组织使用代理服务器连接到互联网,您可能需要配置 Docker 守护进程以使用该代理服务器。守护进程使用代理服务器访问存储在 Docker Hub 和其他注册表中的镜像,并访问 Docker Swarm 中的其他节点。
本页描述了如何为 Docker 守护进程配置代理。有关为 Docker CLI 配置代理设置的说明,请参阅配置 Docker CLI 以使用代理服务器。
重要在
daemon.json中指定的代理配置会被 Docker Desktop 忽略。如果您使用 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_PROXYhttp_proxyHTTPS_PROXYhttps_proxyNO_PROXYno_proxy
systemd 单元文件
如果您以 systemd 服务的形式运行 Docker 守护进程,您可以创建一个 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.comexample.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.comexample.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