【问题标题】:Docker MongoDB immadiately closes connection after receiving metadataDocker MongoDB 收到元数据后立即关闭连接
【发布时间】:2023-04-11 03:39:02
【问题描述】:

我正在尝试用两个容器编写 docker 应用程序:

  1. 蒙哥
  2. 应用程序

Mongo 容器工作正常,同时应用无法连接到 mongo。 node.js app 和 mongostat 都不能。奇怪的是,我尝试在两台装有 Win10 的计算机上运行这个项目,而在另一台计算机上运行正常。

当我从应用容器运行 node app.jsmongostat --uri "mongodb://mongo:27017/project" 时,这些是来自 mongo 容器的日志:

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 的 sn-p:

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;
});```

【问题讨论】:

    标签: node.js mongodb docker docker-compose


    【解决方案1】:

    在连接到 mongo db 之前,在应用程序中插入“sleep 10”是否有帮助?如果是这样,添加类似 wiatforit (https://github.com/maxcnunes/waitforit) 的内容可能会有所帮助。

    【讨论】:

    • 没有改变。
    • 您能从您的应用容器中执行“ping mongo”吗?另外,您是否有理由在 mongo 网络规范中使用“external:true”标志?
    【解决方案2】:

    由于您收到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 之类的东西应该可以工作。这是一个常见问题,因为应用程序可能在数据库运行或准备好接受连接之前启动。

    作为另一项反馈,您不需要公开 mongo 端口。这使得世界可以访问它,这很可能不是你想要的。您仍然可以在不暴露端口的情况下进行容器到容器的通信。

    【讨论】:

      【解决方案3】:

      经过数小时的尝试,我找到了解决方案:关闭 Windows 防火墙。而已。

      谢谢,感谢您的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-14
        • 2017-09-26
        • 2022-07-27
        • 2020-05-07
        • 2020-05-15
        • 1970-01-01
        • 2017-03-20
        • 2022-07-30
        相关资源
        最近更新 更多