在Docker容器内部署Websocket服务时出现了端口映射失败,链接WS时始终访问不通的情况。
代码如下
var server = new WebSocketServer("ws://127.0.0.1:8888");
server.Start(socket =>
{
socket.OnOpen = () => //当建立Socket链接时执行此方法
{
};
socket.OnClose = () =>// 当关闭Socket链接十执行此方法
{
};
socket.OnMessage = message =>// 接收客户端发送过来的信息
{
};
});
}
将程序打包进入Docker容器后,配置DockerCompose
version: '3.4'
services:
tdssserver:
image: test
restart: always
container_name: test
ports:
- 8988:8888
environment:
TZ: Asia/Shanghai
volumes:
- ./appsettings.json:/app/appsettings.json
正常情况下应该可以通过WS正常连接到服务上,但是当服务在Docker内正常运行的时候,使用测试工具进行测试连接发现一直连不通。
.
.
.
.
一开始分析以为是WS协议与Http协议不是同族协议,认为需要单独开启Docker的Ws协议支持。但是后来查阅资料发现实际上WS和HTTP都是基于TCP的,所以立马改变排查方向。
最后分析认为可能是使用的127.0.0.1这类的LocalHost地址,导致在配置Docker映射的时候没法正确映射。
分析之后改变原来代码
string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
localIP = endPoint.Address.ToString();
}
FleckLog.Level = Fleck.LogLevel.Debug;
var ws = "ws://" + localIP + ":" + planws;
var server = new WebSocketServer(ws);
server.Start(socket =>
{
socket.OnOpen = () => //当建立Socket链接时执行此方法
{
};
socket.OnClose = () =>// 当关闭Socket链接十执行此方法
{
};
socket.OnMessage = message =>// 接收客户端发送过来的信息
{
};
});
思路是通过
string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
localIP = endPoint.Address.ToString();
}
FleckLog.Level = Fleck.LogLevel.Debug;
var ws = "ws://" + localIP + ":" + planws;
var server = new WebSocketServer(ws);
拿到Localip,最后用容器内部的LocalIp创建对应的WS连接。
改变代码后生成新的Docker镜像。启动容器,测试连接正常。