前言
Docker 网络是容器化部署中最容易踩坑的部分。本文将系统讲解 Docker 网络模型,帮助你彻底理解容器间通信机制。
一、Docker 网络驱动类型
1. Bridge(桥接模式)- 默认
# 创建自定义 bridge 网络
docker network create --driver bridge mynet
# 启动容器并连接
docker run -d --name web --network mynet nginx
docker run -d --name db --network mynet mysql
特点:容器在同一网段,可通过容器名互访
2. Host(主机模式)
docker run -d --network host nginx
特点:容器共享主机网络栈,无网络隔离
适用:性能敏感、需要真实 IP 的场景
3. None(无网络)
docker run -d --network none alpine
特点:完全隔离,需手动配置网络
4. Overlay(覆盖网络)
docker network create --driver overlay swarm-net
特点:跨主机容器通信,用于 Swarm/K8s
5. Macvlan
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 macvlan-net
特点:容器获得独立 MAC 地址,像物理设备一样接入网络
二、容器间通信实战
场景 1:Web + 数据库
# 创建网络
docker network create app-net
# 启动数据库
docker run -d \
--name mysql \
--network app-net \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8
# 启动 Web 应用
docker run -d \
--name webapp \
--network app-net \
-e DB_HOST=mysql \
-p 8080:80 \
myapp
Web 应用通过 mysql 主机名访问数据库
场景 2:多容器服务发现
# 使用 Docker Compose
version: "3.8"
services:
web:
image: nginx
networks:
- frontend
- backend
api:
image: node:18
networks:
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
backend:
internal: true # 内部网络,外部不可访问
三、端口映射详解
基本映射
# 主机端口 8080 → 容器端口 80
docker run -p 8080:80 nginx
# 指定 IP
docker run -p 127.0.0.1:8080:80 nginx
# 端口范围
docker run -p 8080-8090:80-90 nginx
动态端口映射
# 主机随机端口 → 容器 80
docker run -P nginx
# 查看映射端口
docker port container_id
四、网络故障排查
1. 检查网络配置
# 查看所有网络
docker network ls
# 查看网络详情
docker network inspect mynet
# 查看容器网络信息
docker inspect --format="{{.NetworkSettings.Networks}}" container_id
2. 容器内网络诊断
# 进入容器
docker exec -it container_id sh
# 测试连通性
ping other_container
curl http://service:port
# 查看路由和 DNS
ip route
cat /etc/resolv.conf
3. 常见问题
- DNS 解析失败:检查 /etc/resolv.conf,使用 –dns 指定
- 端口冲突:检查主机端口占用
netstat -tulpn - 防火墙阻挡:检查 iptables/ufw 规则
五、性能优化建议
- 使用 host 网络模式可获得最佳性能(但牺牲隔离)
- 避免过多端口映射,使用反向代理统一入口
- 生产环境使用内部网络隔离敏感服务
- 考虑使用 CNI 插件(如 Calico、Flannel)获得更好性能
总结
理解 Docker 网络模型是容器化部署的基础。根据场景选择合适的网络驱动,合理设计网络拓扑,才能构建稳定高效的容器网络。