Networking 仅在docker容器内以交互模式接收MQTT消息
我创建了一个监听MQTT代理的微服务(使用scala和Akka)。作为使用paho mqttv3库的MQTT库 该服务在本地运行时会按预期工作,但在将其打包到docker容器中后,它将仅在--interactive(-i)模式下正常运行。否则,成功连接到MQTT代理后,它将不会收到任何消息 这是一个问题,因为docker compose等工具不正确支持--interactive标志 因此,我的问题是: --interactive(-i)模式对docker容器的网络配置更改了什么?这种效果能以不同的方式达到吗 编辑: 当前,要启动docker容器,我运行以下命令: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容器的网络配置更改了什么?这种效果能以不同
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的输出记录问题的日志