Skip to content

基础设施陷阱

网络

  • 容器内的 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 看不到正确限制

由云锦鸿维护