使用套接字 io 连接两个 docker 个容器
connect two docker containers with socket io
我目前正在 docker 将经过测试的 socket.io 应用程序用于简单的聊天应用程序,使用 socket.io 和 mocha 进行测试。服务器打开一个用于监听端口 3000 的套接字,测试客户端使用该套接字发出消息或接收发射。
我正在使用 docker 撰写文件的版本 3。
节点服务器docker文件:
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"]
测试docker文件:
FROM nodeserver
COPY test test
RUN npm update && \
npm install -g mocha && \
npm install -g socket.io-client
CMD ["npm", "test"]
docker-撰写:
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,运行节点服务器,测试客户端超时失败,这告诉我客户端看不到群网络。
现在 运行 docker 分开,即将节点服务器暴露给主机并尝试连接到我的本地主机,而不是完美地工作并且测试通过。这告诉我我的套接字和我与节点服务器通信的方式应该是正确的,这基本上意味着我应该在设置我的群网络时遇到问题。有人能告诉我我做错了什么吗?
我认为您的配置看起来不错,这是您的 nodeserver 准备就绪的问题。即使使用 depends_on
,也不能保证 nodeserver 在 test 启动时就绪。 (另外 links 无用且已弃用)。
为了验证我的假设,请尝试以下顺序:
docker-compose up -d nodeserver
稍等几秒
docker-compose up -d test
我目前正在 docker 将经过测试的 socket.io 应用程序用于简单的聊天应用程序,使用 socket.io 和 mocha 进行测试。服务器打开一个用于监听端口 3000 的套接字,测试客户端使用该套接字发出消息或接收发射。
我正在使用 docker 撰写文件的版本 3。
节点服务器docker文件:
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"]
测试docker文件:
FROM nodeserver
COPY test test
RUN npm update && \
npm install -g mocha && \
npm install -g socket.io-client
CMD ["npm", "test"]
docker-撰写:
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,运行节点服务器,测试客户端超时失败,这告诉我客户端看不到群网络。
现在 运行 docker 分开,即将节点服务器暴露给主机并尝试连接到我的本地主机,而不是完美地工作并且测试通过。这告诉我我的套接字和我与节点服务器通信的方式应该是正确的,这基本上意味着我应该在设置我的群网络时遇到问题。有人能告诉我我做错了什么吗?
我认为您的配置看起来不错,这是您的 nodeserver 准备就绪的问题。即使使用 depends_on
,也不能保证 nodeserver 在 test 启动时就绪。 (另外 links 无用且已弃用)。
为了验证我的假设,请尝试以下顺序:
docker-compose up -d nodeserver
稍等几秒
docker-compose up -d test