知其然,知其所以然
Docker 容器原理 2026-10-10

COPY 与 ADD:自动解压和远程 URL 的差别

在 Docker Engine 29.8.2(BuildKit)里实测 COPY 与 ADD:ADD 会自动解压本地的 tar 和 tar.gz,但不解压 zip,COPY 从不解压;ADD 目录与 COPY 目录结果相同;ADD 远程 URL 下载的文件权限是 0600 属主 root,压缩包不会被解压;ADD --checksum 摘要不对时构建失败。

Docker COPY ADD Dockerfile 自动解压 真实验证 动画演示
Docker 容器原理 2026-10-10

ENTRYPOINT 与 CMD:两者组合后的最终命令

在 Docker Engine 29.8.2 里实测 ENTRYPOINT 与 CMD 的 9 种组合(用 docker create + inspect 的 Path/Args 看最终命令):docker run 后的参数只替换 CMD;--entrypoint 覆盖入口;shell 形式的 ENTRYPOINT 会让 CMD 变成 sh -c 的位置参数而被脚本忽略;exec 形式入口 + shell 形式 CMD 时入口收到 /bin/sh -c …;以及 PID 1 在 exec 形式、单条 shell 命令、复合 shell 命令下各是谁。

Docker ENTRYPOINT CMD exec形式 shell形式 真实验证 动画演示
Docker 容器原理 2026-10-10

exec 与 shell 形式:PID 1 与信号能不能传到你的程序

在 Docker Engine 29.8.2 里实测信号能不能传到你的程序:exec 形式、单条 shell 命令和 exec 接管都能在 0.1 秒内收到 SIGTERM 并退出(退出码 0);复合 shell 命令让 PID 1 变成 sh,docker stop 等满超时 3.13 秒后以 137 结束;没有信号处理的程序当 PID 1 会忽略 SIGTERM(3.16 秒,137),加 --init 后 0.13 秒、退出码 143。

Docker PID 1 信号 exec形式 shell形式 docker stop 真实验证 动画演示
Docker 容器原理 2026-10-10

ARG 与 ENV:构建参数在镜像里留下了什么痕迹

在 Docker Engine 29.8.2 里实测 ARG 与 ENV 留下的痕迹:ARG 运行时不存在,但 --build-arg 的明文值写进了 docker history(3 行)和镜像配置(docker save 的 tar 里 1 个文件含它),BuildKit 对敏感 ARG 给出警告;改任何一个 ARG 都会让它之后所有 RUN 的缓存失效;FROM 之前的 ARG 进入阶段后要重新声明才能用;ENV 可在运行时用 -e 覆盖。

Docker ARG ENV 构建参数 密钥泄漏 构建缓存 真实验证 动画演示
Docker 容器原理 2026-10-10

构建期密钥:--mount=type=secret 与直接 COPY 的区别

在 Docker Engine 29.8.2 里实测构建期密钥:COPY 再 rm 的密钥仍留在较早的层里,--build-arg 的密钥写进镜像配置和 docker history,而 RUN --mount=type=secret 在所有层和配置里都找不到密钥,运行时也没有 /run/secrets;支持 env= 传入;密钥内容不参与缓存键(换密钥仍 CACHED);required=true 缺密钥时构建失败;命令把密钥 cp 到别处仍会写进镜像。

Docker 构建密钥 BuildKit secret mount 镜像泄漏 真实验证 动画演示
Docker 容器原理 2026-10-10

BuildKit 缓存挂载:包管理器缓存怎么跨构建复用

在 Docker Engine 29.8.2(BuildKit)里实测缓存挂载:apk add curl 不带缓存挂载时每次构建 98–196 秒(这台机器网络很慢),带 RUN --mount=type=cache 后第一次要 193.7 秒,之后每次只要 0.76–0.94 秒;缓存里的 13 个文件(4644 KB)不进镜像;不同 id 是互相独立的缓存。

Docker BuildKit 缓存挂载 构建缓存 apk 真实验证 动画演示
Docker 容器原理 2026-10-10

BuildKit 并行构建:多阶段里互不依赖的阶段怎么并发

在 Docker Engine 29.8.2(BuildKit)里实测多阶段构建的并发:两个各睡 4 秒的独立阶段总共 4.34 秒(串行至少 8 秒),有依赖的阶段 8.53 秒,同一阶段内两条 RUN 8.51 秒;最终镜像用不到的阶段不会被执行(0.33 秒),--target 它才执行(3.33 秒);4 个独立阶段 4.45 秒。

Docker BuildKit 多阶段构建 并行构建 构建速度 真实验证 动画演示
Kubernetes 2026-10-10

API Server 请求链:认证、鉴权、准入、持久化各在哪一步

在 kind 起的真实 Kubernetes v1.37.0 集群里实测 API Server 的请求链:同一个 POST /pods 换身份和请求体分别得到 401、403、422、403 和 201,证明鉴权先于对象校验、对象校验先于 PodSecurity 准入;--dry-run=server 把提交的 13 个字段补成 49 个但不落盘;创建一个 Pod 时调用了 15 个变更型和 11 个校验型准入控制器;只有真正创建后 etcd 里才有 key、才有 resourceVersion。

Kubernetes API Server 认证 鉴权 准入控制 etcd 真实验证 动画演示
Docker 容器原理 2026-10-10

buildx 多平台镜像:manifest list 里放了什么

在 Docker Engine 29.8.2(containerd 镜像存储)里实测 buildx 多平台镜像:--platform linux/amd64,linux/arm64 可以 --load;镜像索引(OCI index)里有 4 个 manifest——amd64 和 arm64 各一个(480 字节),外加两个 unknown/unknown 的 attestation manifest(835 字节);arm64 的 Docker Desktop 上 amd64 镜像也能跑,3 亿次整数循环 496 ms 对原生 366 ms。

Docker buildx 多平台镜像 manifest list OCI index 真实验证 动画演示
Kubernetes 2026-10-10

准入 Webhook:mutating 与 validating 的调用顺序和失败策略

在 kind 集群里部署一个真实的 HTTPS webhook 服务,实测准入 webhook 的行为:两个 Mutating 先后为 a、b(与创建先后无关),Validating 看到的是变更之后的对象;服务缩到 0 时 failurePolicy=Fail 以 connection refused 拒绝、Ignore 放行;服务睡 4 秒时 timeoutSeconds=1 在 1.11 秒后以 context deadline exceeded 失败或放行;namespaceSelector、objectSelector、matchConditions、操作类型决定哪些请求不会调用 webhook,dry-run 会调用。

Kubernetes 准入 Webhook MutatingWebhook ValidatingWebhook failurePolicy 真实验证 动画演示
Docker 容器原理 2026-10-10

基础镜像对比:alpine、debian-slim 与 distroless 的真实体积

在 Docker Engine 29.8.2(linux/arm64)里实测基础镜像体积:busybox 6.14MB、alpine 13.6MB、debian:12-slim 136MB、ubuntu:24.04 139MB;同一个 1.57 MB 的静态 Go 程序放进 scratch / busybox / alpine / debian-slim / ubuntu,镜像分别是 2.22 / 8.36 / 15.80 / 138.15 / 141.60 MB;scratch 里没有 sh。

Docker 基础镜像 alpine debian-slim scratch 镜像体积 真实验证 动画演示
Docker 容器原理 2026-10-10

镜像摘要与标签:同一个 tag 为什么可能指向不同内容

在 Docker Engine 29.8.2(containerd 镜像存储)里实测镜像的 tag、ID 与 digest:镜像 ID 就是顶层 manifest 摘要;docker tag 挪走名字后旧镜像变成 untagged(无名字)但仍可按 ID 运行,docker build 同名则直接替换;同一个 Dockerfile 的 --no-cache 两次构建 ID 不同;全缓存重复构建默认也得到 3 个不同的 ID,关掉 provenance 后三次一致。

Docker 镜像摘要 digest 镜像ID tag provenance 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号