d-_*_*_-b 5 redis node.js docker
我不知道如何redis从app服务连接到服务。使用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
Run Code Online (Sandbox Code Playgroud)
我总是得到某种形式的:
错误: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
Run Code Online (Sandbox Code Playgroud)
Redis的作品:
$ docker exec -it redis /bin/bash
root@65d148e498f7:/data# redis-cli ping
PONG
Run Code Online (Sandbox Code Playgroud)
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"]
Run Code Online (Sandbox Code Playgroud)
应用Dockerfile
FROM node:10.3.0-slim
RUN mkdir -p /app
COPY src/* /app/
CMD ["pm2-runtime", "start", "/app/ecosystem.config.js"]
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
Had*_*Mir 11
让我用简单的语言解释一下。当您运行时,docker-compose up它会在单独的容器中运行 redis 和应用程序。现在您的应用程序需要连接/访问 redis 容器(请记住,redis 不在您的计算机本地主机上,它位于容器内并在默认端口上运行6379)。默认情况下,Docker 会将应用程序容器和 redis 容器保留在同一网络中,您可以通过容器的服务名称(在您的例子中是 redis 和应用程序)访问容器,因此为了从应用程序容器访问 redis,您只需使用默认值端口6379和主机将是服务名称(在您的例子中为“redis”)。
对于在容器中运行的节点应用程序,可以通过以下方式访问 Redis(也在容器中运行)
const redis = require("redis");
const client = redis.createClient(6379, "service-name-for-redis-container");Run Code Online (Sandbox Code Playgroud)
看起来您的 redis 映像已配置为侦听 127.0.0.1 而不是所有接口。这不是默认 redis 映像的问题,因此要么使用来自 docker hub 的官方映像,要么更正您的配置以侦听 0.0.0.0。
您将能够使用 netshoot 验证这一点:
docker run --rm --net container:app_redis nicolaka/netshoot netstat -ltn
Run Code Online (Sandbox Code Playgroud)
在 redis conf 中,通过注释掉 redis.conf 中的“bind”行来监听所有接口。
我解决了这个问题,将 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
| 归档时间: |
|
| 查看次数: |
4313 次 |
| 最近记录: |