使用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终端),mqtt
和mqtt2
正在运行;我可以按预期发布和订阅消息。
const mqtt = require('mqtt')
mqtt.connect('mqtt://mqtt', {port: 1883}) // Success
mqtt.connect('mqtt://mqtt2', {port: 1884}) // Success
但是,当我在myapp
的容器内时,我只能连接到mqtt
。 mqtt2
连接会立即触发offline
事件,并且没有连接失败。我需要做些什么才能让myapp
正确使用这两个经纪人?
答案 0 :(得分:1)
这里有两个问题
links:
- mqtt
- mqtt2
现在不推荐使用链接,在撰写时甚至不需要。下次使用
时const mqtt = require('mqtt')
mqtt.connect('mqtt://mqtt', {port: 1883}) // Success
mqtt.connect('mqtt://mqtt2', {port: 1884}) // Success
从外面看。这基于主机上的端口。当您从app容器中执行此操作时,您应该执行以下操作
const mqtt = require('mqtt')
mqtt.connect('mqtt://mqtt', {port: 1883}) // Success
mqtt.connect('mqtt://mqtt2', {port: 1883}) // Success
容器无法在主机上看到映射端口。它将看到网络内部的内容。在本地网络中,两者都在1883