Docker容器内WS端口映射异常的实现

 更新时间:2026年04月29日 09:24:52   作者:新标签页  
本文介绍了在Docker容器内部署WebSocket服务时遇到的问题及解决方法,通过更改代码获取容器内部真实IP,解决了端口映射失败导致的连接不通问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在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镜像。启动容器,测试连接正常。

到此这篇关于Docker容器内WS端口映射异常的文章就介绍到这了,更多相关Docker WS端口映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker NFS volume创建与使用方式

    Docker NFS volume创建与使用方式

    这篇文章主要介绍了Docker NFS volume创建与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 详解使用Dockerfile创建带Apache服务的CentOS Docker镜像

    详解使用Dockerfile创建带Apache服务的CentOS Docker镜像

    本篇文章主要介绍了使用Dockerfile创建带Apache服务的CentOS Docker镜像,具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • 详解docker pull 下来的镜像文件存放的位置

    详解docker pull 下来的镜像文件存放的位置

    本篇文章主要介绍了详解docker pull 下来的镜像文件存放的位置,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • Docker拉取部署OpenJDK的完整指南

    Docker拉取部署OpenJDK的完整指南

    OpenJDK 作为 Java SE 的开源实现,是企业级 Java 应用的核心运行环境,而 Docker 的容器化部署能有效解决环境一致性、资源隔离等问题,本文将详细介绍 Docker 环境搭建、OpenJDK 拉取部署步骤,需要的朋友可以参考下
    2026-01-01
  • docker端口映射及外部无法访问问题

    docker端口映射及外部无法访问问题

    这篇文章主要介绍了docker端口映射及外部无法访问问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Docker部署Nginx 及Nginx的基本使用最佳实践

    Docker部署Nginx 及Nginx的基本使用最佳实践

    Nginx是一个高性能的HTTP和反向代理服务器,广泛应用于Web服务、负载均衡和静态资源托管等领域,这篇文章主要介绍了Docker部署Nginx 以及Nginx的基本使用,需要的朋友可以参考下
    2025-04-04
  • Docker安装mysql教程以及解决mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘问题

    Docker安装mysql教程以及解决mysqld: Can‘t read dir&nbs

    本文详细介绍了如何通过Docker来安装和配置MySQL数据库,包括拉取MySQL镜像、启动MySQL容器、配置MySQL、解决常见错误等步骤,提供了详尽的命令和参数说明,帮助用户顺利完成MySQL的安装和配置,文中还提到了如何处理MySQL容器启动时遇到的“无法读取目录”
    2024-10-10
  • Mac系统上用Docker搭建lamp环境

    Mac系统上用Docker搭建lamp环境

    这篇文章主要给大家介绍了Mac系统上用Docker如何搭建lamp环境,文章给大家介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Docker本地目录挂载的实现步骤

    Docker本地目录挂载的实现步骤

    本文主要介绍了Docker本地目录挂载的实现步骤
    2024-02-02
  • Docker部署nginx并修改配置文件的实现方法

    Docker部署nginx并修改配置文件的实现方法

    这篇文章主要介绍了Docker部署nginx并修改配置文件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论