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
相关产品推荐
相关产品推荐

