使用Docker设置多个MQTT代理

使用Docker,我可以使用eclipse-mosquitto来设置一个MQTT代理,我的应用程序订阅了消息。 我现在正在学习Docker,所以想尝试将两个代理添加到Docker中 – 用不同的端口组成这样的映射:

 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 Xterminal), 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 

容器无法看到主机上的映射端口。 它会看到networking内部是什么。 而在本地networking上都是在1883收听