首页 文章

Docker无法从其他服务连接到redis

提问于
浏览
4

我无法弄清楚如何从我的 app 服务连接到我的 redis 服务 . 使用DDocker版本18.03.1-ce,为Mac构建9ee9f40ocker .

我尝试将我在类似问题上找到的各种方法联系起来:

const client = redis.createClient({ host: 'localhost', port: 6379});

const client = redis.createClient({ host: 'redis', port: 6379});

const client = redis.createClient('redis://redis:6379');

const client = redis.createClient('redis', 6379); // and reversed args

我总是得到某种形式:

错误:Redis连接到localhost:6379失败 - 连接ECONNREFUSED 127.0.0.1:6379错误:Redis连接到redis:6379失败 - 连接ECONNREFUSED 172.20.0.2:6379

Docker containers

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                    NAMES
0fd798d58561        app_app         "pm2-runtime start e…"   2 seconds ago        Up 7 seconds                                 app
65d148e498f7        app_redis       "docker-entrypoint.s…"   About a minute ago   Up 8 seconds        0.0.0.0:6379->6379/tcp   redis

Redis works:

$ docker exec -it redis /bin/bash
root@65d148e498f7:/data# redis-cli ping
PONG

Redis Dockerfile (非常简单)

FROM redis:4.0.9
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

app Dockerfile

FROM node:10.3.0-slim
RUN mkdir -p /app
COPY src/* /app/
CMD ["pm2-runtime", "start", "/app/ecosystem.config.js"]

docker-compose.yml

version: "3"
services:
  redis:
    build: ./redis/
    container_name: redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    expose:
      - "6379"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - 'API_PORT=6379'
      - 'NODE_ENV=production'
  app:
    depends_on:
      - redis
    build: ./app/
    container_name: app
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /app/node_modules
    environment:
      - 'NODE_ENV=production'

2 回答

  • 0

    看起来您的redis映像配置为侦听127.0.0.1而不是所有接口 . 这不是默认redis映像的问题,因此要么使用docker hub中的官方映像,要么更正配置以侦听0.0.0.0 .

    您将能够使用netshoot验证这一点:

    docker run --rm --net container:app_redis nicolaka/netshoot netstat -ltn
    

    在redis conf中,通过在redis.conf中注释掉“bind”行来监听所有接口 .

  • 3

    localhost 来自 app 容器's perspective won' t能够离开 app 容器 . 所以最好的办法是使用 redis 或主机的IP地址 .

    如果要从 app 容器中获取 redis ,则需要链接它们或将它们放入同一网络中 . 请使用相同的网络名称为这两个服务添加 network 属性 . 然后,Docker将为您提供有效的服务名称dns查找 .

    请参阅https://docs.docker.com/compose/compose-file/#networks(适用于 service: 属性)和https://docs.docker.com/compose/compose-file/#network-configuration-reference(适用于顶级 networks 属性)的官方文档 .

相关问题