Не удается подключиться из Python Docker к mqtt Docker

Итак, у меня есть работающий док-контейнер toke/mosquitto, к которому я могу подключиться из внешнего докера.

Затем я использую док-контейнер Python, который должен публиковать данные моему брокеру 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...")

Код работает, пытаясь подключиться к брокеру mqtt, не работающему в докере.

Но я не могу понять, как заставить оба работать с докером и подключаться друг к другу. Мое сообщение об ошибке:

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

Я уже использую сеть докеров. Что мне не хватает?

Спасибо уже за помощь :)


person vrogg    schedule 05.04.2020    source источник
comment
Сервер mqtt - это ваш компьютер?   -  person Felipe Borges    schedule 05.04.2020


Ответы (2)


Как упомянул Фелипе, локальный хост не будет работать при использовании докера. Вы должны изменить broker = "localhost", чтобы указать на службу, которую вы определили в файле компоновки докера для mqtt, или на IP-адрес mqtt при работе в другой сети.

Если ваш файл компоновки докеров ссылается на mqtt как на mqtt (mqtt: build mqtt:latest), вам нужно изменить переменную брокера на broker = "mqtt"

person Lambo    schedule 05.04.2020
comment
Спасибо за помощь. Это помогло. Я пробовал это раньше, но, должно быть, где-то ошибся. - person vrogg; 05.04.2020

Этот код пытается подключиться к localhost. Контейнер подобен другому компьютеру, поэтому, когда вы используете localhost, вы подключаетесь к самому контейнеру.

Вы должны подключить этот код к компьютеру, на котором работает mqtt serve. Вы можете попробовать использовать явный IP-адрес этого компьютера или использовать DNS, если он у вас есть.

person Felipe Borges    schedule 05.04.2020
comment
Спасибо, я только что заработал, используя идентификатор контейнера, я пробовал это с именем изображения mqtt раньше, но это, похоже, не работает. Как я должен определить имя? Очевидно, мне это нужно при подписке на брокера, работающего на той же машине и не публикующего - person vrogg; 05.04.2020
comment
Это еще одна большая проблема, вы должны как-то определить свою машину с именем в сети докеров. Я не нахожу ничего подобного в документации по докеру. Я думаю, что лучший способ приблизиться к этому — использовать другой контейнер. - person Felipe Borges; 05.04.2020
comment
Возможно, проблема с 2 контейнерами, которая у вас была, такая же. Хорошей практикой является использование контейнерного терминала и попытка пропинговать другой контейнер. Когда вы находитесь в сети докеров, DNS контейнера совпадает с именем контейнера. - person Felipe Borges; 05.04.2020
comment
да, это план :) Спасибо за помощь - person vrogg; 05.04.2020
comment
Хорошо знать. Обязательно воспользуюсь в будущем - person vrogg; 05.04.2020