You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows环境下Docker部署Django与本地React应用建立WebSocket连接时遭遇socket.gaierror错误求助

解决Windows下Docker中Django 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:27:48