首页 > 解决方案 > Docker Compose - Redis 容器拒绝连接到 Node 容器

问题描述

无论我尝试什么,我似乎都无法让我的节点应用程序连接到同一 docker-compose yml 配置中容器之间的 redis。我见过很多类似的问题,但似乎没有一个答案有效。

我在这两种情况下都使用官方图片,而不是自己构建

我将“redis”作为我的主机并将其设置为我的 docker compose YML 配置中的主机名

const client = redis.createClient({ host: "redis" });

在我redis.conf使用bind 0.0.0.0

这是控制台打印出来的:

 Redis connection to redis:6379 failed - getaddrinfo ENOTFOUND redis redis:6379

 Error: connect ECONNREFUSED 127.0.0.1:6379
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
port: 6379 
}

这是我的 docker-compose.yml

version: '3'
services:
  server:
    image: "node:10-alpine"
    working_dir: /usr/src/app
    user: "node"
    command: "npm start"
    volumes:
      - .:/usr/src/app
    ports:
      - '3000:3000'
      - '3001:3001'
      - '9229:9229' # Node debugging port
    environment:
      - IS_DOCKER=1
      - NODE_ENV=DEVELOPMENT
    depends_on:
      - db

  db:
    image: "redis:5.0-alpine"
    expose:
      - '6379'
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf
      - redis-data:/data
    command:
      - redis-server
      - /usr/local/etc/redis/redis.conf
    hostname: redis

volumes:
  redis-data:

更新

这是我redis.conf的,不多。

bind 0.0.0.0
appendonly yes
appendfilename "my_app.aof"
appendfsync always

更新 2

我注意到并尝试过的事情

通过尝试这个,我确实让我更近了一步:

server:
   network_mode: host
redis:
   network_mode: service:host

我在 Mac 上,为了让主机模式正常工作,您需要这样做。在我的服务器成功连接到 redis 容器的意义上,它确实有效。但是,localhost:3000即使我正在转发端口,点击也不起作用

标签: node.jsdockerredisdocker-compose

解决方案


version: '3'
services:
  server:
    image: "node:10-alpine"
    #network_mode: bridge
    #links is necessary if you use network_mode: bridge
    #links: [redis]
    networks:
      - default
    working_dir: /usr/src/app
    user: "node"
    command: "npm start"
    volumes:
      - .:/usr/src/app
    ports:
      - '3000:3000'
      - '3001:3001'
      - '9229:9229' # Node debugging port
    environment:
      - IS_DOCKER=1
      - NODE_ENV=DEVELOPMENT
    depends_on:
      - redis

  redis:
    image: "redis:5.0-alpine"
    #container_name: redis
    #network_mode: bridge
    networks:
      - default
    expose:
      - '6379'
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf
      - redis-data:/data
    command:
      - redis-server
      - /usr/local/etc/redis/redis.conf

volumes:
  redis-data:

networks:
  default:

将容器重命名为您要使用的主机名:在您的情况下是redis而不是db
要使其可以通过 docker 网络访问,您必须将它们放在与上述相同的网络上,或者使用network_mode: bridgeandlinks: [redis]代替。

试试这个来测试你的网络:
docker ps从服务器容器中获取当前容器 id 或运行名称现在你在服务器
docker exec -it id/name /bin/sh
中 有一个 shell ,应该能够通过以下方式解析redis:或者
ping redisnc -zv redis 6379


推荐阅读