在 Docker Desktop(macOS)上实测 volume 与 bind mount:docker rm 不删命名卷也不删匿名卷(要 rm -v);空卷第一次挂载会复制镜像该目录的内容而 bind mount 会盖住它;建 1000 个小文件命名卷 20 ms、可写层 42 ms、宿主机 bind mount 361 ms;-v 会自动创建不存在的宿主机目录而 --mount 报错。
在 Docker Desktop(macOS)上实测挂载卷的权限:bind mount 里容器 root 创建的文件在宿主机上是宿主机用户(uid 501)的,uid 1000 的容器用户可以写 755 的宿主机目录,容器里 chown 不改变宿主机属主;命名卷存真实 uid,镜像目录属主是 root 时 uid 1000 写入 Permission denied,属主是 1000 时空卷会继承并写入成功。
在 Docker Engine 29.8.2 里实测 tmpfs 挂载:默认大小是内存的一半(3967 MiB,MemTotal 7934 MiB),size=10m 写满报 No space left on device;容器重启后数据消失;写 100 MiB 内存增加 100.4 MiB;--memory 64m 时往 200m 的 tmpfs 写 150 MiB,dd 被 OOM 杀死(137)。
在 Docker Engine 29.8.2 里实测 docker cp:src 与 src/. 的区别、目标目录不存在的几种结果、属主(macOS 上拷进去仍是 501:20)、拷到 tmpfs 时退出码 0 但文件丢失、-L 对符号链接的影响,以及 64 MiB 文件拷进 799 ms、拷出 513 ms(中位数,3 次的波动不小)。
在独立的 kind 集群里把工作节点的 evictionHard.memory.available 调到比当前可用量低 900 MiB,让四个不同 QoS 的 Pod 同时占内存 1400 MiB:先被驱逐的是用量远超 requests 的 BestEffort 与 Burstable,用量低于 requests 的 Burstable 和 Guaranteed Pod 一直存活;驱逐 message 写明阈值、可用量、容器用量和 requests;节点出现 MemoryPressure=True 与 memory-pressure 污点,压力消失 20 秒后才恢复。
在 Docker Engine 29.8.2 里实测容器的状态机:created(Pid=0、没有 IP)→ running → paused → exited(stop -t 1 后 ExitCode 137)→ 再 start 可写层仍在;docker run --rm 的事件是 create → attach → start → die → destroy,docker stop 会先后发出信号 15 和 9;一次 docker run --rm true 约 243 ms。
进入 Docker Desktop 虚拟机实测容器进程的父进程链:容器里的 PID 1 在虚拟机里是 13063,它的父进程是 containerd-shim-runc-v2(-id 等于容器 ID),shim 的父进程是 /initd(PID 1);每个容器一个 shim,容器运行时没有 runc 进程;docker exec 的进程挂在同一个 shim 下;kill -9 主进程后容器 exited(137),shim 随之消失。
在 Docker Engine 29.8.2 里逐个复现容器退出码:127(命令不存在)、126(不可执行)、125(docker 自己出错)、128 加信号编号(TERM 143、INT 130、ABRT 134、SEGV 139、KILL 137);PID 1 没处理程序时 docker stop 得到 137 而 --init 得到 143;137 要靠 OOMKilled 区分 OOM 与 kill。
在 kind 节点的 cgroup v2 里实测 requests 与 limits 对 CPU 的影响:limit 200m 的死循环 10.3 秒只用 2.06 秒 CPU,79 个周期被限流;没有 limit 的容器用到 3.99 个核而 limit 1 核的只有 1.00 个核;只有 requests 时竞争按 cpu.weight 分(100m:400m 的实测用量比 1:3.08);同样的计算在无 limit、500m、100m 下分别花 4.3、8.4、54.8 秒。
在 Docker Engine 29.8.2 里实测重启策略:no 不重启、on-failure:2 只在失败时重启 2 次、always 和 unless-stopped 连成功退出也重启;失败容器的重启间隔 175、276、467、886、1679、3310、6537 ms,每次约翻倍;docker stop 和 docker kill 之后不会被拉起;--rm 与 --restart 冲突。
在 Docker Engine 29.8.2 里实测停止信号与宽限期:docker stop 默认发 SIGTERM,--stop-signal 和 Dockerfile 的 STOPSIGNAL 可以换信号且运行时优先;清理要 3 秒的程序 -t 5 能干净退出(0)、-t 1 被打断(137);这台 Docker Desktop 的守护进程默认宽限期是 3 秒(default-stop-timeout),--stop-timeout 与 docker stop -t 依次覆盖它。
在 kind 节点的 cgroup v2 里实测内存 limit 与 OOM:limit 64Mi 对应 memory.max=67108864,容器 cgroup 的 memory.oom.group=1,python 分配 100 MiB 后容器 OOMKilled(exitCode 137,oom_group_kill 计数增加);sh 作 1 号进程、python 是子进程时整个容器仍一起被杀(oom_kill 4);写内存型 emptyDir 占用的内存重启后不释放,导致 StartError: container init was OOM-killed,而写磁盘的页缓存可回收;在线把 limit 调到 256Mi 后进程不重启就继续跑到 150 MiB。