Docker 获取连接的本地MQTT MOSQUITO实例127.0.0.1:1883

Docker 获取连接的本地MQTT MOSQUITO实例127.0.0.1:1883,docker,docker-compose,mqtt,mosquitto,Docker,Docker Compose,Mqtt,Mosquitto,我正在尝试通过docker和docker compose运行本地MOSQUITO代理、发布者和订阅者设置,但发布者无法连接到代理。但是,通过cli连接到本地代理可以正常工作。 在安装程序下运行时出现以下错误 { Error: connect ECONNREFUSED 127.0.0.1:1883 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1088:14) errno: 'ECONNREFUSED', code: 'E

我正在尝试通过docker和docker compose运行本地MOSQUITO代理、发布者和订阅者设置,但发布者无法连接到代理。但是,通过cli连接到本地代理可以正常工作。 在安装程序下运行时出现以下错误

{ Error: connect ECONNREFUSED 127.0.0.1:1883
  at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1088:14)
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 1883 }
本地停靠设置:

docker-compose.yml:

开发文档:

src/index.js:

但是,如果我通过mqtt js cli连接到mosquitto代理,它将按预期工作。例如。 mqtt sub-t'testTopic'-h'localhost'和mqtt pub-t'testTopic'-h'localhost'-m'来自mqtt.js'

我缺少什么?

发布者和代理在不同的容器中运行,这意味着它们有不同的IP

当发布者试图到达localhost:1883上的代理时,通常会收到一个EconRefused,因此代理不在同一个容器中

在这种情况下,您应该将127.0.0.1或localhost替换为brokerbroker的服务名称。服务名称将解析为代理容器的正确IP。

发布者和代理在不同的容器中运行,这意味着它们具有不同的IP

当发布者试图到达localhost:1883上的代理时,通常会收到一个EconRefused,因此代理不在同一个容器中


在这种情况下,您应该将127.0.0.1或localhost替换为brokerbroker的服务名称。服务名称将解析为代理容器的正确IP。

您的发布者容器和代理运行在两个不同的容器中,这意味着它们是两台不同的机器,每台机器都有自己的IP

您不能使用localhost:1883从发布者容器调用代理服务,反之亦然,从代理到发布者容器

要访问代理容器,您必须调用容器ip或名称或服务名称


在您的情况下,请更改mqtt.connectmqtt://localhost:1883; 值为mqtt.connectmqtt://broker:1883; 试一试

您的发布者容器和代理运行在两个不同的容器中,这意味着它们是两台不同的机器,每台机器都有自己的ip

您不能使用localhost:1883从发布者容器调用代理服务,反之亦然,从代理到发布者容器

要访问代理容器,您必须调用容器ip或名称或服务名称


在您的情况下,请更改mqtt.connectmqtt://localhost:1883; 值为mqtt.connectmqtt://broker:1883; 在index.js中尝试一下,您应该将localhost更改为broker。在容器内时,localhost将解析为该特定容器,因此您应该始终使用服务名称,docker将负责路由到该特定服务。此外,默认情况下,同一组合文件中的所有服务都添加到同一网络,因此无需指定它

所以基本上改变这个:const client=mqtt.connectmqtt://localhost:1883;


为此:const client=mqtt.connectmqtt://broker:1883;

在index.js中,您应该将localhost更改为broker。在容器内时,localhost将解析为该特定容器,因此您应该始终使用服务名称,docker将负责路由到该特定服务。此外,默认情况下,同一组合文件中的所有服务都添加到同一网络,因此无需指定它

所以基本上改变这个:const client=mqtt.connectmqtt://localhost:1883;


为此:const client=mqtt.connectmqtt://broker:1883;

感谢网络配置的额外提示感谢网络配置的额外提示
version: "3.5"

services:
  publisher:
    hostname: publisher
    container_name: publisher
    build:
      context: ./
      dockerfile: dev.Dockerfile
    command: npm start
    networks:
      - default
    depends_on:
      - broker

  broker:
    image: eclipse-mosquitto
    hostname: mosquitto-broker
    container_name: mosquitto-broker
    networks:
      - default
    ports:
      - "1883:1883"

networks:
  default:
FROM node:11-alpine

RUN mkdir app
WORKDIR app

COPY package*.json ./

RUN npm ci

COPY ./src ./src

CMD npm start

const mqtt = require("mqtt");

const client = mqtt.connect("mqtt://localhost:1883");

client.on("connect", () => {
  console.log("Start publishing...");
  client.publish("testTopic", "test");
});

client.on("error", (error) => {
  console.error(error);
});