【问题标题】:Can't connect from Python Docker to mqtt Docker无法从 Python Docker 连接到 mqtt Docker
【发布时间】:2020-04-05 17:57:33
【问题描述】:

所以我运行了一个 toke/mosquitto docker 容器,我可以从外部 docker 连接到该容器。

然后我使用了一个 Python docker 容器,该容器应该将数据发布到我的 mosquitto 代理。这是我的代码:

import paho.mqtt.client as paho
import time
import random

broker = "localhost"
port = 1883


def on_publish(client, userdata, result):
    print("Device 1 : Data published.")
    pass

client = paho.Client("admin")
client.on_publish = on_publish
client.connect(broker, port)

for i in range(20):
    d = random.randint(1, 5)

    # telemetry to send
    message = "Device 1 : Data " + str(i)
    time.sleep(d)

    # publish message
    ret = client.publish("/data", message)

print("Stopped...")

代码尝试连接到未在 docker 中运行的 mqtt 代理。

但我不知道如何让两者都使用 docker 运行并相互连接。我的错误信息是:

Traceback (most recent call last):
  File "./pub_client1.py", line 15, in <module>
    client.connect(broker, port)
  File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 937, in connect
    return self.reconnect()
  File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 1071, in reconnect
    sock = self._create_socket_connection()
  File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 3522, in _create_socket_connection
    return socket.create_connection(addr, source_address=source, timeout=self._keepalive)
  File "/usr/local/lib/python3.8/socket.py", line 808, in create_connection
    raise err
  File "/usr/local/lib/python3.8/socket.py", line 796, in create_connection
    sock.connect(sa)
OSError: [Errno 99] Cannot assign requested address

我已经在使用 docker 网络。我错过了什么?

已经感谢您的帮助:)

【问题讨论】:

  • mqtt服务器是你的电脑吗?

标签: docker docker-compose mqtt mosquitto docker-network


【解决方案1】:

正如 Felipe 所说,使用 docker 时 localhost 将不起作用。你必须改变 broker = "localhost" 指向您在 docker compose 文件中为 mqtt 定义的服务,或者指向 mqtt 在不同网络上运行时的 IP 地址。

如果您的 docker compose 文件将 mqtt 引用为 mqtt (mqtt: build mqtt:latest),那么您需要将您的代理变量更改为 broker = "mqtt"

【讨论】:

  • 感谢您的帮助。那成功了。我以前试过这种方法,但我一定是在某个地方出错了。
【解决方案2】:

该代码正在尝试与 localhost 连接。容器就像另一台计算机,因此当您使用 localhost 时,您将连接到容器本身。

您必须将该代码与运行 mqtt serve 的计算机连接。您可以尝试使用该计算机的显式 IP 或使用 DNS(如果有)。

【讨论】:

  • 谢谢,我刚刚使用容器 id 让它工作,我之前用 mqtt 图像名称尝试过,但这似乎不起作用。我如何定义名称?显然,当订阅在同一台机器上运行而不发布的代理时,我需要这个
  • 这是另一个大问题,您必须以某种方式在 docker 网络中使用名称定义您的机器。我在 docker docs 中找不到类似的东西。我认为解决这个问题的最佳方法是使用另一个容器。
  • 也许您拥有的 2 个容器的问题是一样的。一个好的做法是使用容器终端并尝试 ping 另一个容器。当您在 docker 网络中时,容器 DNS 与容器名称相同。
  • 是的,这就是计划 :) 感谢您的帮助
  • 很高兴知道。以后肯定会用到
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2018-10-02
  • 2019-09-17
  • 1970-01-01
  • 2022-11-01
相关资源
最近更新 更多