【问题标题】:Node can't connect to Redis via Docker Compose节点无法通过 Docker Compose 连接到 Redis
【发布时间】: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 正确链接两个容器。

【问题讨论】:

    标签: node.js reactjs amazon-web-services redis docker-compose


    【解决方案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');
        

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

        【讨论】:

          猜你喜欢
          • 2020-06-03
          • 2020-01-06
          • 2022-01-03
          • 2019-12-10
          • 1970-01-01
          • 2021-01-03
          • 1970-01-01
          • 2018-11-28
          • 1970-01-01
          相关资源
          最近更新 更多