我正在构建一个 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
我已将订阅者的套接字连接更改为 tcp://localhost:3500 并且它确实有效,但我仍然不明白为什么是 localhost。桥接配置是否使 docker localhost?