【问题标题】:Only receiving MQTT messages in interactive mode within a docker container仅在 docker 容器中以交互模式接收 MQTT 消息
【发布时间】:2016-06-05 04:49:11
【问题描述】:

我创建了一个监听 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

-p 8883-p 8883:8883 也不会改变这种行为

EDIT2:

docker events 在容器启动时打印:

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 运行容器时,日志会在该输出下方打印received: {"sp": {"mi": ...-messages,这会验证 mqtt 侦听器是否在交互模式下工作。

【问题讨论】:

    标签: networking docker mqtt


    【解决方案1】:

    在使用 MQTT 代理库对 python3 脚本进行 dockerizing 时遇到了同样的问题。 答案有点晚了,但无论如何,如果它可以帮助某人:

    在 docker compose 中添加以下行:

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

    【讨论】:

      【解决方案2】:

      你应该检查两件事:

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

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

      【讨论】:

      • 应用程序在没有--interactive 标志的情况下启动。我使用ps auxdocker ps 进行了检查。我还尝试了-p 选项(mqtt 客户端不需要)。正如我所说,完全相同的配置适用于激活--interactive。没有--interactive,应用程序启动,但没有消息到达
      • 你能发帖docker eventsdocker logs container看看发生了什么
      • 我将docker eventsdocker logs 的输出添加到问题中
      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多