使用Docker

时间:2017-09-13 23:32:07

标签: 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正确使用这两个经纪人?

1 个答案:

答案 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

上收听