基础设施陷阱
网络
- 容器内的 localhost 是容器自身,不是宿主机 — 使用
host.docker.internal - 需要绑定
0.0.0.0才能让容器被外部访问 —127.0.0.1仅限容器内部 -p 5432:5432不指定 IP = 绑定所有接口 = 无防火墙则公网可达- 容器重启后 IP 变化 — 使用网络别名,不要硬编码 IP
DNS
- 默认 DNS 是内部 127.0.0.11 — 不使用宿主机的 /etc/resolv.conf
--dns完全覆盖 — 不会追加,而是替换- DNS 在 daemon 中有缓存 — 外部 DNS 变更传播延迟
- 无网络容器没有 DNS — 连 localhost 都无法解析
存储卷
- 匿名卷(Dockerfile 中的
VOLUME)无限累积 — 永远不会自动删除 docker system prune不会删除卷 — 需要显式--volumes- Bind mount 权限:容器用户 vs 宿主机用户 — 不匹配 = permission denied
- NFS 卷有延迟 = 性能糟糕 — 特别是 node_modules
存储驱动
overlay2为默认,但旧内核上的 overlayfs 有微妙 bug- dev/prod 使用不同存储驱动 = 行为不一致
- 日志无大小限制会无限增长 —
--log-opt max-size=10m /var/lib/docker磁盘满 = daemon 挂掉 — 监控必不可少
资源
- 不设
--memory限制 = 容器可用全部 RAM,触发 OOM killer - 设了
--memory不设--memory-swap= swap = 2x 内存 — 可能过大 --cpus=0.5是限制,不是预留 — 其他容器仍可使用- Java 容器不加
-XX:+UseContainerSupport看不到正确限制