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

bf1o4zei  于 2023-06-21  发布在  Redis
关注(0)|答案(6)|浏览(111)

我不知道如何从我的app服务连接到我的redis服务。使用DDocker版本18.03.1-ce,构建9 ee 9 f40 ocker for Mac。
我试着把我在类似问题上发现的各种方法联系起来:

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容器

$ 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工作原理:

$ 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'
30byixjq

30byixjq1#

看起来你的redis镜像配置为监听127.0.0.1而不是所有接口。这不是默认redis镜像的问题,所以要么使用来自docker hub的官方镜像,要么纠正你的配置以监听0.0.0.0。
你可以通过netshoot来验证这一点:

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

在redisconf中,监听所有接口是通过注解掉redis.conf中的“bind”行来完成的。

avkwfej4

avkwfej42#

让我用简单的语言解释一下。当你运行docker-compose up时,它会在不同的容器中运行redis和app。现在你的应用需要连接/访问redis容器(记住redis不在你的机器本地主机上,它在一个容器内,并在默认端口6379上运行)。默认情况下,Docker会将app container和redis container保存在同一个网络中,你可以通过服务名访问容器(在你的例子中是redis和app),所以为了从app container访问redis,你只需要使用默认端口6379,host将是服务名(在你的例子中是“redis”)。
对于在容器中运行的节点应用程序,通过以下方式访问Redis(也在容器中运行):

const redis = require("redis");
const client = redis.createClient(6379, "service-name-for-redis-container");
vwkv1x7d

vwkv1x7d3#

我解决了这个问题,将redis主机从'localhost'改为'redis',例如:
REDIS_HOST=redis
REDIS_PORT=6379
修改后,我的docker服务开始与redis通信。
论坛原创回答:https://forums.docker.com/t/connecting-redis-from-my-network-in-docker-net-core-application/92405

57hvy0tb

57hvy0tb4#

在我的例子中,问题是我在redis上绑定了一个不同的端口:

redis:
    image: redis
    ports:
        - 49155:6379

我试图连接到端口49155,但我需要通过端口6379连接,因为连接是从另一个服务。

hfyxw5xn

hfyxw5xn5#

app容器的Angular 来看,localhost将无法离开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属性)。

xuo3flqw

xuo3flqw6#

尝试打开Docker日志。我在自己的Redis docker日志中发现了这个错误:

2023-06-15 04:44:14 1:M 14 Jun 2023 21:44:14.768 # Possible SECURITY ATTACK detected. It looks like somebody is sending POST or Host: commands to Redis. This is likely due to an attacker attempting to use Cross Protocol Scripting to compromise your Redis instance. Connection aborted.

相关问题