用套接字io连接两个docker容器

时间:2018-11-18 11:44:18

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

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

我正在使用docker compose文件的第3版。

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"]

docker-compose:

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');
});

我的摩卡测试看起来像这样,本质上它是作为客户端附加的,并等待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,并且测试客户端由于超时而失败,这告诉我客户端看不到群集网络。

现在分别运行docker,这是将节点服务器暴露给主机,然后尝试连接到我的本地主机,效果很好,并且测试通过了。这说明我的套接字和与Nodeserver的通信方式应该正确,这基本上意味着我在建立群集网络方面应该遇到问题。有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

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

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

docker-compose up -d nodeserver

等待几秒钟

docker-compose up -d test

答案 1 :(得分:0)

好吧,显然我在nodeserver上运行测试不是一个好主意。我认为这里的关键字是

depends_on:
  - nodeserver

在“测试”服务部分中撰写。这将强制测试服务重新构建服务器并运行命令

CMD ["npm", "start"]

来自“ nodeserver”服务,并且解决了这个问题,删除了“ depends_on”之后,我所有的测试都通过了,两个容器可以连接。

完整的裸露项目可以在这里找到

https://github.com/tetrohed/couch