如何在不同的 Docker 容器中运行 MQTT-Broker 和 -Clients?

如何在不同的 Docker 容器中运行 MQTT-Broker 和 -Clients?

我需要在 Docker 容器中运行一个 MQTT 代理,然后在另外两个 Docker 容器中运行两个客户端(一个发送方和一个接收方)。代理设置为监听端口 1883,因此我的理解是,所有三个容器都需要映射主机端口 1883 才能发送和接收消息。

不幸的是,这不起作用,因为每个主机端口只能映射一次。有办法解决这个问题吗?还是我做错了?

我用蚊子作为代理。发送方是 NodeRED 流,接收方是我自己编写的 .Net 应用程序。我在 Linux 主机上使用 Linux 容器。

答案1

默认情况下,Docker 使用网络驱动程序(参见文档了解更多信息)。如果您在此模式下运行,则默认情况下,每个容器都会添加到默认桥接网络

假设以上总结了您的配置(所有默认配置),那么就不需要映射任何主机端口,因为容器可以使用桥接网络进行通信。

下面是一个简化的docker-compose.yaml(见戈帕霍回教完整内容)演示了这一点。请注意,引用pubtcp://mosquitto:1883ws://mosquitto:80docker 的配置将解析mosquittomosquitto容器网络接口。

version: "3.8"
services:
  mosquitto:
    image: eclipse-mosquitto
    volumes:
      - type: bind
        source: ./binds/mosquitto/config
        target: /mosquitto/config
        read_only: true
      - type: bind
        source: ./binds/mosquitto/data
        target: /mosquitto/data
      - type: bind
        source: ./binds/mosquitto/log
        target: /mosquitto/log
  pub:
    build:
      dockerfile: publisher/dockerfile
    environment:
      pubdemo_serverURL: tcp://mosquitto:1883
  sub:
    build:
      dockerfile: subscriber/dockerfile
    environment:
      subdemo_serverURL: ws://mosquitto:80

请注意,即使想要通过主机接口访问 Mosquitto,您也只需要将端口映射1883到 Mosquitto 容器(因为这是监听连接的容器)。

相关内容