docker - 使用 Docker 设置多个 MQTT 代理

标签 docker docker-compose mqtt

使用 Docker,我能够使用 eclipse-mosquitto 为我的应用程序设置一个 MQTT 代理,该代理订阅消息。我现在正在学习 Docker,所以想尝试向 Docker-compose 添加两个代理,并映射不同的端口,如下所示:

version: '3'
services:
  myapp:
    ...
    links:
      - mqtt
      - mqtt2
    depends_on:
      - mqtt
      - mqtt2
  mqtt:
    image: eclipse-mosquitto:latest
    container_name: mqtt-iot
    ports:
      - 1883:1883

  mqtt2:
    image: eclipse-mosquitto:latest
    container_name: mqtt2-iot
    ports:
      - 1884:1883

myapp 容器外部(即从我的 OS X 终端),mqttmqtt2在工作中;我可以按预期发布和订阅消息。

const mqtt = require('mqtt')
mqtt.connect('mqtt://mqtt', {port: 1883}) // Success
mqtt.connect('mqtt://mqtt2', {port: 1884}) // Success

但是,当我在 myapp 的容器内时,我只能连接到 mqttmqtt2 连接立即触发 offline 事件,并且没有连接失败。我需要做什么才能让 myapp 正确使用这两个代理?

最佳答案

这里有两个问题

links:
  - mqtt
  - mqtt2

链接现已弃用,甚至在您的撰写中也不需要。接下来当您使用下面时

const mqtt = require('mqtt')
mqtt.connect('mqtt://mqtt', {port: 1883}) // Success
mqtt.connect('mqtt://mqtt2', {port: 1884}) // Success

从外面。这基于主机上的端口。当您从应用程序容器中执行此操作时,您应该像下面这样做

const mqtt = require('mqtt')
mqtt.connect('mqtt://mqtt', {port: 1883}) // Success
mqtt.connect('mqtt://mqtt2', {port: 1883}) // Success

容器看不到主机上的映射端口。它将看到网络内部有什么。在本地网络中,两者都在 1883

上监听

关于docker - 使用 Docker 设置多个 MQTT 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46208288/

相关文章:

linux - 在 Tinycore (Docker) 上安装 Firefox

docker - 带有docker的Elasticsearch应用程序可在多节点集群上运行

python - 如何使用 Python 中的 Mosquitto 将文件发布到 AWS-IoT

docker - 在服务器上的docker-compose上使用代理

linux - 是否可以在 docker 容器中运行 linux perf 工具

docker - Docker错误在构建文件后无法复制文件

ssl - TLS 连接到 cloud mqtt for owntracks

php - 如何正确设置数据卷容器?

docker - 如何将链接容器视为 localhost?

android - 用于 Android 聊天应用程序的 MQTT/限制主题访问