我使用这个docker-compose配置来运行经典的nodejs app + 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
db和app之间的连接正常工作:s
在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
我在这里可以看到数据库从4000映射到3306,这有效,但是从5555到6379的redis映射被忽略。如果我手动将应用程序连接中的端口更改为端口6379,它确实有效......
我的配置中是否缺少某些内容?
答案 0 :(得分:0)
redis在端口6379期间在容器内运行(如果你没有更改其配置中的端口)。在您的主机上,您将端口5555映射到redis容器6379. docker-compose中的所有服务彼此可见,您甚至不需要将这些端口EXPOSE到主机。在您的应用设置中,如果您通过redis://redis:6379
访问redis工作或使用公开端口redis://HOST_IP:5555
也可以使用