我正在使用此docker-compose配置来运行经典的nodejs应用+ mysql + redis:
version: '3'
services:
app:
container_name: app
restart: always
build:
context: ./app/
depends_on:
- db
- redis
- elasticsearch
links:
- db
- redis
- elasticsearch
ports:
- "127.0.0.1:${APP_PORT}:${APP_PORT}"
environment:
- "PORT=${APP_PORT}"
- "MYSQL_PORT=${MYSQL_PORT}"
- "REDIS_PORT=${REDIS_PORT}"
redis:
container_name: redis
image: "redis:3-alpine"
restart: always
ports:
- "127.0.0.1:${REDIS_PORT}:6379"
db:
container_name: db
image: mariadb:10.0.30
restart: always
volumes:
- "${MYSQL_DATA_LOCATION}/data:/var/lib/mysql:delegated"
- "${MYSQL_DATA_LOCATION}/my.cnf:/etc/mysql/my.cnf:ro"
ports:
- "127.0.0.1:${MYSQL_PORT}:3306"
environment:
- "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
- "MYSQL_USER=${MYSQL_USER}"
- "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
- "MYSQL_DATABASE=${MYSQL_DATABASE}"
我还使用了一个.env文件,其中包含以下值:
APP_PORT=5000
MYSQL_PORT=3306
REDIS_PORT=6379
然后我用
docker-compose up -d
这样一切都很好。我可以无错误地更改mysql端口,但是如果我将redis端口更改为原始端口以外的其他端口,则在使用此配置时,应用中会出现以下错误:
redis.createClient({host: 'redis', port: process.env.REDIS_PORT });
我收到以下消息:
Error: Redis connection to redis:5555 failed - connect ECONNREFUSED 172.18.0.3:5555
而数据库和应用程序之间的连接正常工作:
在docker ps中,我可以看到机器以预期的配置启动:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c594c6d98b8 nginx:mainline-alpine "nginx -g 'daemon of…" 33 seconds ago Up 39 seconds 0.0.0.0:2000->80/tcp webproxy
62d1f917d7ff app "npm run docker-debug" 36 seconds ago Up 42 seconds 127.0.0.1:5000->5000/tcp, 127.0.0.1:9222->9222/tcp app
7c982d543a7d mariadb:10.0.30 "docker-entrypoint.s…" 39 seconds ago Up 45 seconds 127.0.0.1:4000->3306/tcp db
9dd13967b37d redis:3 "docker-entrypoint.s…" 39 seconds ago Up 44 seconds 127.0.0.1:5555->6379/tcp redis
我在这里可以看到db是从4000映射到3306的,这是可行的,但是redis从5555映射到6379的映射被忽略了。如果我将应用程序连接中的端口手动更改为端口6379,它确实可以工作...
我的配置中缺少什么吗?
最佳答案
Redis在端口6379期间的容器内运行(如果未在其配置中更改端口)。在您的主机上,您将端口5555映射到redis容器6379。docker-compose中的所有服务都是彼此可见的,甚至不需要暴露这些端口即可托管。在您的应用程序设置中,如果您通过redis://redis:6379
访问redis将起作用,或者使用公开的端口redis://HOST_IP:5555
也将起作用