应使用 systemd 的 EnvironmentFile 或 drop-in 机制修改 Docker 启动参数:前者通过 /etc/sysconfig/docker 设置 OPTIONS 变量,后者用 systemctl edit docker 创建 override.conf 重写 ExecStart;daemon.json 用于持久化核心配置,systemd 参数优先级更高。
直接修改 docker.service 原文件不可取,既容易被系统升级覆盖,又可能破坏依赖关系或 cgroup 行为。正确做法是利用 systemd 的覆盖机制(drop-in)或环境变量文件,安全、可维护地注入自定义启动参数。
用 EnvironmentFile 传递变量(推荐用于稳定配置)
大多数发行版(如 CentOS/RHEL、旧版 Debian)默认在 docker.service 中启用了 EnvironmentFile=-/etc/sysconfig/docker(或 /etc/default/docker)。你只需编辑该文件,添加 OPTIONS 变量即可:
- 确认是否启用:
sudo systemctl show docker | grep EnvironmentFile - 编辑环境文件:
sudo nano /etc/sysconfig/docker - 追加启动参数,例如:
OPTIONS="--debug --default-ulimit nofile=65536:65536 --iptables=false" - 保存后执行:
sudo systemctl daemon-reload && sudo systemctl restart docker
用 systemd drop-in 覆盖 ExecStart(推荐用于新版或精细控制)
当环境文件不存在,或你需要完全替换启动命令(比如指定 --data-root 或调试参数),应创建 drop-in 片段:
- 运行:
sudo systemctl edit docker(自动创建/etc/systemd/system/docker.service.d/override.conf) - 填入内容,注意必须完整重写
ExecStart并保留原始二进制路径和 socket 通信方式:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --debug --insecure-registry 192.168.1.0/24 - 关键点:第一行
ExecStart=清空原有值;第二行才是新命令,且必须包含-H fd://和--containerd=...以维持 socket 激活与 containerd 集成 - 保存后同样需 reload + restart
区分 daemon.json 和 systemd 启动参数的职责
不是所有参数都适合塞进 systemd 启动命令里:
-
/etc/docker/daemon.json管理长期、核心的守护进程配置:存储驱动、镜像仓库、日志选项、默认网络设置等 - systemd 启动参数适合调试、临时覆盖或与宿主机集成强相关项:如
--debug、--pidfile、--userland-proxy=false、--insecure-registry(若需动态加载)、或绑定特定 cgroup v2 行为的标志 - 两者混用时,systemd 中的
ExecStart参数会优先于 daemon.json 中同名配置(例如--data-root)
验证与排错要点
改完别跳过验证步骤:
- 检查语法:
sudo systemctl daemon-validate docker - 查看实际生效的启动命令:
sudo systemctl cat docker | grep ExecStart或ps aux | grep dockerd - 确认 cgroup 兼容性:若系统启用 cgroup v2,确保未错误启用
--cgroup-parent冲突项,且Delegate=yes保留在 service 段中 - 查日志定位失败原因:
sudo journalctl -u docker -n 50 -f


















