无法与docker内的mosquitto MQTT代理连接

问题描述 投票:0回答:2

我有一个在 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
python docker mqtt paho
2个回答
0
投票

当使用 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 容器实际上并未启动。


0
投票

您尚未为 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

保存并重新启动容器

© www.soinside.com 2019 - 2024. All rights reserved.