Docker Compose - контейнер Redis, отказывающийся от соединения с контейнером Node - PullRequest
0 голосов
/ 13 февраля 2020

Независимо от того, что я пытаюсь, я не могу заставить мое приложение узла подключаться к redis между контейнерами в пределах одной docker -compose конфигурации yml. Я видел много похожих вопросов, но нет ответов, похоже, работают.

Я использую официальные изображения в обоих случаях, а не строю свои

Я ставлю "redis" в качестве моего хоста и задаю его как имя хоста в моей конфигурации docker YML

const client = redis.createClient({ host: "redis" });

в моей redis.conf Я использую bind 0.0.0.0

Это что консоль распечатывает:

 Redis connection to redis:6379 failed - getaddrinfo ENOTFOUND redis redis:6379

 Error: connect ECONNREFUSED 127.0.0.1:6379
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
port: 6379 
}

Это мой docker -compose.yml

version: '3'
services:
  server:
    image: "node:10-alpine"
    working_dir: /usr/src/app
    user: "node"
    command: "npm start"
    volumes:
      - .:/usr/src/app
    ports:
      - '3000:3000'
      - '3001:3001'
      - '9229:9229' # Node debugging port
    environment:
      - IS_DOCKER=1
      - NODE_ENV=DEVELOPMENT
    depends_on:
      - db

  db:
    image: "redis:5.0-alpine"
    expose:
      - '6379'
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf
      - redis-data:/data
    command:
      - redis-server
      - /usr/local/etc/redis/redis.conf
    hostname: redis

volumes:
  redis-data:

ОБНОВЛЕНИЕ

Вот мой redis.conf, это не так много.

bind 0.0.0.0
appendonly yes
appendfilename "my_app.aof"
appendfsync always

ОБНОВЛЕНИЕ 2

Вещи, которые я заметил и попробовал

  • в моей первоначальной настройке при запуске docker inspect Я вижу, что они оба подключены к одной сети. когда я exec ... /bin/bash в контейнер redis, я могу успешно пропинговать контейнер сервера, но когда я в контейнере сервера, он не может пропинговать контейнер redis.

  • network_mode: bridge - добавление, что к обоим контейнерам не работает

Я сделал еще один шаг к ребенку, попробовав это:

server:
   network_mode: host
redis:
   network_mode: service:host

Я нахожусь Ма c и для того, чтобы заставить работать режим хоста, вам нужно это сделать. Это работает в том смысле, что мой сервер успешно подключается к контейнеру redis. Однако нажатие localhost:3000 не работает, хотя я пересылаю порты

1 Ответ

1 голос
/ 14 февраля 2020
version: '3'
services:
  server:
    image: "node:10-alpine"
    #network_mode: bridge
    #links is necessary if you use network_mode: bridge
    #links: [redis]
    networks:
      - default
    working_dir: /usr/src/app
    user: "node"
    command: "npm start"
    volumes:
      - .:/usr/src/app
    ports:
      - '3000:3000'
      - '3001:3001'
      - '9229:9229' # Node debugging port
    environment:
      - IS_DOCKER=1
      - NODE_ENV=DEVELOPMENT
    depends_on:
      - redis

  redis:
    image: "redis:5.0-alpine"
    #container_name: redis
    #network_mode: bridge
    networks:
      - default
    expose:
      - '6379'
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf
      - redis-data:/data
    command:
      - redis-server
      - /usr/local/etc/redis/redis.conf

volumes:
  redis-data:

networks:
  default:

Переименуйте контейнер на имя хоста, которое вы хотите использовать: redis в вашем случае вместо db . Чтобы сделать его доступным по сети docker, вам нужно будет поместить их в ту же сеть, как указано выше, или использовать вместо нее network_mode: bridge и links: [redis]. Попробуйте это проверить вашу сеть: docker ps для получения текущего идентификатора контейнера или рабочего имени из контейнера сервера docker exec -it id/name /bin/sh Теперь у вас есть оболочка внутри server и вы сможете разрешить redis через: ping redis или nc -zv redis 6379

...