Docker容器中的SocketIO客户端

时间:2019-01-24 17:06:15

标签: docker networking socket.io

在Docker容器中运行的SocketIO客户端未连接到服务器(不是Docker)。

在没有Docker的情况下,客户端运行良好。但是客户端无法从Docker连接到服务器。 如果您在主机网络模式下与服务器在同一台计算机上运行客户端容器,并连接到地址0.0.0.0,则该连接将起作用。但这仅在一切都在同一实例上时才有效,而我需要另一个解决方案。 我尝试了一些暴露端口的操作,但没有帮助。

服务器代码:

const http = require("http");
const express = require("express");
const socketIO = require("socket.io");
const app = express();
const server = http.Server(app);
const io = socketIO(server);
io.on("connection", function(socket) {
    console.log("Wow! Client socket connected!");
});
server.listen(8081, "0.0.0.0", function() {
    console.log("Starting server on port 8081");
});

应在Docker中运行的客户端代码:

let serverAddress = "address-of-the-server:8081";
const socketIOClient = require("socket.io-client");
const socket = socketIOClient(serverAddress);

我在做什么错,为什么客户端无法连接到服务器?集装箱需要任何特殊的端口吗?

2 个答案:

答案 0 :(得分:0)

我猜是问题address-of-the-server。可以肯定的是,像这样启动容器:

docker run ... --network=host <image_name>

并使用localhost代替address-of-the-server

答案 1 :(得分:0)

到现在你一定已经弄清楚了,但是对于落在这里的其他人……我面临着同样的问题,尽管我两边都有羽毛(羽毛-vuex)。像您的设置一样,客户端和服务器端位于单独的docker中,只要我在运行docker的同一系统上运行浏览器,并且浏览器指向localhost,它们就可以正常对话。但是我无法从其他系统浏览。我最长的时间在墙上敲了一下头,试图弄清楚如何在运行时从主机向浏览器中的主机到客户端获取环境变量或其他东西,而我在网上找不到的东西就到达那里了。最终,我意识到,用户在浏览器的地址栏中输入了主机系统IP地址!我可以从location.href中提取它!就我而言,我们将按IP地址访问,但是我想如果您使用URL,类似的方法也可以使用。希望这对某人有帮助。