我正在尝试使用docker-compose
将我的整个开发人员工作流程容器化。我面临的问题是redis
contianer。我的worker容器无法连接到redis。我尝试了与stackoverflow不同的解决方案,比如:
Setting up node with redis using docker-compose
Access redis locally on docker - docker compose
nodejs, redis, npm and docker-compose setup
Docker-compose , anyway to specify a redis.conf file?
How to connect to a Redis container using Docker Compose?
还有许多来自github的其他人,他们尝试了不同的例子,但没有成功。
这是我的docker-compose文件:
version: "3.6"
services:
redis_db:
# image: bitnami/redis:latest # tried different image also
image: redis
container_name: rme_redis
network_mode: host # tried networks also
# command: ['redis-server', '/redis.conf']
# volumes:
# - ./docker/redis.conf:/redis.conf
# hostname: redis_db
# networks:
# - rme
# environment:
# - ALLOW_EMPTY_PASSWORD=yes
# - REDIS_PASSWORD="redis"
ports:
- 6379:6379
# networks:
# node_net:
# ipv4_address: 172.28.1.4
worker:
build: worker
image: worker
container_name: rme_worker
command: node worker.js
# networks:
# - rme
# network_mode: host
environment:
- REDIS_URL="redis://redis_db:6379" # localhost when netowk_mode is host
volumes:
- ./worker:/app
# links:
# - redis_db
depends_on:
- redis_db
我得到的错误是:
Error: Redis connection to "redis://redis_db:6379" failed - connect ENOENT "redis://redis_db:6379"
at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1141:16) {
errno: -2,
code: 'ENOENT',
syscall: 'connect',
address: '"redis://redis_db:6379"'
}
操作系统: macOS
Docker: Docker Desktop
编辑:找到了在js代码中使用主机和端口的解决方案
const redisClient = redis.createClient({
host: process.env.REDIS_HOST,
port: parseInt(process.env.REDIS_PORT)
})
# docker-compose.yml
version: "3.6"
services:
redis_db:
image: redis
# only needed to directly access Redis from host
ports:
- 6379:6379
worker:
build: worker
environment:
- REDIS_HOST=redis_db
- REDIS_PORT=6379
depends_on:
- redis_db
如果你找到了使用redis连接字符串的解决方案,请分享。
谢谢你的帮忙
发布于 2020-06-05 02:42:59
设置network_mode: host
会关闭特定容器的Docker网络。只有在一些不寻常的情况下,容器不会侦听固定的端口号,或者您试图使用容器来管理主机的网络设置时,才需要这样做。
在您的示例中,由于Redis数据库正在禁用Docker网络,因此应用程序容器无法通过名称访问它。删除所有的network_mode: host
选项应该可以解决这个问题。
Networking in Compose描述了整个网络设置。值得注意的是,Compose将为您创建一个default
网络,并且容器将可以使用它们的Compose服务名进行访问。通常,您不应该需要指定自定义networks:
选项、显式提供container_name:
、设置hostname:
、提供古老的links:
或设置network_mode:
。
您应该能够成功地将显示的docker-compose.yml
文件裁剪为:
version: "3.6"
services:
redis_db:
image: redis
# only needed to directly access Redis from host
ports:
- 6379:6379
worker:
build: worker
environment:
- REDIS_URL="redis://redis_db:6379"
# `docker-compose up worker` also starts Redis
# Not strictly needed for networking
depends_on:
- redis_db
https://stackoverflow.com/questions/62201716
复制相似问题