节点无法通过 Docker Compose 连接到 Redis

Posted

技术标签:

【中文标题】节点无法通过 Docker Compose 连接到 Redis【英文标题】:Node can't connect to Redis via Docker Compose 【发布时间】:2018-04-28 19:26:27 【问题描述】:

我正在通过 docker compose 在 Node 和 Redis 上运行 React 应用程序:

version: "3"
services:
  webapp:
    build: ./
    ports:
      - "127.0.0.1:3000:9090"
    depends_on:
      - redis
    command:
      npm run start

  nginx:
    build: ./nginx
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=127.0.0.1
      - NGINX_PORT=80
    command:
      service nginx start

  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data

Docker 文件:

FROM node:alpine

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install
COPY . .

EXPOSE 9090
RUN npm run build_prod

Server.js:

const redisClient = RedisClient.createClient(6379,'redis');

我在运行 docker-compose up --build 时收到 Redis 连接被拒绝错误:

redis_1   | 1:M 15 Nov 13:55:19.865 * Ready to accept connections
webapp_1  |
webapp_1  | > web.globalmap.fatmap.com@0.0.1 start /usr/src/app
webapp_1  | > node ./build/server.js
webapp_1  |
webapp_1  | events.js:193
webapp_1  |       throw er; // Unhandled 'error' event
webapp_1  |       ^
webapp_1  |
webapp_1  | Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
webapp_1  |     at Object._errnoException (util.js:1031:13)
webapp_1  |     at _exceptionWithHostPort (util.js:1052:20)
webapp_1  |     at TCPConnectWrap.afterConnect [as oncomplete]

我想知道如何让 docker 正确链接两个容器。

【问题讨论】:

【参考方案1】:

使用process.env.访问docker的环境变量没有发现任何问题。

我已经在 docker-compose.yml 文件中声明了变量。

version: '3.7'

services:
  api:
    build: .
    container_name: api-framework
    depends_on:
        - redis
    ports:
      - 8080:6002
    networks:
      - fronted
      - backend
    environment:
      redis_server_addr: redis
  redis:
    container_name: my-redis
    image: "redis:5"
    ports:
      - 6379
    networks:
      - backend

那么,配置文件有下面一行。

redis_host: process.env.redis_server_addr

它对我有用。

【讨论】:

【参考方案2】:

这解决了我的节点无法使用 docker-compose.yml 连接到 redis 的问题

const redis_client = redis.createClient(host: 'redis');

然后在我的 docker-compose.yml 文件中,我有以下内容

version: '3'

services:
  redis:
    image: redis
  socket:
    container_name: socket
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - redis
    links:
      - redis

来源:https://github.com/docker-library/redis/issues/45

【讨论】:

【参考方案3】:

看起来redis 没有解析到正确的 IP 地址。

在创建客户端时尝试使用 redis URI。

// [redis:]//[[user][:password@]][host][:port][/db-number][?db=db-number[&password=bar[&option=value]]]
const redisClient = RedisClient.createClient('redis://redis:6379');

如果合适,请提供用户名、密码和数据库编号。

【讨论】:

以上是关于节点无法通过 Docker Compose 连接到 Redis的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker-compose 连接到 docker

Traefik无法通过docker-compose连接到服务器。

Zuul 网关无法连接到 Docker-Compose 下的 Eureka 服务注册表

Docker-Compose 无法连接到 Docker 守护进程

通过 Spring Boot 应用程序连接到 Docker Compose MongoDb

docker-compose 有两个容器:web 无法连接到 db