docker host模式排错需切换至宿主机视角:端口冲突首查ss或lsof;容器间通信须用localhost或宿主机ip,不支持容器名解析;监控改用iftop、ntopng等宿主机级工具;dns和网络依赖宿主机配置。

端口冲突是第一检查项
容器启动失败报 "Address already in use",或宿主机原有服务突然失联,大概率是端口被抢占。
- 先查宿主机端口占用:
ss -tulnp | grep :80或lsof -i :3306 - 确认容器内进程是否真在监听目标端口:
docker exec -it 容器名 ss -tlnp - 注意:host 模式下,容器内看到的
127.0.0.1:80就是宿主机的127.0.0.1:80,不存在“映射”概念
容器间通信异常不是网络问题,而是设计预期
使用 host 模式的多个容器共享同一网络命名空间,它们之间没有隔离,也不走 Docker 内置 DNS。所以 ping 容器名 必然失败,curl http://app2:8080 也无效——因为根本没“app2”这个域名。
- 通信只能靠
localhost或宿主机实际 IP + 端口(如curl http://127.0.0.1:9000) - 若需服务发现,得自己搭 Consul、etcd 或用宿主机 hosts 文件硬编码
- 防火墙规则要按宿主机 IP 和端口配置,不能依赖容器名
监控和日志要换工具链
cAdvisor、Prometheus 的 cgroup 网络指标对 host 模式基本失效——它监控的是容器网络命名空间,而 host 模式下这个命名空间就是宿主机本身。
- 改用宿主机级工具:
iftop -P查实时端口流量,ntopng做长期分析 - 连接数统计用:
ss -s | grep TCP或netstat -an | grep :80 | wc -l - 日志中出现
connection refused,优先查宿主机对应端口的服务是否已启动、是否监听0.0.0.0(而非仅127.0.0.1)
DNS 和外部访问要回归系统配置
host 模式下,容器完全继承宿主机的 /etc/resolv.conf 和路由表。DNS 解析失败?不是 Docker 配置问题,是宿主机本身 DNS 不通。
- 验证:
docker run --network host alpine cat /etc/resolv.conf,对比宿主机内容是否一致 - 测试外网:
docker run --network host alpine ping -c 3 8.8.8.8,结果应与宿主机完全一样 - 若宿主机能上网但容器不能,检查是否启用了 NetworkManager 的 DNS 覆盖,或 systemd-resolved 服务异常











