Docker Compose - Redis容器拒绝连接到节点容器

wkyowqbh  于 2022-10-31  发布在  Redis
关注(0)|答案(2)|浏览(199)

无论我怎么尝试,我似乎都不能让我的节点应用程序连接到同一个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

我注意到并尝试过的事情

  • 在我的原始设置中,当我运行docker inspect时,我可以看到它们都加入了同一个网络。当我exec... /bin/bash进入redis容器时,我可以成功ping服务器容器,但当我在服务器容器中时,它无法ping redis容器。
  • network_mode: bridge-将其添加到两个容器中无效

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

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

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

9lowa7mx

9lowa7mx1#

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: bridgelinks: [redis]代替。
请尝试以下操作来测试您的网络:
docker ps从服务器容器中获取当前容器ID或运行名称
docker exec -it id/name /bin/sh
现在您在 server 中有了一个shell,应该可以通过以下方式解析 redis
ping redisnc -zv redis 6379

x759pob2

x759pob22#

对于那些仍然得到这个错误的人,我发现在新版本的redis - 4和更高版本中,你需要像这样配置客户端:

const client = createClient({
  socket: {
    host: host,
     port: process.env.REDIS_PORT,
   },
});

它解决了我的问题
那么在Docker合成文件中,您不需要指定端口

version: "3.4"
services:
  redis-server:
    image: "redis:latest"
    restart: always
  api:
    depends_on:
      - redis-server
    restart: always
    build: .
    ports:
      - "5000:5000"

相关问题