使用 systemd 配置守护进程
本页介绍如何在使用 systemd 时自定义守护进程设置。
自定义 Docker 守护进程选项
Docker 守护进程的大多数配置选项都是使用daemon.json
配置文件设置的。有关更多信息,请参阅Docker 守护进程配置概述。
手动创建 systemd 单元文件
在没有包管理器的情况下安装二进制文件时,您可能希望将 Docker 与 systemd 集成。为此,请将GitHub 存储库service
中的两个单元文件 (和
socket
)
安装
到./etc/systemd/system
配置 Docker 守护进程以使用代理服务器
Docker 守护进程在其启动环境中使用以下环境变量来配置 HTTP 或 HTTPS 代理行为:
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
NO_PROXY
no_proxy
在 Docker Engine 23.0 及更高版本中,您还可以在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"
}
}
这些配置会覆盖默认的docker.service
systemd 文件。
如果您位于 HTTP 或 HTTPS 代理服务器后面(例如在公司设置中),则必须在 systemd 服务文件中指定守护程序代理配置,而不是在文件中daemon.json
或使用环境变量。
无根模式注意事项
在无根模式下运行 Docker 时,systemd 配置文件的位置有所不同 。当以无根模式运行时,Docker 作为用户模式 systemd 服务启动,并使用存储在每个用户主目录中的文件
~/.config/systemd/user/docker.service.d/
。此外,必须在不带标志和带标志的systemctl
情况下执行。如果您在无根模式下运行 Docker,请选择下面的“无根模式”选项卡。sudo
--user
为该服务创建一个 systemd 放置目录
docker
:$ 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
- 单个星号 (
*
) 表示不应进行代理 1.2.3.4:80
IP 地址前缀 ( ) 和域名 (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
为该服务创建一个 systemd 放置目录
docker
:$ 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
- 单个星号 (
*
) 表示不应进行代理 1.2.3.4:80
IP 地址前缀 ( ) 和域名 (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