WSL2下Docker Compose因IP动态变化导致服务间无法访问问题
解决方案
1. 最简方案:直接使用服务名作为访问地址
Docker Compose 会自动为同一个项目下的所有服务创建专用的默认桥接网络,内置DNS服务会自动把服务名解析为对应容器的动态IP,你完全不需要手动获取、配置Redis的IP地址。
你直接修改customscript.js里的Redis连接地址,把主机地址填redis-service即可,端口还是默认的6379,示例连接写法:
// 示例Redis连接配置 const redis = require('redis') const client = redis.createClient({ host: 'redis-service', // 直接填compose里的Redis服务名 port: 6379 })
这个方案不需要修改任何compose配置,也不需要自定义网络、host模式之类的额外操作。
2. 你之前遇到的报错原因及修复方法
自定义网络报错的修复
service "redis-service" refers to undefined network "network-name": invalid compose project 报错是因为你只在服务配置里引用了网络,没有在compose文件根级声明该网络,正确配置示例:
version: '3.7' # 根级声明自定义网络 networks: network-name: driver: bridge services: redis-service: image: redis container_name: redis-cont ports: - "6379" # 关联自定义网络 networks: - network-name serviceA: depends_on: - redis-service container_name: serviceA-cont build: context: ./app dockerfile: Dockerfile command: scripts/customscript.js ports: - "8080:8080" stdin_open: true # 关联自定义网络 networks: - network-name
配置后同一个自定义网络下的服务依然可以通过服务名互相访问,和默认网络逻辑一致。
host模式报错的修复
network mode "network-name" not supported by buildkit 报错是因为你把network_mode的值填成了自定义网络名,正确的host模式配置应该是network_mode: "host",不过WSL2环境下并不推荐用host模式,会破坏容器的网络隔离性,远不如直接用服务名解析方便。
内容的提问来源于stack exchange,提问作者sotn
相关产品推荐
相关产品推荐

