用假的秘密值实测环境变量的可见范围:-e 传入的值在 docker inspect、docker exec env、/proc/PID/environ、虚拟机里都能读到(另一个容器和 docker logs 看不到);命令行参数在 docker ps --no-trunc、docker top、docker inspect 里都可见;进程里 pop 掉环境变量抹不掉 /proc/self/environ;改成只读挂载文件后 inspect、env、environ 都看不到秘密值。
在 Docker Engine 29.8.2 里对比 Docker-in-Docker 和挂载 docker.sock:DinD(--privileged 的 docker:dind)里的嵌套 dockerd 0.3 秒就绪、镜像库是空的、看不到外层容器;挂载 socket(不需要 --privileged)则共用外层 dockerd,docker ps 看到全部 9 个容器,创建出来的是外层的兄弟容器;DinD 不加 --privileged 时 dockerd 因 iptables 权限起不来。
在 Docker Engine 29.8.2(cgroup v2)里实测让 systemd 当 PID 1:什么都不加、只加 tmpfs、加 --cap-add SYS_ADMIN 与 seccomp=unconfined 都以 255 退出,只有 --privileged 能启动(0.5 秒到 running,空闲 15.25MiB、9 个进程);STOPSIGNAL SIGRTMIN+3 下 docker stop 0.2 秒,SIGTERM 下等满 10.2 秒后 137。
在 Docker Engine 29.8.2 里实测 DNS 轮询:三个容器共用别名 svc,getaddrinfo 返回全部三个地址,顺序每次随机打乱;每次重新解析的 300 个请求分成 103 / 99 / 98;只解析一次的客户端 300 个请求全落在同一个后端;停掉一个后端后 DNS 答案立刻去掉它,但缓存了旧 IP 的客户端全部失败。
在 Docker Engine 29.8.2 里实测容器的时间:容器用虚拟机内核的时钟(与 Mac 差约 20 毫秒的测量误差),有独立的时间命名空间但偏移为 0,uptime 是虚拟机的;alpine 里 TZ=Asia/Shanghai 无效(没有 zoneinfo),TZ=CST-8 或自带 zoneinfo 的镜像有效,挂 /etc/localtime 也行;date -s 被拒绝;docker logs -t 与 StartedAt 永远是 UTC。
在 Docker Engine 29.8.2 里实测 --sysctl:net.core.somaxconn、net.ipv4.ip_local_port_range、kernel.shmmax 等属于命名空间的参数只改容器内的值,虚拟机里的值不变;vm.swappiness、kernel.panic、fs.file-max、kernel.pid_max 被拒绝(125);--network host 或 --ipc host 时对应的参数也被拒绝;容器里直接写 /proc/sys 是只读的。
在 Docker Engine 29.8.2 里实测 /dev/shm:默认 64 MiB,--shm-size 可调;dd 写 100 MiB 只能写进 64 MiB;mmap 写 100 MiB 的共享内存在默认下被 SIGBUS 杀死(退出码 135),--shm-size 128m 则正常;/dev/shm 的占用算进容器内存(+80.5 MiB),--memory 更小时先被 OOM;--ipc container: 能共享 /dev/shm。
在 Docker Engine 29.8.2 里复现文件描述符泄漏:nofile=200 时第 198 次 open 报 No file descriptors available,普通写法的程序处理错误时又要 fd 而再次失败(容器退出 1);无上限时每秒泄漏约 94 个且虚拟机全局的 file-nr 同步增长(3858 → 4160);socket 泄漏表现为 60 个 CLOSE_WAIT;用 /proc/PID/fd 的链接目标分组就能定位,不需要 lsof。
真实验证 FROM scratch 的构建阶段也能用 exec-form RUN 执行程序生成产物、单阶段镜像 3.71MB 对比多阶段镜像 11kB(体积差约 300 多倍)、把镜像 docker save 展开后真实确认最终层里只有产物文件、编译工具本身完全没有进入最终镜像,对照 Dockerfile 官方文档里 FROM...AS 与 COPY --from 的定义。
真实构建 FROM scratch 容器镜像,本机真实实测默认 bridge 网络下容器间只能用 IP 通信、用容器名解析会真实失败(dial tcp: lookup ... no such host);自定义 bridge 网络下容器名解析真实成功;两种网络下 /etc/resolv.conf 的真实差异(有没有 Docker 内嵌 DNS 127.0.0.11)直接揭示原因;-p 端口映射真实验证宿主机能连进容器内部的 TCP 服务。
真实构建多层 FROM scratch 镜像,本机真实实测每条 COPY 指令怎么变成 docker history 里独立的一层、ENV/LABEL/ENTRYPOINT 这些元数据指令是真实的 0 字节层、原样重建全部命中缓存、改中间一条 COPY 的源文件会让它自己和后面所有层全部失效重建而前面的层不受影响,对照 OCI 镜像规范里层按顺序叠加的定义。
真实构建 FROM scratch 容器镜像,本机真实实测 --memory/--cpus 最终写进 cgroup v2 的 memory.max/cpu.max 文件、一个真实吃内存的程序在限制下被真实 OOM Kill(退出码 137)、--cpus=0.25 真实测出的耗时不是理论上的 4 倍而是约 6 倍,用真实的 cpu.stat 节流计数解释原因,对照 runc 依赖的 cgroups 库真实源码。