无法从主机访问Docker

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

我正在构建一个 NodeJS,使用 ZeroMQ Socket 作为 Docker 容器内的发布者,同时也是订阅者,但订阅者在笔记本电脑/主机/本地主机中运行,真的不知道如何命名它。

基本上我想做的是通过postman调用端点/getData,这个端点位于Docker内部的Node中。

/getData 端点基本上会发布消息

来自本地的节点应该在订阅时监听该消息(但这就是它失败的地方,因为我猜它没有监听正确的 IP,尝试了很多 IP 方向但仍然不起作用)

我尝试不设置桥,但没有成功...设置桥也不起作用,但说实话,我不知道设置桥是否是解决方案。

我该如何解决这个问题?我对 Docker 端口/网络有点迷失

Docker 内的节点:

import express, { Express, Request, Response } from 'express';
import dotenv from 'dotenv';
const zmq = require('zeromq');

dotenv.config();

const app: Express = express();
const port = process.env.PORT || 3000;

const sock = new zmq.Publisher();

app.get('/getData', async (_req, res) => {
  await sock.send(['kitty cats', 'meow!']);
  res.status(200).json({ Status: 'Message Sent' });
});

app.listen(port, async () => {
  console.log(`[server]: Server is running at http://localhost:${port}`);

  await sock.bind('tcp://0.0.0.0:3500');
  console.log('Publisher bound to port 3500');
});

来自本地的节点:

const express = require('express');
const zmq = require('zeromq');
const app = express();
const port = 4000;

app.listen(port, async () => {
  console.log(`Second backend server running on port ${port}`);
  const sock = new zmq.Subscriber();

  sock.connect('tcp://backend-publisher:3500');
  sock.subscribe('kitty cats');
  console.log('Subscriber connected to port 3500');

  for await (const [topic, msg] of sock) {
    console.log(
      'received a message related to:',
      topic,
      'containing message:',
      msg
    );
  }
});

docker-compose.yml

version: '2'
services:
  backend-publisher:
    build: .
    ports:
      - '3000:3000'
      - '3500:3500'
      - '5555:5555'
    networks:
      - zmq-network

networks:
  zmq-network:
    driver: bridge
node.js docker zeromq
1个回答
0
投票

我已将订阅者的套接字连接更改为 tcp://localhost:3500 并且它确实有效,但我仍然不明白为什么是 localhost。桥接配置是否使 docker localhost?

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