Docker MongoDB сразу же закрывает соединение после получения метаданных - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь составить приложение Docker из двух контейнеров:

  1. mongo
  2. app

Контейнер Mongo работает просто отлично, а приложение не можетподключиться к монго.Ни приложение node.js, ни mongostat не могут.Странно то, что я попытался запустить этот проект на обоих компьютерах с Win10, и он нормально работает на другом.

Это журналы из контейнера Монго, когда я запускаю node app.js или mongostat --uri "mongodb://mongo:27017/project" из контейнера приложения:

2019-05-22T09:33:52.225+0000 I NETWORK  [conn17] received client metadata from 192.168.96.2:42916 conn17: { driver: { name: "nodejs", version: "3.1.10" }, os: { type: "Linux", name: "linux", architecture: "x64", version: "4.9.125-linuxkit" }, platform: "Node.js v10.15.3, LE, mongodb-core: 3.1.9" }
2019-05-22T09:33:52.231+0000 I NETWORK  [conn17] end connection 192.168.96.2:42916 (0 connections now open)

Это означает, что оба контейнера могут видеть друг друга, поэтому файл .yml должен быть в порядке.Если проблема была с кодом, то он не должен работать на обоих компьютерах.

Dockerfile:

FROM node:10.15.3-alpine
RUN apk update && apk --no-cache --virtual build-dependencies add python make g++ && apk del build-dependencies
RUN mkdir -p /home/node/app && chown -R node:node /home/node/app
WORKDIR /home/node/app
COPY package*.json ./
USER node
COPY --chown=node:node . .
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]

docker-compose.yml:

version: "3.5"
services:
  app:
    container_name: app
    restart: always
    build: .
    ports:
      - "3000:3000"
    networks:
      - mongo
  mongo:
    restart: always
    container_name: mongo
    image: mongo
    expose: 
      - 27017
    volumes:
      - mongodata:/data/db
    ports:
      - '27017:27017'
    networks:
      - mongo
volumes:
  mongodata:
networks:
  mongo:
    external: true

фрагмент из app.js:

MongoClient.connect('mongodb://mongo:27017/project', {useNewUrlParser: true}, (err, client) => {
    if (err) throw err; //throws MongoNetworkError: failed to connect to server [mongo:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND mongo mongo:27017]
    console.log("connected");
    client.close();//at the moment this line is not being reached because of throw err;
});```

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Поскольку вы получаете ошибку getaddrinfo ENOTFOUND, имя хоста mongo не разрешается.Обычно это происходит по одной из двух причин: 1) ваши контейнеры не находятся в одной сети или 2) другой контейнер еще не запущен.Видя, что они находятся в одной сети, звучит так, как будто это что-то с работающим контейнером.

Чтобы устранить неполадки, я бы запустил другой контейнер, поместил его в сеть и проверил, разрешается ли имя хоста mongo.

docker container run --rm -ti --network mongo ubuntu
$ apt update && apt install -y dnsutils
$ dig mongo

На этом этапе вы должны увидеть разрешение записи A в базе данных.Если нет, убедитесь, что контейнер базы данных mongo запущен и работает.

Вы также можете попробовать сделать это в контейнере приложения.Если это работает, то использование что-то вроде waitforit должно работать.Это распространенная проблема, поскольку приложения могут запускаться до того, как база данных будет запущена или готова принять соединения.

В качестве еще одного элемента обратной связи вам не нужно выставлять порт Монго.Это делает его доступным для всего мира, что, скорее всего, не то, что вы хотите.Вы по-прежнему можете осуществлять связь между контейнерами, не открывая порт.

1 голос
/ 22 мая 2019

Поможет ли вам вставить «сон 10» в ваше приложение перед подключением к mongo db?Если это так, добавление чего-то вроде wiatforit (https://github.com/maxcnunes/waitforit) может помочь.

0 голосов
/ 23 мая 2019

После нескольких часов проб, я нашел решение: выключить брандмауэр Windows.Вот и все.

Спасибо, я ценю вашу помощь.

...