docker - 多播未发送到所有 Docker 容器

标签 docker docker-compose multicast docker-networking

我在 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 相关的东西,严格来说是 多播问题。

基本上,多播只能在一个网络中工作,如果要在多个网络中发送多播消息,则必须遍历所有网络接口(interface) 要使用的。

例如,在 Java 中,您必须在发送多播消息之前调用 setInterface() 方法来准确指定使用的网络。
https://docs.oracle.com/javase/7/docs/api/java/net/MulticastSocket.html#setInterface(java.net.InetAddress)

关于docker - 多播未发送到所有 Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38458213/

相关文章:

node.js - Docker容器中的Node.js和React

docker - 无法从注册表中删除 Docker 镜像

docker-compose 退出代码 141

docker - 在Docker上设置Varnish + Drupal

android-emulator - 有什么方法可以在 Android Emulator 上接收多播数据包?

docker - 无法在dockerfile中使用命令启动Java容器

Dockerfile:将 RUN 指令输出到变量中

deployment - 使用 Docker 的单容器应用程序是 ECS 还是 EB?

c - 如何在 C 中使用 igmp v3 加入多播组

c++ - 本地网络上的可靠组播