Windows环境下Docker部署Django与本地React应用建立WebSocket连接时遭遇socket.gaierror错误求助
这个socket.gaierror我之前在Windows Docker环境下玩Channels的时候也踩过坑!核心原因是Windows和Linux的Docker网络模型不一样,导致你的Django容器没法正确找到Channel Layer依赖的Redis服务。咱们一步步来搞定:
问题根源
在Linux上,Docker容器里的localhost直接映射到宿主机的回环地址,所以你用localhost连接Redis完全没问题;但Windows的Docker是跑在Hyper-V虚拟机里的,容器内的localhost指的是容器自己,不是你的Windows主机,这就导致Redis地址解析失败,触发了Name or service not known错误。
具体修复步骤
1. 修正CHANNEL_LAYERS的Redis地址
打开你的Django项目settings.py,找到CHANNEL_LAYERS配置,把Redis的主机从localhost换成host.docker.internal——这是Docker for Windows专门提供的域名,用来让容器访问宿主机上的服务:
CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { # 把localhost替换成host.docker.internal "hosts": [("host.docker.internal", 6379)], # 如果Redis设了密码,加上这行: # "password": "你的Redis密码", }, }, }
2. 检查Redis的可访问性
- 确保你Windows本地的Redis服务已经启动,端口
6379没有被系统防火墙挡住; - 可以在Windows命令行里用
redis-cli ping测试Redis是否正常响应。
3. 修复Consumers里的API错误
你的consumers.py里断开连接的方法用错了Channels API:group_discard是不存在的,应该改成group_remove,不然断开连接时会有隐藏问题:
def disconnect(self, close_code): # Leave room group async_to_sync(self.channel_layer.group_remove)( self.room_group_name, self.channel_name )
4. 修正React端的WebSocket地址
你的React代码里的WebSocket地址拼接有语法错误,直接改成明确的地址就行:
// 直接写死开发环境地址,生产环境再动态调整 const chatSocket = new WebSocket('ws://localhost:8000/ws/room/');
验证方法
修改完配置后,重启你的Django Docker容器,然后在React端发起WebSocket连接,应该就能正常收发消息了。如果还是有问题,检查Docker的端口映射是否正确(确保容器的8000端口映射到了宿主机的8000)。
内容的提问来源于stack exchange,提问作者Emad

