我有两个程序应该通过 MQTT 进行通信。一个启动代理进程并侦听来自另一个的消息。当在本地运行时,这一切都有效,但在 Docker 内部却不起作用。 Docker compose 文件包含 mqtt 容器的端口:
ports:
- "1883:1883"
我也尝试过这个,但没有任何区别:
expose:
- "1883"
所以它应该只是暴露的默认端口。在该容器中,mosquitto_pub 命令可以访问“localhost”的该端口,不会出现错误,但如果该命令使用分配给容器的 IP 地址或容器的名称而不是 localhost,则结果是“连接被拒绝”。其他容器不能使用 localhost 执行此类命令(至少在 Docker 中,这部分在直接在本地计算机上运行时有效),但如果它们使用 IP/容器名称,它们也会收到连接被拒绝的情况。
完全无效的主机名将导致不同的失败消息,所以我至少知道名称是正确的。此外,当在 Docker 容器中的本地主机(或 0.0.0.0)上启动时,mosquitto 代理会生成消息“错误:无法分配请求的地址”,但不会在外部启动,并且仍然继续运行,否则看起来不会出现错误。
编辑:mosquitto.conf 文件是默认的,无需修改。
默认的 mosquitto 配置仅侦听
localhost
,因此无法从容器外部的任何内容进行连接
您需要创建一个名为
mosquitto.conf
的本地文件,其中包含以下内容:
listener 1883
allow_anonymous true
并将其安装在
/mosquitto/config/mosquitto.conf