Docker日志防爆盘必须配置log-opts下的max-size和max-file,如"max-size":"100m","max-file":"5",单位后缀不可省略,且仅对新容器生效。

daemon.json 不是“配完就能用”的配置文件,而是 Docker 守护进程的行为总开关。真正影响生产稳定性和性能的,往往不是基础功能开启与否,而是那些被忽略的高级参数——它们控制着资源边界、网络行为、日志生命周期和存储策略。下面聚焦 5 类高频调优场景,讲清关键参数的作用逻辑和实操要点。
镜像加速与私有仓库信任
国内拉取镜像慢,本质是默认走 registry-1.docker.io(海外节点),且不支持 HTTP 私仓。仅加一个镜像源远远不够:
-
多镜像源可自动 fallback:配置数组形式的
"registry-mirrors",Docker 会按顺序尝试,首个失败即切下一个。推荐至少配两个可用源,如["https://docker.m.daocloud.io", "https://hub-mirror.c.163.com"] -
HTTP 私仓必须显式声明:若自建 registry 运行在
10.10.20.100:5000(无 TLS),需加入"insecure-registries": ["10.10.20.100:5000"],否则 pull/push 直接报错x509 certificate signed by unknown authority -
避免镜像源污染:不要混用不同厂商的镜像源(如阿里云 + 华为云),部分镜像索引同步延迟会导致 manifest 不一致,引发
pull access denied
容器日志防爆盘策略
默认 json-file 日志驱动不限大小,单个容器跑一周可能生成 20GB+ 日志,直接挤爆 /var 分区:
-
必须嵌套在
log-opts下设置:"log-driver": "json-file"本身只是声明驱动,真正生效的是其子项:"log-opts": {"max-size": "100m", "max-file": "5"} -
单位必须带后缀:
"100m"合法,100或"100"会被忽略,日志照常疯长 -
对已有容器无效:该配置只影响新创建的容器。旧容器需
docker container update --log-driver json-file --log-opt max-size=100m --log-opt max-file=5 <container>手动更新
存储路径与驱动优化
默认 /var/lib/docker 在系统盘,容易因镜像/层堆积导致磁盘告警;同时 overlay2 驱动在某些内核版本下存在 inode 泄漏风险:
-
迁移数据根目录:通过
"data-root": "/data/docker"指向大容量独立盘。注意:修改后首次重启会清空原/var/lib/docker下所有数据(镜像、容器、卷全丢),务必提前docker save备份 -
限制单镜像层大小:添加
"storage-opts": ["overlay2.override_kernel_check=true"]可绕过内核版本检查(慎用);更安全的是用"storage-opts": ["overlay2.mountopt=nodev,metacopy=on"]启用元数据复制,减少写放大 -
避免误配
dm.basesize:该参数仅对 devicemapper 生效,overlay2 下设了也无效,还可能引发 daemon 启动失败
网络冲突与网桥定制
默认 docker0 使用 172.17.0.0/16,若公司内网也是此段,容器无法访问宿主机内网服务:
-
重设网桥子网:用
"bip": "192.168.100.1/24"强制指定 docker0 IP 和掩码,值必须是 CIDR 格式,且宿主机不能已占用该网段 -
固定容器 DNS:避免继承宿主机
/etc/resolv.conf导致解析异常,显式配置"dns": ["114.114.114.114", "8.8.8.8"] -
禁用 IPv6 省开销:若业务不用 IPv6,加
"ipv6": false可跳过 IPv6 地址分配流程,容器启动快约 120ms(实测)
资源限制与运行时安全
不设限的容器可能吃光宿主机内存或打开过多文件句柄,引发 OOM 或连接拒绝:
-
全局 ulimit 控制:通过
"default-ulimits": {"nofile": {"Soft": 65536, "Hard": 65536}}统一提升文件描述符上限,避免Too many open files -
禁止特权容器默认启动:加
"no-new-privileges": true可防止容器内进程通过 setuid 提权,增强隔离性 -
GPU 容器需额外注册:启用 NVIDIA 支持需先装
nvidia-container-toolkit,再在 daemon.json 中声明"runtimes": {"nvidia": {"path": "nvidia-container-runtime"}},否则docker run --gpus all报错


















