bigywater.tech
Docker · 83

daemon.json:常用配置项各自的效果

前面几篇里默认日志驱动是 local、默认宽限期是 3 秒、MTU 是 65535——这些「出厂设置」到底写在哪里?这篇只读不改,找到 Docker Desktop 的引擎配置,并把每个键对应回之前的实验。

2 项 → 20 项
Mac 上的 daemon.json 与虚拟机里实际生效的 daemon.json 的键数
default-stop-timeout = 3
解释了 c30 里不带 -t 的 docker stop 约 3 秒
UseContainerdSnapshotter
Docker Desktop 设置里启用 containerd 镜像存储的开关键

两份 daemon.json

实测 · 本机执行输出
  Mac 上 ~/.docker/daemon.json(Docker Desktop 设置里的 Docker Engine 页面):{"builder": {"gc": {"defaultKeepStorage": "20GB", "enabled": true}}, "experimental": false}
  虚拟机里实际生效的 /run/config/docker/daemon.json:20 个键:['allow-direct-routing', 'builder', 'containerd', 'default-network-opts', 'default-stop-timeout', 'experimental', 'features', 'host-gateway-ips', 'hosts', 'insecure-registries', 'ipv6', 'log-driver', 'log-format', 'mtu', 'pidfile', 'proxies', 'shutdown-timeout', 'storage-driver', 'swarm-default-advertise-addr', 'userland-proxy']
  比 Mac 上多出来的键(Docker Desktop 自己补的):['allow-direct-routing', 'containerd', 'default-network-opts', 'default-stop-timeout', 'features', 'host-gateway-ips', 'hosts', 'insecure-registries', 'ipv6', 'log-driver', 'log-format', 'mtu', 'pidfile', 'proxies', 'shutdown-timeout', 'storage-driver', 'swarm-default-advertise-addr', 'userland-proxy']
    allow-direct-routing = true
    containerd = "/run/containerd/containerd.sock"
    default-network-opts = {"bridge": {"com.docker.network.enable_ipv4": "true", "com.docker.network.enable_ipv6": "false"}}
    default-stop-timeout = 3
    features = {"cdi": true, "containerd-snapshotter": true}
    host-gateway-ips = ["<本机局域网IP>", "fdc4:f303:9324::254"]
    hosts = ["fd://"]
    insecure-registries = ["hubproxy.docker.internal:5555"]
    ipv6 = false
    log-driver = "local"
    log-format = "json"
    mtu = 65535
    pidfile = "/run/desktop/docker.pid"
    proxies = {"http-proxy": "http.docker.internal:3128", "https-proxy": "http.docker.internal:3128", "no-proxy": "hubproxy.docker.internal"}
    shutdown-timeout = 2
    storage-driver = "overlayfs"
    swarm-default-advertise-addr = "<本机局域网IP>"
    userland-proxy = false
  Mac 上的两个键在虚拟机里:builder = {"gc": {"defaultKeepStorage": "20GB", "enabled": true}};experimental = false

你在 Docker Desktop 设置里编辑的是 Mac 上的 ~/.docker/daemon.json(这台机器上只有两项)。Docker Desktop 把它与自己的默认值合并后,写到虚拟机里的 /run/config/docker/daemon.json,dockerd 用 --config-file 读取这份。

出厂设置对应的现象

实测 · 本机执行输出
  log-driver = local  ↔  docker info 的 LoggingDriver = local
  features.containerd-snapshotter = True  ↔  docker info 的 Driver = overlayfs
  experimental = False  ↔  docker info 的 ExperimentalBuild = False
  default-stop-timeout = 3  ↔  不带 -t 的 docker stop 实际等待:见 c30(约 3 秒)
  default-network-opts.bridge = {"com.docker.network.enable_ipv4": "true", "com.docker.network.enable_ipv6": "false"}  ↔  默认 bridge 网络 EnableIPv6 = false
  mtu = 65535  ↔  默认容器 eth0 的 MTU = 65535(见 c52)
  host-gateway-ips = ['<本机局域网IP>', 'fdc4:f303:9324::254']  ↔  --add-host x:host-gateway 写进 /etc/hosts 的地址(见 c51)
  userland-proxy = False;shutdown-timeout = 2

log-driver、default-stop-timeout、mtu、host-gateway-ips、default-network-opts 等,就是前面几篇里看到的默认行为的来源。要改这些,我没有做任何修改:那个文件在 /run 下,看起来是启动时生成的,直接改它是否会被覆盖我没有验证;正路应该是在 Docker Desktop 的 Docker Engine 设置里写自己的键,覆盖的优先级同样没有验证。

dockerd 与 containerd

实测 · 本机执行输出
  虚拟机里的 dockerd 命令行:/usr/local/bin/dockerd --config-file /run/config/docker/daemon.json
  docker info 的 Docker Root Dir = /var/lib/docker;Server Version = 29.8.2;CgroupDriver = cgroupfs;DefaultRuntime = runc;Runtimes = ['io.containerd.runc.v2', 'runc']

dockerd 在虚拟机里以 --config-file 启动,默认运行时 runc,存储驱动 overlayfs(containerd 的 snapshotter)。

开关在哪

实测 · 本机执行输出
  settings-store.json 共 17 个键;其中与引擎相关的键名:['LastContainerdSnapshotterEnable', 'UseContainerdSnapshotter']
  UseContainerdSnapshotter = true

containerd 镜像存储在 Docker Desktop 的 settings-store.json 里由 UseContainerdSnapshotter 控制,再体现为 daemon.json 的 features.containerd-snapshotter。我只读了键名和这一个值,没有读其它设置。

分步演示

daemon.json
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。只读查看:Mac 上的 ~/.docker/daemon.json 和 settings-store.json(只读取键名与 UseContainerdSnapshotter 的值),虚拟机里的 /run/config/docker/daemon.json(特权容器加 nsenter 只读读取,方法见 c19);没有修改任何配置;proxies 一项只是 Docker Desktop 内部的代理主机名,未列出其值
    • 没有验证:在 Docker Engine 设置里覆盖这些键的效果与优先级(不修改配置)、重启后的合并过程、Linux 宿主机上的 /etc/docker/daemon.json、live-restore(见下一篇)
    京ICP备2026067502号-1京公网安备11010502063487号