直接修改 /etc/docker/daemon.json 是调整 docker 守护进程行为最稳妥推荐的方式,需明确存储驱动选型(如 overlay2)、配置 storage-opts 性能参数、自定义网络 bip 与 dns,并验证 docker info 输出是否生效。

直接修改 /etc/docker/daemon.json 是调整 Docker 守护进程底层行为最稳妥、最推荐的方式。它比命令行启动参数更持久,比环境变量更清晰,且支持绝大多数核心运行时配置。关键在于理解哪些参数真正影响存储驱动与网络行为,以及它们之间的依赖关系。
明确存储驱动选型并设置专属参数
Docker 支持多种存储驱动(如 overlay2、zfs、btrfs、devicemapper),但并非所有系统都默认启用最优选项。选择前需确认内核支持和文件系统兼容性(例如 overlay2 要求 Linux 4.0+ 且挂载点为 ext4/xfs)。
- 强制指定驱动:通过
"storage-driver": "overlay2"显式声明,避免自动探测偏差 - 为 overlay2 配置性能与空间策略:
"storage-opts": ["overlay2.override_kernel_check=true", "overlay2.mountopt=nodev,metacopy=on"](仅在确认内核版本足够新时启用metacopy) - 若使用
zfs,必须提前创建 ZFS 池并指定:"storage-driver": "zfs", "storage-opts": ["zfs.poolname=myzpool"] - 禁用不安全的回退机制:添加
"storage-driver": "overlay2", "storage-opts": ["overlay2.skip_mount_home=true"]可防止因 home 目录挂载异常导致守护进程失败
精细控制容器网络初始化与桥接行为
Docker 默认创建 docker0 网桥并分配私有子网,但生产环境常需规避 IP 冲突、限制容器通信范围或对接物理网络拓扑。
- 自定义默认网桥地址段:
"bip": "172.28.0.1/16"(注意掩码长度影响可用 IP 数量) - 禁用 iptables 自动规则(适用于已部署外部防火墙或使用 CNI 插件):
"iptables": false,但需确保"ip-forward": true仍启用以保障跨网段转发 - 关闭默认网桥创建(完全交由用户管理):
"bridge": "none",此时docker run --network bridge将失败,必须显式使用自定义网络 - 限制容器 DNS 行为:
"dns": ["1.1.1.1", "8.8.8.8"], "dns-search": ["internal.example.com"],避免继承宿主机 resolv.conf 中不可控项
协同配置:存储与网络的隐含依赖项
某些参数表面独立,实则影响存储驱动加载或网络功能可用性。忽略它们可能导致守护进程启动失败或行为异常。
-
"live-restore": true在更新守护进程时不中断容器,但要求存储驱动支持热重载(overlay2支持,devicemapper不支持) -
"userland-proxy": false关闭用户态端口转发,提升 NAT 性能,但需确保内核模块ip_tables和ipt_REJECT已加载(否则端口映射失效) -
"default-ulimits": {"nofile": {"Name": "nofile", "Hard": 65536, "Soft": 65536}}—— 大量小文件读写(如镜像层解压)或高并发连接(如反向代理容器)时,必须提高文件描述符限制,否则触发overlay2元数据操作失败或连接拒绝
验证与调试:确保配置真正生效
修改后不能只依赖 systemctl restart docker。必须检查实际运行时状态是否匹配预期。
- 执行
docker info | grep -E "(Storage|Network|Driver)",确认输出中Storage Driver和Bridge地址与 daemon.json 一致 - 运行
cat /var/run/docker/netns/default(需安装iproute2)验证默认网络命名空间是否存在;若设为"bridge": "none",该路径应不存在 - 创建测试容器:
docker run --rm alpine ls /var/lib/docker/overlay2,观察目录结构是否符合 overlay2 分层逻辑(而非 aufs 或 devicemapper 的 device 目录) - 检查日志:
journalctl -u docker.service -n 50 --no-pager,重点查找failed to start daemon或storage driver not supported类错误











