多播未发送到所有 Docker 个容器
Multicast not being sent to all Docker containers
我在 docker-compose 中定义了 3 个服务。其中一个发送一个应该被其他 2 个服务接收的多播,但只有一个接收到它。 2个接收者在不同的网络中,发送者是两个网络的一部分。
docker-compose.yml:
services:
sender:
networks:
- network_a
- network_b
receiver1:
networks:
- network_a
depends_on:
- sender
receiver2:
networks:
- network_b
depends_on:
- sender
networks:
network_a:
ipam:
driver: default
config:
- subnet: 172.20.1.0/24
gateway: 172.20.1.1
network_b:
ipam:
driver: default
config:
- subnet: 172.20.2.0/24
gateway: 172.20.2.1
receiver1 获得多播但 receiver2 没有。
如果我从发件人网络字段中删除 network_a,则接收方 2 会收到消息。不知何故,多播在多个网络上不起作用。
有人知道为什么会这样吗?
当我发现问题所在时,我将自己回答。
问题不在于 Docker 或任何与 Docker 相关的问题,这完全是一个 多播 问题。
基本上,多播只能在一个网络中工作,如果你想在多个网络中发送多播消息,你必须遍历所有网络接口才能使用。
例如,在 Java 中,您必须在发送多播消息之前调用 setInterface() 方法以准确指定所使用的网络。
https://docs.oracle.com/javase/7/docs/api/java/net/MulticastSocket.html#setInterface(java.net.InetAddress)
我在 docker-compose 中定义了 3 个服务。其中一个发送一个应该被其他 2 个服务接收的多播,但只有一个接收到它。 2个接收者在不同的网络中,发送者是两个网络的一部分。
docker-compose.yml:
services:
sender:
networks:
- network_a
- network_b
receiver1:
networks:
- network_a
depends_on:
- sender
receiver2:
networks:
- network_b
depends_on:
- sender
networks:
network_a:
ipam:
driver: default
config:
- subnet: 172.20.1.0/24
gateway: 172.20.1.1
network_b:
ipam:
driver: default
config:
- subnet: 172.20.2.0/24
gateway: 172.20.2.1
receiver1 获得多播但 receiver2 没有。
如果我从发件人网络字段中删除 network_a,则接收方 2 会收到消息。不知何故,多播在多个网络上不起作用。
有人知道为什么会这样吗?
当我发现问题所在时,我将自己回答。
问题不在于 Docker 或任何与 Docker 相关的问题,这完全是一个 多播 问题。
基本上,多播只能在一个网络中工作,如果你想在多个网络中发送多播消息,你必须遍历所有网络接口才能使用。
例如,在 Java 中,您必须在发送多播消息之前调用 setInterface() 方法以准确指定所使用的网络。 https://docs.oracle.com/javase/7/docs/api/java/net/MulticastSocket.html#setInterface(java.net.InetAddress)