为什么docker-compose不按预期使用端口绑定?

时间:2018-02-09 16:11:59

标签: docker redis docker-compose

我使用这个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,它确实有效......

我的配置中是否缺少某些内容?

1 个答案:

答案 0 :(得分:0)

redis在端口6379期间在容器内运行(如果你没有更改其配置中的端口)。在您的主机上,您将端口5555映射到redis容器6379. docker-compose中的所有服务彼此可见,您甚至不需要将这些端口EXPOSE到主机。在您的应用设置中,如果您通过redis://redis:6379访问redis工作或使用公开端口redis://HOST_IP:5555也可以使用