当前位置:首页 > 物理机 > 正文

两台物理机Docker如何直接互通?

通过配置Docker overlay网络或使用第三方网络驱动,可实现两台物理机上Docker容器的直接互通,需确保主机网络可达,并开放所需端口(如VXLAN的4789/UDP),结合服务发现(如etcd/consul)管理容器IP,使跨主机容器能无缝通信。

在Docker的实际应用中,常需实现跨物理机的容器直接通信(如微服务集群部署),以下基于专业实践,详细说明两种主流方案,兼顾安全性与效率,所有操作均基于Linux环境(CentOS/Ubuntu),确保可复现性。


解决方案核心思路

容器跨主机通信需解决两个问题:

  1. 网络打通:跨物理机的容器IP需能路由。
  2. 服务发现:容器如何感知彼此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:在跨主机启动容器

两台物理机Docker如何直接互通?  第1张

# 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,避免冲突
  • 容器直接暴露在物理网络,需强化安全策略

避坑指南

  1. 防火墙规则

    • 开放VXLAN端口:4789/UDP(Overlay)
    • 允许ICMP协议(测试)
      iptables -A INPUT -p udp --dport 4789 -j ACCEPT
  2. 服务发现替代方案

    • 若不用Swarm,可用Consul+Docker自定义网络
      docker network create -d overlay --attachable --subnet=10.5.0.0/16 consul-net
  3. 性能调优

    • Overlay网络有~10%带宽损耗,若追求极限性能选Macvlan
    • 避免NAT:使用--ip指定IP减少转发延迟

安全建议

  1. 网络隔离
    • 限制Overlay网络范围:--subnet=172.20.0.0/24
    • 启用TLS加密:docker swarm init --tlsverify
  2. 访问控制
    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协议标准(虚拟扩展局域网)
0