我有一个在 docker 中运行的 mosquitto mqtt 代理。我开始它是一个 docker compose 文件。现在我正在尝试与经纪人连接,它在本地工作。当我尝试作为 docker 容器进行连接时,尽管我已将主机/代理地址从本地更改为组成映像名称,但它无法正常工作。我怎样才能让它发挥作用?
这是我尝试过的 Docker 撰写(已编辑)
version: '3.5'
services:
db:
image: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- pgdatapg:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- postgres
restart: unless-stopped
mosquitto:
image: eclipse-mosquitto
networks:
- postgres
ports:
- "1883:1883"
volumes:
- ./conf:/mosquitto/conf
- ./data:/mosquitto/data
- ./log:/mosquitto/log
app:
restart: always
build: .
depends_on:
- db
networks:
- postgres
networks:
postgres:
driver: bridge
volumes:
pgdatapg:
和我的蟒蛇的一部分
broker = "mosquitto"
port = 1883
topic = "py/mqtt/test"
def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
这是conf文件
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883
## Authentication ##
allow_anonymous false
password_file /mosquitto/conf/mosquitto.conf
我收到以下错误
| ConnectionRefusedError: [Errno 111] Connection refused
当使用 docker compose 运行时,默认情况下作为服务启动的容器被放置在以项目命名的专用 docker 覆盖网络上(默认为
docker-compose.yml
文件所在的目录名称),例如网络名为 foo_default
https://docs.docker.com/compose/networking/
只能从连接到同一网络的其他容器访问服务(并通过暴露的端口访问主机)。
因此,如果
docker-compose.yml
中只有 mosquitto,那么其他容器将无法连接到它。如果您将 python 作为服务运行的容器包含在 compose 文件中,那么它将能够连接。
您还可以在撰写文件中更改容器连接到的网络。
https://docs.docker.com/compose/networking/#specify-custom-networks
编辑:
您已强制 mosquitto 服务使用
network_mode: host
网络,因此它与 postgres
不在同一个 app
网络上。容器可以位于多个网络上,但 mosquitto 不应该绑定到主机网络来完成所有这些工作。
编辑2:
即使您在
mosquitto.conf
中需要身份验证,并且您将密码文件指向配置文件,但您也没有在应用程序中设置用户名/密码,这是行不通的。我建议您删除 mosquitto.conf
文件的最后一行并设置 allow_anonymous true
。
P.s.我怀疑由于配置文件的最后一行,目前 mosquitto 容器实际上并未启动。
您尚未为 mqtt 设置任何凭据。请按照以下步骤操作:
mosquitto:
image: eclipse-mosquitto
networks:
- postgres
ports:
- "1883:1883"
volumes:
- ./conf:/mosquitto/conf
- ./data:/mosquitto/data
- ./log:/mosquitto/log
- ./env:/etc/mosquitto #Add this line
添加最后一行。 另外,创建一个 mosquitto.conf 文件并向其中添加您的用户名和密码。
username:password
保存并重新启动容器