我需要在 Docker 容器中运行一个 MQTT 代理,然后在另外两个 Docker 容器中运行两个客户端(一个发送方和一个接收方)。代理设置为监听端口 1883,因此我的理解是,所有三个容器都需要映射主机端口 1883 才能发送和接收消息。
不幸的是,这不起作用,因为每个主机端口只能映射一次。有办法解决这个问题吗?还是我做错了?
我用蚊子作为代理。发送方是 NodeRED 流,接收方是我自己编写的 .Net 应用程序。我在 Linux 主机上使用 Linux 容器。
答案1
默认情况下,Docker 使用桥网络驱动程序(参见文档了解更多信息)。如果您在此模式下运行,则默认情况下,每个容器都会添加到默认桥接网络。
假设以上总结了您的配置(所有默认配置),那么就不需要映射任何主机端口,因为容器可以使用桥接网络进行通信。
下面是一个简化的docker-compose.yaml
(见戈帕霍回教完整内容)演示了这一点。请注意,引用pub
和tcp://mosquitto:1883
子ws://mosquitto:80
docker 的配置将解析mosquitto
为mosquitto
容器网络接口。
version: "3.8"
services:
mosquitto:
image: eclipse-mosquitto
volumes:
- type: bind
source: ./binds/mosquitto/config
target: /mosquitto/config
read_only: true
- type: bind
source: ./binds/mosquitto/data
target: /mosquitto/data
- type: bind
source: ./binds/mosquitto/log
target: /mosquitto/log
pub:
build:
dockerfile: publisher/dockerfile
environment:
pubdemo_serverURL: tcp://mosquitto:1883
sub:
build:
dockerfile: subscriber/dockerfile
environment:
subdemo_serverURL: ws://mosquitto:80
请注意,即使想要通过主机接口访问 Mosquitto,您也只需要将端口映射1883
到 Mosquitto 容器(因为这是监听连接的容器)。