这是《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
要点:
- 同 bridge 网络默认可通信;
- 不同 bridge 网络默认隔离;
- 使用服务名而不是动态 IP;
- 容器重启后 IP 可能变化;
- 内置 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、端口和防火墙。
思考题
- 为什么应用要连接服务名而不是容器 IP?
- bridge 和 host 网络有什么差异?
- 不同 bridge 网络之间默认能否通信?
- 端口映射后如何定位不通?
- overlay 网络解决什么问题?