如何在Docker容器中使用Socket.io连接套接字?

我有一个小型的套接字服务器在一个docker容器中,服务器看起来像

var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server, {origins: 'localhost:*'}); io.on('connection', function (socket) { console.log('Connected'); }); const PORT = 8081; const HOST = '0.0.0.0'; server.listen(PORT, HOST); 

和docker文件是

 FROM keymetrics/pm2-docker-alpine:latest WORKDIR /root RUN apk update && \ apk upgrade && \ apk add git ENV HOME /root COPY socket.js ./ COPY package.json ./ RUN npm install COPY pm2.json ./ EXPOSE 8081 CMD [ "pm2-docker", "start", "pm2.json" ] 

pm2.json看起来像

 { "apps": [{ "name": "socket-server", "script": "socket.js", "exec_mode" : "cluster", "instances" : 2, "env": { "production": true } }] } 

的package.json

 { "name": "socket-server", "version": "1.0.0", "description": "", "main": "socket.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "express": "^4.15.3", "socket.io": "^2.0.3" } } 

这一切都运行得很好

 docker run -d -p 8081:8081 socket-server 

直到我尝试从另一个容器中运行的网站连接到它,网站连接像这样…

 <script src="socket.io.js"></script> <script> var socket = io.connect('http://localhost:8081'); socket.on('connect', function(data) { console.log('Connected Client') }); </script> 

并在控制台中,它显示它轮询得很好

 Request URL:http://localhost:8081/socket.io/? EIO=3&transport=polling&t=LthQCgI&sid=93sOyTiSOe5RVOdEAAAL Request Method:POST Status Code:200 OK 

但未能获得套接字连接

 Request URL:ws://localhost:8081/socket.io/? EIO=3&transport=websocket&sid=93sOyTiSOe5RVOdEAAAL Request Method:GET Status Code:400 Bad Request 

现在,如果我运行套接字服务器,而不是在泊坞窗容器中,它是好的,套接字连接。

我已经尝试获取套接字服务器正在运行的容器的IP,并在连接脚本中使用它,但即使轮询不起作用,当我像这样configuration它。

我真的需要在一个Docker容器中。

任何帮助最受赞赏