Docker KubernetesNotes

第 05 章:网络

zjc 于 2026-01-05 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 容器网络让不同容器、宿主机和外部系统通信。本章讲端口映射、bridge 网络、容器 DNS、host 与 none 模式,以及跨主机网络的基本原理。

5.1 网络模式

docker network ls
模式 说明
bridge 默认虚拟网桥
host 共享宿主机网络栈
none 无网络
container 复用另一容器网络栈
overlay 跨主机虚拟网络

5.2 bridge

docker network create app-net
docker run -d --name redis --network app-net redis:7.2
docker run -d --name app --network app-net -p 8080:8080 my-app

同网络容器可通过内置 DNS 名称访问:

docker exec app ping -c 2 redis

5.3 端口映射

docker run -d -p 8080:80 -p 9090:9090/udp nginx:1.27

格式:

-p hostPort:containerPort/protocol
-p hostIp:hostPort:containerPort

查看:

docker port web
ss -lntp | grep 8080

5.4 容器间通信

docker network inspect app-net

要点:

  1. 同 bridge 网络默认可通信;
  2. 不同 bridge 网络默认隔离;
  3. 使用服务名而不是动态 IP;
  4. 容器重启后 IP 可能变化;
  5. 内置 DNS 只在自定义网络中方便使用。

5.5 host 与 none

host:

docker run --network host nginx:1.27

性能较好,但缺少网络隔离,端口冲突由宿主机承担。

none:

docker run --network none busybox sleep 100

适合完全离线的批处理或安全敏感任务。

5.6 overlay

Docker Swarm 或集群环境使用 overlay:

docker network create -d overlay app-overlay

跨主机容器通信需要控制面和数据面配合,Kubernetes 中由 CNI 插件实现。

5.7 常见排查

容器内 DNS:

docker exec app cat /etc/resolv.conf
docker exec app getent hosts redis

连通性:

docker exec app sh -c 'nc -vz redis 6379'

宿主机转发:

sudo iptables -t nat -L -n
问题 排查
端口不通 端口映射、监听地址、防火墙
名称不通 是否同网络、DNS
随机断连 MTU、网络策略
性能差 NAT、代理、DNS

本章小结

单机 Docker 常用自定义 bridge 提供稳定 DNS 和隔离;host 模式性能好但隔离弱;跨主机网络依赖 overlay 或 Kubernetes CNI。排查网络先确认网络域、DNS、端口和防火墙。

思考题

  1. 为什么应用要连接服务名而不是容器 IP?
  2. bridge 和 host 网络有什么差异?
  3. 不同 bridge 网络之间默认能否通信?
  4. 端口映射后如何定位不通?
  5. overlay 网络解决什么问题?