DOCKER: MongooseError [MongooseServerSelectionError]: getaddrinfo ENOTFOUND mongo - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь подключить mongodb к моему приложению в docker контейнере. Я использую пакет mon goose, это код, который я написал

mongoose.connect("mongodb://mongo:27016/IssueTracker", { useNewUrlParser: true,useUnifiedTopology: true },(err: Error) => {
    err ? console.log(err) : console.log("Mongodb database connected");
}); 

Это мой docker-compose.yml файл

version: "3"
services:
    app:
        container_name: IssueTracker
        restart: always
        build: .
        ports: 
            - '9000:9000'
        links:
            - mongo
    mongo:
        container_name: mongo
        image: mongo
        ports:
            - '27017:27016'

А вот мой Dockerfile

FROM node:13

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 9000

RUN ["npm","run","dev"]

Это ошибка, которую я получаю, когда пытаюсь запустить docker-compose up в моей docker cmdline

server started on port 9000
MongooseError [MongooseServerSelectionError]: getaddrinfo ENOTFOUND mongo
        at new MongooseServerSelectionError (/app/node_modules/mongoose/lib/error/serverSelection.js:22:11)
        at NativeConnection.Connection.openUri (/app/node_modules/mongoose/lib/connection.js:823:32)
        at Mongoose.connect (/app/node_modules/mongoose/lib/index.js:333:15)
        at Object.<anonymous> (/app/src/app.ts:9:10)
        at Module._compile (internal/modules/cjs/loader.js:1123:30)
        at Module.m._compile (/app/node_modules/ts-node/src/index.ts:839:23)
        at Module._extensions..js (internal/modules/cjs/loader.js:1143:10)
        at Object.require.extensions.<computed> [as .ts] (/app/node_modules/ts-node/src/index.ts:842:12)
        at Module.load (internal/modules/cjs/loader.js:972:32)
        at Function.Module._load (internal/modules/cjs/loader.js:872:14)
        at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
        at main (/app/node_modules/ts-node/src/bin.ts:227:14)
        at Object.<anonymous> (/app/node_modules/ts-node/src/bin.ts:513:3)
        at Module._compile (internal/modules/cjs/loader.js:1123:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:1143:10)
        at Module.load (internal/modules/cjs/loader.js:972:32) {
      reason: TopologyDescription {
        type: 'Single',
        setName: null,
        maxSetVersion: null,
        maxElectionId: null,
        servers: Map(1) { 'mongo:27016' => [ServerDescription] },
        stale: false,
        compatible: true,
        compatibilityError: null,
        logicalSessionTimeoutMinutes: null,
        heartbeatFrequencyMS: 10000,
        localThresholdMS: 15,
        commonWireVersion: null
      },
      [Symbol(mongoErrorContextSymbol)]: {}
    }

Пытался проверить, есть ли какой-либо из моего контейнера в docker используя упомянутый порт, чтобы создать эту ошибку, и ни один не использовал тот же порт. Я новичок в docker, поэтому не знаю много об этом, я попытался проверить некоторые онлайн-решения, но это не помогло

1 Ответ

0 голосов
/ 01 мая 2020

Некоторые команды, которые стоит использовать, чтобы понять, что происходит:

docker ps -a - перечисляет все контейнеры и их статус docker ps -aq - перечисляет только идентификаторы контейнеров.

docker container list --all - так же, как docker ps -a docker container inspect [container_id] - это выводит кучу информации, относящейся к контейнеру, - внизу вы найдете информацию о сети (IP-адрес, сопоставления портов). Это мое go, когда возникают проблемы.

Часто я нахожу старый контейнер, блокирующий порт, который я хочу использовать, чтобы ...

docker rm -f $(docekr ps -aq) - принудительно удаляет все контейнеры. Это эффективно очищает ваши docker контейнеры и дает вам чистую доску.

Другим местом для проверки будут журналы приложения / db в самом контейнере ... для входа в docker контейнер и получите командный терминал:

docker exec -it [container_id] bash - или sh вместо bash (или предпочитаемый вами вариант терминала, если он поддерживается). Последний параметр здесь - команда для выполнения над контейнером. Вы можете просто написать ls -al. Примечание: контейнер должен быть в рабочем состоянии, чтобы это работало.

Также стоит отметить, что открытый порт вашего mongo контейнера - это 27016, а не тот, который указан в соединении: mongodb://mongo:27016 - 27016 - это порт открыт внутри (внутри контейнера). 27017 - это порт, который вы должны использовать для соединений из других контейнеров / внешних местоположений. Если приложение узла запускается в контейнере, то вам может повезти, но это противоречит передовым методам. Одно приложение на контейнер.

Мой метод запоминания порядка сопоставления портов - src(localhost):destination(container) - это то же самое для большинства команд unix: cp, scp, mv, et c. то есть мы пишем mv/scp/cp src_file dest_dir, чтобы было проще узнать, к какому порту вы должны подключаться, если вы следуете этому практическому правилу.

Вы также захотите проверить это из контейнера node (docker exec -it [node_container_id] bash ), что вы можете пропинговать контейнер mon go. Возможно, вы даже сможете telnet [mongo_ip] 27017 в контейнер mongo, используя порт, который вы ожидаете открыть. Это докажет, что два хоста могут общаться по сети. Тогда вы знаете, что это не проблема сети, а проблема приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...