DockerWebSocket开发
先来看最简单的单服务部署。假设我们用Node.js写了个WebSocket服务,监听8080端口。Dockerfile可以这样写:
构建镜像的命令没啥特别的:
但启动容器时要注意端口映射,很多人在这里栽跟头:
这里有个坑,如果只映射8080端口,有时候客户端会连不上。因为WebSocket在建立连接时先走HTTP协议,完成握手后才升级到WebSocket。有些负载均衡器或者代理服务器会把这个过程搞乱。解决办法是在服务端正确处理协议升级,同时确保Docker容器暴露正确的端口。
说到生产环境,单容器肯定不够用。得用Docker Compose来编排多个服务。下面是个实战用的docker-compose.yml:
这个配置有几个关键点:一是设置了restart策略,容器崩溃时自动重启;二是用Redis做消息持久化,避免服务重启丢数据;三是通过depends_on确保启动顺序。
在实际部署时,还遇到过连接数暴涨导致容器内存溢出的问题。后来发现是没配置资源限制,加上这几行就稳了:
内存限制一定要设,不然容器能把宿主机都搞崩。CPU限制倒是可以灵活点,根据实际负载调整。
还有个坑是WebSocket连接经常超时断开。排查发现是Nginx代理的默认配置有问题。正确的Nginx配置应该是这样的:
关键在proxy_read_timeout和proxy_send_timeout,默认值太短,WebSocket长连接撑不了多久就会断。
监控也是个大事。用这个命令可以实时查看容器状态:
如果要更详细的监控,可以在容器里装个轻量级探针,把指标推送到监控系统。
最后说说日志处理。Docker默认的日志驱动是json-file,时间长了很占磁盘。建议换成日志收集系统,比如这样配置:
这样可以限制单个日志文件大小,避免磁盘爆满。
折腾完这一套,WebSocket服务在Docker里跑得稳稳的。关键是要理解WebSocket的特殊性,正确处理协议升级、超时设置和资源限制。容器化确实能省很多事,但该踩的坑一个都不会少。建议大家先在测试环境充分验证,别直接上生产。
更多推荐
所有评论(0)