没有码头,我可以连接我的快速应用程序与mqtt经纪人。然而,与码头,我不能连接我的快速应用程序与码头mqtt经纪人。我明白错误-
{"log":" ', '.join(str(exc) for exc in exceptions)))\n","stream":"stderr","time":"2022-02-21T04:42:21.137558005Z"}
{"log":"OSError: Multiple exceptions: [Errno 111] Connect call failed ('127.0.0.1', 1883), [Errno 99] Cannot assign requested address\n","stream":"stderr","time":"2022-02-21T04:42:21.137562299Z"}
{"log":"\n","stream":"stderr","time":"2022-02-21T04:42:21.137566492Z"}
{"log":"ERROR: Application startup failed. Exiting.\n","stream":"stderr","time":"2022-02-21T04:42:21.137570669Z"}
这是我的main.app
from fastapi import FastAPI
from fastapi_mqtt import FastMQTT, MQTTConfig
from pydantic import BaseModel
from ipaddress import IPv4Address
import jsonpickle
app = FastAPI()
class Nmap(BaseModel):
host: IPv4Address
portRange: str
class Config:
schema_extra = {
"example" : {
"host": "10.0.2.15",
"portRange": "22-80",
"description": "Scan the port from 22 to 80 of the ip address 10.0.2.15"
}
}
mqtt_config = MQTTConfig()
mqtt = FastMQTT(config=mqtt_config)
mqtt.init_app(app)
@mqtt.on_connect()
def connect(client, flags, rc, properties):
mqtt.client.subscribe("/mqtt/toModel/#") # subscribing mqtt topic wildcard- multi-level
print("connected: ", client, flags, rc, properties)
@mqtt.on_message()
async def message(client, topic, payload, qos, properties):
print("received message: ", topic, jsonpickle.decode(payload.decode()), qos, properties)
return 0
@mqtt.on_disconnect()
def disconnect(client, packet, exc=None):
print("Disconnected")
@mqtt.on_subscribe()
def subscribe(client, mid, qos, properties):
print("subscribed", client, mid, qos, properties)
@app.get("/")
async def func():
mqtt.client.publish("/mqtt", "Hello from fastApi")
return {"result": True, "message": "Published"}
@app.post("/scan/{host}")
async def scan_host_port(nmap_details : Nmap):
results = {"got_val" : nmap_details}
print(type(nmap_details))
mqtt.client.publish("/mqtt/fromModel/nmap", jsonpickle.encode(nmap_details))
return results
这是我的应用程序停靠文件-
FROM python:3.7
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
对于MQTT,我用-
docker-compose.yml
version: "3"
services:
mqtt:
image: toke/mosquitto
network_mode: bridge
container_name: mqtt
expose:
- 1883
ports:
- 1883:1883
restart: unless-stopped
我确信这与我的停靠程序有关,但我不知道如何部署it.My,因为对接器是为运行单个进程而设计的。因此,一个进程用于代理,另一个用于简单地运行我的快速api,另一个进程用于nginx。
发布于 2022-02-21 07:01:12
127.0.0.1
总是指向当前代码绑定到的TCP/IP堆栈。
每个Docker容器都有自己的TCP/IP堆栈。因此,如果您试图从python容器连接到127.0.0.1
,那么在它自己的TCP/IP堆栈的端口1883上将不会有MQTT运行。
您应该让两个容器在同一个码头上使用同一个网络组成文件(如果需要,容器可以绑定到多个网络),然后可以用代理的三个服务名称替换IP地址,例如mqtt
。
发布于 2022-02-21 11:37:05
version: '3.5'
services:
mqtt:
image: toke/mosquitto
container_name: mqtt
expose:
- 1883
ports:
- 1883:1883
restart: unless-stopped
networks:
- my_network
fast:
container_name: fast
expose:
- 8000
networks:
- my_network
ports:
- 8000:8000
restart: unless-stopped
build:
context: .
dockerfile: Dockerfile
depends_on:
- mqtt
networks:
my_network:
driver: bridge
https://stackoverflow.com/questions/71201391
复制相似问题