我正在使用此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也将起作用

09-30 17:13
查看更多