You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中Rust程序订阅MQTT失败,寻求问题排查方案

问题

将Rust程序打包为Docker镜像后,订阅同样以Docker镜像运行的Mosquitto MQTT代理时,出现本地独立运行代理不会触发的错误,代码未做任何修改。手动创建订阅者和发布者无异常,仅程序订阅时报错。Mosquitto版本在Docker和本地环境均为2.0.15。

报错信息:

DEBUG [paho_mqtt::token] Token v5 failure! Token: 0xffffa0044b20, Response: 0xffffac874590
DEBUG [paho_mqtt::token] Token failure message: "TCP/TLS connect failure"
DEBUG [paho_mqtt::token] Token w ID 0 failed with code: -1
ERROR [isumis::service::subscriber_service] [-1] TCP/TLS connect failure

相关Rust代码片段:

let host: String = env::args()
        .nth(1)
        .unwrap_or_else(|| "tcp://127.0.0.1:1883".to_string());
let id: &str = "isumis_backend";
let create_opts: CreateOptions = mqtt::CreateOptionsBuilder::new()
        .server_uri(host)
        .client_id(id)
        .finalize();

解决方案

  • 修正MQTT代理地址:Docker容器内的127.0.0.1指向容器自身,而非宿主机或Mosquitto容器。需将连接地址改为Mosquitto容器的名称(需在同一Docker网络),或宿主机的IP地址(桥接网络且端口已映射时)。比如Mosquitto容器名为mosquitto_broker,地址改为tcp://mosquitto_broker:1883。
  • 确认Docker网络配置:确保Rust程序容器和Mosquitto容器在同一个Docker网络中。默认桥接网络支持容器名访问;自定义网络需提前创建并让两个容器加入。
  • 检查端口映射与防火墙:用宿主机IP访问时,确认Mosquitto容器的1883端口已正确映射到宿主机,且宿主机防火墙未拦截该端口流量。
  • 排除TLS配置干扰:虽然代码用tcp://协议,但容器内的paho-mqtt库可能有默认TLS配置。可显式关闭TLS选项,比如在创建连接时添加.ssl_options(SslOptions::new().disable_default_ca(true).unwrap())(根据paho-mqtt-rust的API调整),确保以纯TCP方式连接。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:50:03