无论我怎么尝试,我似乎都不能让我的节点应用程序连接到同一个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
也不起作用
2条答案
按热度按时间9lowa7mx1#
将容器重命名为要使用的主机名:redis在您的情况下,而不是 db。
要通过Docker网络访问它,您必须将它们放在与上面相同的网络上,或者使用
network_mode: bridge
和links: [redis]
代替。请尝试以下操作来测试您的网络:
docker ps
从服务器容器中获取当前容器ID或运行名称docker exec -it id/name /bin/sh
现在您在 server 中有了一个shell,应该可以通过以下方式解析 redis:
ping redis
或nc -zv redis 6379
x759pob22#
对于那些仍然得到这个错误的人,我发现在新版本的redis - 4和更高版本中,你需要像这样配置客户端:
它解决了我的问题
那么在Docker合成文件中,您不需要指定端口