在Docker和Linux环境中实现容器间网络通信,主要通过以下几种核心方式实现。以下是详细解决方案:
1. Bridge网络(默认)
# 查看默认bridge网络
docker network inspect bridge
# 运行容器(默认连接到bridge网络)
docker run -d --name container1 nginx
docker run -d --name container2 nginx
# 测试通信(在container1内ping container2)
docker exec -it container1 ping container2
2. 自定义Bridge网络
# 创建自定义网络
docker network create my-net
# 启动容器并指定网络
docker run -d --name container3 --network my-net nginx
docker run -d --name container4 --network my-net nginx
# 测试(可直接用容器名通信)
docker exec -it container3 ping container4
docker run -d --name container5 --network host nginx
# 初始化Swarm集群
docker swarm init
# 创建overlay网络
docker network create -d overlay my-overlay
# 在Swarm模式下部署服务
docker service create --network my-overlay --name service1 nginx
# 创建macvlan网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my-macvlan
# 运行容器
docker run -d --name container6 --network my-macvlan nginx
1. 手动配置路由(示例)
# 查看容器网络命名空间
docker inspect --format '{{.NetworkSettings.SandboxKey}}' container1
# 在主机上添加路由(需root权限)
ip route add 172.18.0.0/16 via <container-ip>
2. 使用iptables转发
# 允许容器间转发
iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT
方案 | 隔离性 | 性能 | 适用场景 |
---|---|---|---|
默认bridge | 中 | 中 | 单机简单场景 |
自定义bridge | 高 | 中 | 推荐的单机方案 |
Host模式 | 无 | 高 | 高性能需求场景 |
Overlay | 高 | 中低 | 跨主机通信 |
Macvlan/IPvlan | 高 | 高 | 需要直接暴露到物理网络 |
检查容器IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container1
测试网络连通性:
docker exec -it container1 curl http://container4
查看DNS解析:
docker exec -it container1 cat /etc/resolv.conf
监控网络流量:
docker exec -it container1 tcpdump -i eth0
根据具体场景选择合适的网络方案: - 开发测试推荐自定义bridge - 生产集群推荐overlay - 高性能需求考虑host或macvlan - 传统网络集成考虑ipvlan