节点无法通过 Docker Compose 连接到 Redis
Posted
技术标签:
【中文标题】节点无法通过 Docker Compose 连接到 Redis【英文标题】:Node can't connect to Redis via Docker Compose 【发布时间】:2018-04-28 19:26:27 【问题描述】:我正在通过 docker compose 在 Node 和 Redis 上运行 React 应用程序:
version: "3"
services:
webapp:
build: ./
ports:
- "127.0.0.1:3000:9090"
depends_on:
- redis
command:
npm run start
nginx:
build: ./nginx
ports:
- "80:80"
environment:
- NGINX_HOST=127.0.0.1
- NGINX_PORT=80
command:
service nginx start
redis:
image: redis
ports:
- "6379:6379"
volumes:
- ./data:/data
Docker 文件:
FROM node:alpine
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY . .
EXPOSE 9090
RUN npm run build_prod
Server.js:
const redisClient = RedisClient.createClient(6379,'redis');
我在运行 docker-compose up --build 时收到 Redis 连接被拒绝错误:
redis_1 | 1:M 15 Nov 13:55:19.865 * Ready to accept connections
webapp_1 |
webapp_1 | > web.globalmap.fatmap.com@0.0.1 start /usr/src/app
webapp_1 | > node ./build/server.js
webapp_1 |
webapp_1 | events.js:193
webapp_1 | throw er; // Unhandled 'error' event
webapp_1 | ^
webapp_1 |
webapp_1 | Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
webapp_1 | at Object._errnoException (util.js:1031:13)
webapp_1 | at _exceptionWithHostPort (util.js:1052:20)
webapp_1 | at TCPConnectWrap.afterConnect [as oncomplete]
我想知道如何让 docker 正确链接两个容器。
【问题讨论】:
【参考方案1】:使用process.env.
访问docker的环境变量没有发现任何问题。
我已经在 docker-compose.yml 文件中声明了变量。
version: '3.7'
services:
api:
build: .
container_name: api-framework
depends_on:
- redis
ports:
- 8080:6002
networks:
- fronted
- backend
environment:
redis_server_addr: redis
redis:
container_name: my-redis
image: "redis:5"
ports:
- 6379
networks:
- backend
那么,配置文件有下面一行。
redis_host: process.env.redis_server_addr
它对我有用。
【讨论】:
【参考方案2】:这解决了我的节点无法使用 docker-compose.yml 连接到 redis 的问题
const redis_client = redis.createClient(host: 'redis');
然后在我的 docker-compose.yml 文件中,我有以下内容
version: '3'
services:
redis:
image: redis
socket:
container_name: socket
build:
context: .
dockerfile: Dockerfile
depends_on:
- redis
links:
- redis
来源:https://github.com/docker-library/redis/issues/45
【讨论】:
【参考方案3】:看起来redis
没有解析到正确的 IP 地址。
在创建客户端时尝试使用 redis URI。
// [redis:]//[[user][:password@]][host][:port][/db-number][?db=db-number[&password=bar[&option=value]]]
const redisClient = RedisClient.createClient('redis://redis:6379');
如果合适,请提供用户名、密码和数据库编号。
【讨论】:
以上是关于节点无法通过 Docker Compose 连接到 Redis的主要内容,如果未能解决你的问题,请参考以下文章
Traefik无法通过docker-compose连接到服务器。
Zuul 网关无法连接到 Docker-Compose 下的 Eureka 服务注册表
Docker-Compose 无法连接到 Docker 守护进程