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

内嵌 DNS:127.0.0.11 怎么解析容器名

在 Docker Engine 29.8.2 里实测内置 DNS:自定义网络上的容器 resolv.conf 是 nameserver 127.0.0.11(默认 bridge 是 192.168.65.7);容器名和 --network-alias 都能解析到容器 IP,不存在的名字退出码 1,别的网络里的名字解析不了;--dns 在自定义网络里只改上游,resolv.conf 仍是 127.0.0.11。

Docker 内置DNS 127.0.0.11 resolv.conf 网络别名 真实验证 动画演示
Kubernetes 2026-10-10

nodeSelector 与节点标签:调度不上的原因怎么看

在 5 节点 kind 集群里实测 nodeSelector 与节点标签:worker 默认只有 5 个标签(hostname、arch、os 与 beta 版),nodeSelector 的多个键是 AND;没有匹配节点时 Pending 并给出 didn't match Pod's node affinity/selector,节点打上标签后 0.2 秒内被调度,标签后来消失不赶走已运行的 Pod;nodeName 绕过调度器(不检查 cordon,资源不够时 kubelet 以 OutOfcpu 拒绝);读懂 Pending 的 message:每个节点只记在第一个淘汰它的原因里。

Kubernetes nodeSelector 节点标签 nodeName 调度 Pending 真实验证 动画演示
Docker 容器原理 2026-10-10

端口发布:-p 在 iptables 里生成了哪些规则

在 Docker Desktop(macOS)上实测端口映射:-p 9780:8000 同时绑定 0.0.0.0 和 [::],局域网也能访问,写上 127.0.0.1 后局域网地址被拒绝;-P 把 EXPOSE 的 8000/tcp 和 9000/udp 映射到随机的 55000;不写 /udp 默认是 TCP;Mac 上监听端口的是 com.docker.backend;宿主机端口冲突时退出码 125、容器停在 created。

Docker 端口映射 -p -P UDP Docker Desktop 真实验证 动画演示
Docker 容器原理 2026-10-10

网络别名:同一个名字解析到多个容器

在 Docker Engine 29.8.2 里实测网络别名:--network-alias 写进该网络下的 Aliases,默认 bridge 没有;别名按网络生效,docker network connect --alias 可以给第二个网络设不同的别名;3 个容器共用别名 db 时一次解析返回全部 3 个地址,顺序变化;断开网络或删除容器后别名随之消失。

Docker 网络别名 network-alias DNS 自定义网络 真实验证 动画演示
Docker 容器原理 2026-10-10

host.docker.internal:容器怎么访问宿主机上的服务

在 Docker Desktop(macOS)上实测 host.docker.internal:解析到 192.168.65.254(外加 IPv6),gateway.docker.internal 是 192.168.65.1;容器能访问 Mac 上只监听 127.0.0.1 的服务;容器自己的 127.0.0.1 是容器自己;--add-host host.docker.internal:host-gateway 让 /etc/hosts 里多两行;--network host 的容器也能用。

Docker host.docker.internal Docker Desktop 访问宿主机 gateway.docker.internal 真实验证 动画演示
Docker 容器原理 2026-10-10

网络 MTU:包太大被丢弃的现象

在 Docker Desktop 上实测网络 MTU:虚拟机、docker0 和默认容器的 eth0 都是 65535;docker network create -o com.docker.network.driver.mtu=1400 让容器 eth0 和虚拟机里的网桥都变成 1400;容器之间 TCP 连接的 MSS 分别是 32741(默认)、1348(MTU 1400)、1228(MTU 1280)。

Docker 网络 MTU MSS Docker Desktop 真实验证 动画演示
Docker 容器原理 2026-10-10

手动搭一个网络命名空间:ip netns 与 veth 复刻 bridge

实测容器网卡的真身:容器里 eth0@if2364 的对端是虚拟机里的 veth8554796(两端 ifindex 与 iflink 互指,类型 veth,挂在 docker0 上),两端计数器的增量相同(10504 字节);并在特权容器里手动用 ip netns 和 veth 搭了一对连通的虚拟网线。

Docker veth 网络命名空间 ifindex iflink docker0 真实验证 动画演示
Kubernetes 2026-10-10

DaemonSet:每个节点一个 Pod 的调度和更新

在 5 节点 kind 集群里实测 DaemonSet:每个符合条件的 worker 一个 Pod,控制器给 Pod 加 matchFields metadata.name 的 nodeAffinity 和 6 个自带容忍;nodeSelector 限定范围时给节点打标签 0.1 秒内 Pod 出现、去掉标签 0.1 秒内被删;NoSchedule 污点不动已有 Pod,NoExecute 污点 0.1 秒内驱逐且 DaemonSet 不再重建(desired 4 → 3);RollingUpdate maxUnavailable=1 的更新耗时 27.2 秒、maxUnavailable=2 耗时 13.9 秒,OnDelete 不改动 Pod 直到手动删除。

Kubernetes DaemonSet 滚动更新 maxUnavailable OnDelete 真实验证 动画演示
Docker 容器原理 2026-10-10

容器里的 /etc/resolv.conf:DNS 配置从哪里来

在 Docker Engine 29.8.2 里实测容器的 /etc/resolv.conf:它是来自 /var/lib/docker/containers/容器ID/resolv.conf 的单文件 bind mount,默认复制虚拟机的 nameserver 192.168.65.7;在容器里改它会同步到那个文件,但 restart 或 stop 再 start 后被重新生成;--dns、--dns-search、--dns-opt 逐项写入;daemon.json 里没有 dns 配置。

Docker resolv.conf DNS --dns --dns-search 容器启动 真实验证 动画演示
Docker 容器原理 2026-10-10

--add-host 与 /etc/hosts:谁在写这个文件

在 Docker Engine 29.8.2 里实测容器的 /etc/hosts:默认 6 行固定内容加“容器 IP + 容器 ID 前 12 位”;--add-host 的条目排在固定行之后,--hostname 与 --domainname 决定最后一行;/etc/hosts 优先于 DNS(--add-host github.com:10.9.9.11 让 ping 解析到该地址,而 nslookup 不受影响);容器里手改的内容在 restart 后丢失,--add-host 保留。

Docker /etc/hosts --add-host --hostname host-gateway 真实验证 动画演示
Docker 容器原理 2026-10-10

容器的 IPv6:开启条件与地址分配

在 Docker Engine 29.8.2 里实测容器的 IPv6:默认 bridge 没有(EnableIPv6=false,eth0 无 IPv6 地址、没有默认 IPv6 路由);docker network create --ipv6 自动选出 fd5c:c1ec:db63::/64,容器之间能按 IPv6 地址和名字(AAAA 记录)互通,还能 ping6 通外网的 2606:4700:4700::1111(往返约 202 ms)。

Docker IPv6 --ipv6 AAAA ULA 容器网络 真实验证 动画演示
Docker 容器原理 2026-10-10

连接跟踪:NAT 条目与大量短连接

进入 Docker Desktop 虚拟机读 iptables 与 conntrack:172.17.0.0/16 出网有 MASQUERADE,发布端口新增 DNAT 和放行规则;一次出站连接的 conntrack 条目显示回来方向的目的地址是虚拟机而不是容器;Mac 访问发布端口时 DNAT 包计数不增(监听者是 dockerd),容器经 172.17.0.1 访问则 DNAT +3;nf_conntrack_max=262144,删除容器后规则被清除。

Docker iptables NAT MASQUERADE DNAT conntrack 端口映射 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号