在 Docker Engine 29.8.2 里实测日志延迟:Python 的 print 写到管道时块缓冲,docker logs 里第一行 10.3 秒(进程退出时)才出现;python -u、PYTHONUNBUFFERED=1、flush=True、docker run -t 都在 0.1~0.2 秒内出现;stderr 不缓冲;不 flush 时第一批在累计 8100 字节(约 8 KiB 缓冲区)时出现。
在 kind 集群里实测 Deployment 滚动更新:6 个副本下默认 25%/25% 峰值 8 个 Pod、最低 5 个 Ready(maxSurge 向上取整、maxUnavailable 向下取整),用时 7.9 秒;maxSurge 1 / maxUnavailable 0 与 maxSurge 0 / maxUnavailable 1 都要约 24 秒,maxSurge 100% 只要 4.0 秒但峰值 12 个;Recreate 有约 6 秒完全不可用;minReadySeconds=5 让 4 个副本的更新从 15.9 秒变成 31.9 秒。
在 Docker Engine 29.8.2 里实测 docker events:一轮对卷、网络、镜像、容器的操作产生 15 条事件(容器 create → attach → start → die → destroy,卷 create → mount → unmount → destroy,网络 create → connect → disconnect → destroy);事件有 Action、Actor、Type、scope、time、timeNano 字段;--filter type= / event= / container= 过滤;--since 24h 也只能回看到最近的 256 条。
在 Docker Engine 29.8.2 里实测 docker stats:两个满负荷进程的 CPUPerc 是 198.98%(与从 cgroup cpu.stat 算出的 200% 一致,100% 是一个核);MemUsage 不含页缓存(写 200 MiB 文件后 cgroup 的 memory.current 涨了约 200 MiB,docker stats 只涨几 MiB);NetIO 与 eth0 的内核计数一致;BlockIO 记录写入量。
在 kind 集群里实测 Deployment 的发布历史:每个 Pod 模板版本对应一个 ReplicaSet(revision 记在注解里,旧的缩到 0 保留);rollout undo --to-revision=2 把 revision 2 的 ReplicaSet 重新启用并改号为 5,不带参数再 undo 回到 revision 4(变成 6);revisionHistoryLimit=2 时只保留当前加最近 2 个,回滚已被删除的 revision 报 unable to find specified revision;change-cause 注解显示在 history 里;pause/resume 把多次修改合成一次发布。
在 Docker Engine 29.8.2 里实测 docker inspect:容器对象有 24 个顶层键(HostConfig 63 项),镜像对象 14 个;--format 的 json、index、range、printf 取出 PID、环境变量、标签、挂载、端口映射;-s 才有 SizeRw(写 10 MiB 后约 10493952 字节);容器和镜像同名时默认返回容器,要用 --type 区分。
在 Docker Engine 29.8.2 里实测 docker top:它显示的是虚拟机里的 PID(53711),docker exec ps 里是容器里的 PID(1);参数交给虚拟机的 ps;用户名由虚拟机的 /etc/passwd 解析(uid 1 在容器里叫 bin、docker top 显示 daemon);必须含 PID 列;scratch 镜像里没有 ps 也能用 docker top。
进入 Docker Desktop 虚拟机读容器的 cgroup v2 目录:/sys/fs/cgroup/docker/容器ID(86 个文件);--cpus 0.5 是 cpu.max = 50000 100000、--cpu-shares 512 是 cpu.weight = 59、--memory 100m 是 memory.max = 104857600、--pids-limit 50 是 pids.max = 50、--device-write-bps 变成 io.max;cgroup.procs 与 docker top 一致;docker pause 就是 cgroup.freeze = 1。
在 kind 集群里实测 ReplicaSet 的收养:先有标签匹配的裸 Pod 再创建 replicas=2 的 ReplicaSet,裸 Pod 被收养(ownerReferences、uid 不变)只再新建 1 个;改标签的 Pod 脱离 ReplicaSet、ReplicaSet 补新的,标签改回后又被收养并删掉多余的;--cascade=orphan 删除后同 selector 的新 ReplicaSet 接管全部 Pod(uid 不变);两个 selector 相同的 ReplicaSet 各管各的,新来的匹配裸 Pod 被收养后立刻作为多余的删掉。
在 Docker Engine 29.8.2 里实测 docker system df:四行(Images、Containers、Local Volumes、Build Cache);往卷写 30 MB 随机数据 Local Volumes 增 31.0 MB,容器可写层 30 MB 使 Containers 增 31.5 MB,30 MB 的镜像层使 Images 和 Build Cache 各增 63.0 MB;Reclaimable 就是没有容器引用的部分(卷 299.3MB → 267.8MB、镜像 323.2MB → 260.3MB)。
在 Docker Engine 29.8.2 里实测各种 prune,全部带 --filter label=bwlab=1 只清理自己创建的对象:container prune 只删 exited 和 created 的容器;image prune 不带 -a 只删悬空镜像(这里是 0B),-a 才删没有容器使用的镜像;volume prune 只清匿名卷,-a 才删命名卷;network prune 删没有容器的自定义网络;别的对象前后数量不变。
直接对 Docker Desktop 的 unix socket 发 HTTP 请求:/_ping、/version(ApiVersion 1.56,MinAPIVersion 1.40)、/info;用 API 创建、启动、等待、读日志(多路复用流,8 字节帧头)、删除一个容器;API 版本写在路径里,低于 1.40 或高于 1.56 都返回 400;用代理记录 docker run --rm 发出的 6 个请求。