【问题标题】:connect two docker containers with socket io用 socket io 连接两个 docker 容器
【发布时间】:2019-04-20 23:28:22
【问题描述】:

我目前正在为一个简单的聊天应用程序对一个经过测试的 socket.io 应用程序进行 dockerizing,使用 socket.io 和 mocha 进行测试。服务器打开一个套接字用于侦听端口 3000,测试客户端使用该套接字发出消息或接收发射。

我正在使用版本 3 的 docker compose files。

nodeserver dockerfile:

FROM node:10

WORKDIR /usr/src/appserver

COPY package*.json ./
COPY public public
COPY main.js main.js

RUN npm install
RUN npm install express
RUN npm install socket.io

CMD ["npm", "start"]

测试dockerfile:

FROM nodeserver

COPY test test

RUN npm update && \
    npm install -g mocha && \
    npm install -g socket.io-client

CMD ["npm", "test"]

码头工人撰写:

version: "3"

services:
 nodeserver:
   build: .
   expose:
      - "3000"
   image: ws

 test:
   depends_on:
      - nodeserver
   links:
     - nodeserver
   build: ./test
   image: test_image

我的节点服务器正在侦听端口 3000,并在连接时向所有人发送一条 hi 消息。

let express = require('express');
let app = express();
let http = require('http').createServer(app);
let io = require('socket.io')(http);
http.listen(3000, function ()
{
    console.log('listening on *:3000');
});

io.on('connection', function(socket)
{
    console.log('a user connected');

    io.emit('hi', 'hi');
});

我的 mocha 测试看起来像这样,它本质上将自己附加为客户端并等待 hi 消息的到来。

const url = 'ws://nodeserver:3000';


describe("Chat Server", function()
{
    it("Should broadcast hi!", function(done)
    {
        let client1 = io.connect(url, options);

        client1.on('connect', function()
        {
            client1.on('hi', function(msg)
            {
                msg.should.equal("hi");
                client1.disconnect();
                done();
            });
        });
    });
}

运行 docker-compose,运行 nodeserver,测试客户端超时失败,这告诉我客户端看不到 swarm 网络。

现在单独运行 docker,即将节点服务器暴露给主机并尝试连接到我的本地主机,而不是完美地工作并且测试通过了。这告诉我我的套接字和我与 nodeserver 通信的方式应该是正确的,这基本上意味着我应该在设置我的 swarm 网络时遇到问题。有人可以告诉我我在这里做错了什么吗?

【问题讨论】:

    标签: node.js docker socket.io docker-compose mocha.js


    【解决方案1】:

    我认为您的配置看起来不错,这是您的 nodeserver 准备就绪的问题。即使使用depends_on,也不能保证 nodeservertest 启动时准备就绪。 (links 也是无用且已弃用的)。

    要验证我的假设,请尝试以下顺序:

    docker-compose up -d nodeserver

    等待几秒钟

    docker-compose up -d test

    【讨论】:

    • 嘿@Siyu,即使我等了几分钟,仍然有同样的问题
    • @Armin 你是如何单独运行的?
    • 我在我的主机上使用 -p 3000:3000 暴露了服务器并直接在容器上运行它,然后在 localhost:3000 中使用 mocha 直接在没有容器的情况下运行测试
    • 顺便说一句,在没有 compose 的情况下运行两个容器并将端口绑定到本地主机将无法正常工作,因为第二个容器抱怨端口已分配
    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2018-06-27
    • 1970-01-01
    • 2021-11-24
    • 2021-01-26
    • 2018-06-16
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多