node.js - Docker Compose - Redis 容器拒绝连接到 Node 容器
问题描述
无论我尝试什么,我似乎都无法让我的节点应用程序连接到同一 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
即使我正在转发端口,点击也不起作用
解决方案
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: bridge
andlinks: [redis]
代替。
试试这个来测试你的网络:
docker ps
从服务器容器中获取当前容器 id 或运行名称现在你在服务器
docker exec -it id/name /bin/sh
中
有一个 shell ,应该能够通过以下方式解析redis:或者
ping redis
nc -zv redis 6379
推荐阅读
- vhdl - VHDL整数在递增或递减时到处计数
- c++ - 如何为我的代码包含负值?数制转换
- node.js - 为什么我在部署 firebase 函数时会出错?
- javascript - 单击按钮删除整个 tr
- git - `git add` 有一个 git 钩子吗?
- google-apps-script - 如何使谷歌表格查询按顺序返回值
- java - 使用自动完成时 Eclipse 崩溃 - Java 错误日志为 EXCEPTION_ACCESS_VIOLATION
- mysql - Error when creating a table in MySql: check the manual that corresponds to your MySQL server version for the right syntax to use near ')'
- php - 选择输入选择后在数据库中显示数据
- sql - 二进制列等于 0 时重置 SQL 计数