【问题标题】:DOCKER : MongooseError [MongooseServerSelectionError]: getaddrinfo ENOTFOUND mongoDOCKER:MongooseError [MongooseServerSelectionError]:getaddrinfo ENOTFOUND mongo
【发布时间】:2020-07-01 07:18:09
【问题描述】:

我正在尝试将 mongodb 与我在 docker 容器中的应用程序连接起来。我正在使用猫鼬包,这是我写的代码

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 cmdline 中运行 docker-compose up 时遇到的错误

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 新手,所以不太了解它,我试图检查一些在线解决方案,但没有帮助

【问题讨论】:

  • 有同样的问题。你找到解决办法了吗?

标签: node.js mongodb typescript docker


【解决方案1】:

尝试创建和使用网络而不是link

version: "3"
services:
    app:
        container_name: IssueTracker
        restart: always
        build: .
        ports: 
            - '9000:9000'
        networks: #here
            - my-network
    mongo:
        container_name: mongo
        image: mongo
        ports:
            - '27017:27016'
        networks: #here
            - my-network 
    
    networks: #here
        my-network:
            driver: bridge

【讨论】:

    【解决方案2】:

    一些值得用来了解发生了什么的命令:

    docker ps -a - 列出所有容器及其状态 docker ps -aq - 仅列出容器 ID。

    docker container list --all - 与docker ps -a相同

    docker container inspect [container_id] - 这会输出一堆与容器相关的信息 - 在底部您会找到网络信息(IP 地址、端口映射)。有问题时我会这样做。

    我经常发现一个旧容器阻塞了我想使用的端口,所以......

    docker rm -f $(docekr ps -aq) - 强制删除所有容器。这有效地清理了您的 docker 容器并为您提供了一个干净的状态(尽管如果您想要一个全新的镜像和新的卷挂载,可能会留下孤儿卷,这可能会导致问题)。

    另一个需要检查的地方是容器本身中应用程序/数据库的日志... 登录 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 等,即我们写 mv/scp/cp src_file dest_dir 这样更容易知道你应该是哪个端口如果您遵循此经验法则,则连接到。

    您还需要从 node 容器 (docker exec -it [node_container_id] bash) 检查您是否可以 ping mongo 容器。您甚至可以使用您希望打开的端口将telnet [mongo_ip] 27017 发送到mongo 容器。这将证明两台主机可以通过网络进行通信。然后你就知道这不是网络问题,而是应用程序问题。

    【讨论】:

      猜你喜欢
      • 2013-07-15
      • 2017-10-16
      • 1970-01-01
      • 2022-06-23
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 2019-03-14
      相关资源
      最近更新 更多