在Docker的实际应用中,常需实现跨物理机的容器直接通信(如微服务集群部署),以下基于专业实践,详细说明两种主流方案,兼顾安全性与效率,所有操作均基于Linux环境(CentOS/Ubuntu),确保可复现性。
解决方案核心思路
容器跨主机通信需解决两个问题:
- 网络打通:跨物理机的容器IP需能路由。
- 服务发现:容器如何感知彼此IP。
方案1:Overlay网络(推荐生产环境使用)
原理:通过VXLAN隧道封装数据包,构建跨主机的虚拟网络层,依赖Docker Swarm(内建KV存储)或外部Consul/Etcd。
步骤详解
环境准备:
- 物理机A:IP
168.1.10
,主机名node1
- 物理机B:IP
168.1.20
,主机名node2
- 关闭防火墙:
systemctl stop firewalld
或配置允许VXLAN端口(4789/UDP)
步骤1:初始化Docker Swarm集群
# 在node1执行(作为管理节点) docker swarm init --advertise-addr 192.168.1.10 # 在node2执行(加入集群) docker swarm join --token <SWARM-TOKEN> 192.168.1.10:2377
步骤2:创建Overlay网络
# 任意节点创建网络 docker network create -d overlay my-overlay-net
步骤3:在跨主机启动容器
# node1启动容器 docker run -d --name web1 --network my-overlay-net nginx # node2启动容器 docker run -d --name web2 --network my-overlay-net busybox ping web1
验证通信:
# 进入node2的容器web2 docker exec -it web2 ping web1 # 成功输出:PING web1 (10.0.0.2) 56(84) bytes of data.
关键优势:
- 自动DNS服务发现(通过容器名互通)
- 加密流量支持(
--opt encrypted
) - 无需手动管理IP路由
方案2:Macvlan网络(高性能直连)
适用场景:要求容器直接使用物理网络IP,性能接近裸机。
配置步骤
前提:物理交换机需允许混杂模式(Promiscuous Mode)。
步骤1:创建Macvlan网络
# 在两台物理机执行相同命令 docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 macvlan-net
步骤2:启动容器并指定IP
# 物理机A启动容器 docker run -d --name db1 --network macvlan-net --ip 192.168.1.101 redis # 物理机B启动容器 docker run -it --name app1 --network macvlan-net --ip 192.168.1.102 alpine ping 192.168.1.101
通信验证:
- 在
app1
中执行ping 192.168.1.101
应收到回复。
注意事项:
- 需手动分配IP,避免冲突
- 容器直接暴露在物理网络,需强化安全策略
避坑指南
-
防火墙规则:
- 开放VXLAN端口:
4789/UDP
(Overlay) - 允许ICMP协议(测试)
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
- 开放VXLAN端口:
-
服务发现替代方案:
- 若不用Swarm,可用
Consul
+Docker
自定义网络docker network create -d overlay --attachable --subnet=10.5.0.0/16 consul-net
- 若不用Swarm,可用
-
性能调优:
- Overlay网络有~10%带宽损耗,若追求极限性能选Macvlan
- 避免NAT:使用
--ip
指定IP减少转发延迟
安全建议
- 网络隔离:
- 限制Overlay网络范围:
--subnet=172.20.0.0/24
- 启用TLS加密:
docker swarm init --tlsverify
- 限制Overlay网络范围:
- 访问控制:
docker network create --opt com.docker.network.bridge.enable_icc=false isolated-net # 禁止容器间通信
方案 | 适用场景 | 复杂度 | 性能损耗 |
---|---|---|---|
Overlay网络 | 容器集群、云环境 | 中 | ~10% |
Macvlan | 低延迟应用、本地物理网络 | 高 | <1% |
生产环境首选Overlay网络(自动化程度高);若网络可控且需极致性能,用Macvlan,避免使用已弃用的
--link
或手动配置路由等高风险操作。
引用说明:
- Docker官方Overlay文档:https://docs.docker.com/network/overlay/
- Linux内核Macvlan原理:https://www.kernel.org/doc/html/latest/networking/macvlan.html
- RFC 7348: VXLAN协议标准(虚拟扩展局域网)
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/36826.html