Networking 仅在docker容器内以交互模式接收MQTT消息

Networking 仅在docker容器内以交互模式接收MQTT消息,networking,docker,mqtt,Networking,Docker,Mqtt,我创建了一个监听MQTT代理的微服务(使用scala和Akka)。作为使用paho mqttv3库的MQTT库 该服务在本地运行时会按预期工作,但在将其打包到docker容器中后,它将仅在--interactive(-i)模式下正常运行。否则,成功连接到MQTT代理后,它将不会收到任何消息 这是一个问题,因为docker compose等工具不正确支持--interactive标志 因此,我的问题是: --interactive(-i)模式对docker容器的网络配置更改了什么?这种效果能以不同

我创建了一个监听MQTT代理的微服务(使用scala和Akka)。作为使用paho mqttv3库的MQTT库

该服务在本地运行时会按预期工作,但在将其打包到docker容器中后,它将仅在--interactive(-i)模式下正常运行。否则,成功连接到MQTT代理后,它将不会收到任何消息

这是一个问题,因为docker compose等工具不正确支持--interactive标志

因此,我的问题是: --interactive(-i)模式对docker容器的网络配置更改了什么?这种效果能以不同的方式达到吗

编辑:

当前,要启动docker容器,我运行以下命令:

docker run -i --name mqttlistener --net=test_net mqtt-listener:0.3
然后,容器将按预期工作(它连接到MQTT代理,然后接收消息)。 不带
-i
的相同命令也将启动应用程序,客户端将连接到MQTT代理:

[INFO] [02/23/2016 13:34:19.219] [main] [Remoting] Starting remoting
[INFO] [02/23/2016 13:34:19.347] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://My-Service@mqttlistener:2555]
[INFO] [02/23/2016 13:34:19.349] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://My-Service@mqttlistener:2555]
connecting to mqtt broker: ssl://my.brokers.url:8883
connected
但是没有消息会到达。 我验证了该流程是通过
ps aux
启动的,它将按预期打印正在运行的流程:

daemon   24574  2.7  0.7 7756248 119608 ?      Ssl  14:12   0:02 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp /opt/docker/lib/mqttlistener
simon    25729  0.1  0.1 242704 28156 pts/3    Sl+  14:34   0:00 docker run --name mqttlistener --net=test_net
docker ps看起来也很正常:

CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
b474f0c954dd        mqtt-listener:0.3   "bin/mqttlistener"   16 minutes ago      Up 16 minutes       2555/tcp            mqttlistener
而且
-p8883
-p8883:8883
也不会改变这种行为

EDIT2:

docker事件
在容器启动时打印:

2016-02-23T15:40:58.664173393+01:00 container create 5c3a7b9b54106735fd2c0c4e7cfd5b6edc210539230a130c2afd9b1b822dad52 (image=mqtt-listener:0.3, name=mqttlistener)
2016-02-23T15:40:58.665446821+01:00 container attach 5c3a7b9b54106735fd2c0c4e7cfd5b6edc210539230a130c2afd9b1b822dad52 (image=mqtt-listener:0.3, name=mqttlistener)
2016-02-23T15:40:59.054709073+01:00 network connect fa703609c50c1a670a450f7d3e2633494fb09bdbdf1a03833344d8af48ad52bb (type=bridge, container=5c3a7b9b54106735fd2c0c4e7cfd5b6edc210539230a130c2afd9b1b822dad52, name=test_net)
2016-02-23T15:40:59.056399012+01:00 container start 5c3a7b9b54106735fd2c0c4e7cfd5b6edc210539230a130c2afd9b1b822dad52 (name=mqttlistener, image=mqtt-listener:0.3)
docker logs mqttlistener打印输出,以验证应用程序是否已启动以及与mqtt代理的连接是否已建立:

[INFO] [02/23/2016 14:43:27.081] [main] [Remoting] Starting remoting
[INFO] [02/23/2016 14:43:27.211] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://My-Service@mqttlistener:2555]
[INFO] [02/23/2016 14:43:27.214] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://My-Service@mqttlistener:2555]
connecting to mqtt broker: ssl://my.broker.url:8883
connected

当使用
-i
运行容器时,日志会在该输出下面打印
接收到的:{“sp”:{“mi”:…
-消息,以验证mqtt侦听器是否在交互模式下工作。

您应该检查两件事:

  • 您的应用程序是否在docker容器内以非交互模式启动?(您可以使用ps aux在主机上进行偶数检查)
  • 应用程序端口是否已在主机上发布?请参阅命令的-p选项

一旦应用程序运行且端口发布,您应该在主机上连接到您公开的端口。

在使用MQTT broker库停靠python3脚本时遇到同样的问题。 现在回答有点晚,但无论如何,如果它能帮助某人:

在docker compose中添加以下行:

stdin_open: true # docker run -i
tty: true        # docker run -t

应用程序在启动时也没有使用
--interactive
标志。我用
ps aux
docker ps
检查了这一点。我还试用了
-p
选项(mqtt客户机不需要此选项)。正如我所说,完全相同的配置在激活了
--interactive
的情况下工作。如果没有
--interactive
,应用程序将启动,但不会收到任何消息。您可以发布
docker事件
docker日志容器
以查看发生了什么情况我添加了
docker事件
docker的输出记录问题的日志