使用Docker连接Redis服务器时出现getaddrinfo ENOTFOUND错误
问题排查:Docker容器无法连接Redis服务器(DNS解析失败)
错误信息
[ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND redis-stack-server talawa-api-dev-1 | [0] at __node_internal_captureLargerStackTrace (node:internal/errors:563:5) talawa-api-dev-1 | [0] at __node_internal_ (node:internal/errors:782:10) talawa-api-dev-1 | [0] at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) talawa-api-dev-1 | [0] at GetAddrInfoReqWrap.callbackTrampoline (node:internal/async_hooks:130:17)
环境:Windows WLS Ubuntu发行版,docker ps显示redis-stack-server容器正常运行,但talawa-api-dev容器无法连接Redis。
用户配置文件
.env 文件
NODE_ENV=development SERVER_PORT=4000 REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD=
docker-compose.dev.yaml 文件
version: "3.8" services: mongodb: image: mongo:latest ports: - 27017:27017 volumes: - mongodb-data:/data/db networks: - talawa-network redis-stack-server: image: redis/redis-stack-server:latest ports: - 6379:6379 volumes: - redis-data:/data/redis networks: - talawa-network minio: image: minio/minio ports: - "9000:9000" - "9001:9001" environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} command: server /data --console-address ":9001" volumes: - minio-data:/data networks: - talawa-network talawa-api-dev: build: context: . dockerfile: Dockerfile.dev volumes: - .:/usr/src/app - /usr/src/app/node_modules depends_on: - mongodb - redis-stack-server - minio environment: - MONGO_DB_URL=mongodb://mongodb:27017 - REDIS_HOST=redis-stack-server - REDIS_PORT=6379 caddy: image: caddy/caddy:2.2.1-alpine container_name: caddy-service restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - ./site:/srv - caddy_data:/data - caddy_config:/config volumes: mongodb-data: redis-data: caddy_data: caddy_config: minio-data: networks: talawa-network: driver: bridge
错误原因分析
- 网络隔离问题:
talawa-api-dev服务未显式加入talawa-network自定义网络,默认会使用Docker默认网络;而redis-stack-server在talawa-network中,两个容器处于不同网络,无法通过服务名(redis-stack-server)进行DNS解析。 - 环境变量优先级冲突:
.env文件中REDIS_HOST=localhost,如果应用优先读取本地.env而非容器内环境变量,容器内的localhost指向自身,而非Redis容器,导致连接失败。
解决办法
1. 统一容器网络
修改docker-compose.dev.yaml,给talawa-api-dev和caddy服务添加networks配置,确保所有需要通信的服务处于同一自定义网络:
talawa-api-dev: # 原有配置不变 networks: - talawa-network caddy: # 原有配置不变 networks: - talawa-network
2. 确保环境变量正确生效
- 若应用在容器内优先读取容器环境变量:当前
docker-compose中已设置REDIS_HOST=redis-stack-server,无需修改.env,但需确认应用代码优先读取容器环境变量而非本地.env(部分框架会优先加载容器环境变量覆盖本地文件)。 - 若应用强制读取本地
.env:修改.env中的REDIS_HOST为redis-stack-server,但注意本地直接运行应用时需改回localhost,建议优先使用容器环境变量覆盖的方式。
3. 验证连通性
修改配置后重启容器:
docker-compose -f docker-compose.dev.yaml down docker-compose -f docker-compose.dev.yaml up -d
进入talawa-api-dev容器验证DNS解析:
docker exec -it talawa-api-dev-1 ping redis-stack-server
若能正常ping通,说明网络配置生效,Redis连接问题即可解决。
内容的提问来源于stack exchange,提问作者Anushree Sharma
相关产品推荐
相关产品推荐

