【问题标题】:Connecting to MongoDB in Docker from external app从外部应用程序连接到 Docker 中的 MongoDB
【发布时间】:2019-03-01 14:40:09
【问题描述】:

是否可以从本地运行的外部 nodejs 应用程序连接到运行 MongoDB 映像的 docker 容器?我尝试通过 localhost:27017 进行连接。这是我正在使用的 docker compose 文件:

version: '3'
services:
  mongodb:
    image: 'bitnami/mongodb:3.6.8'
    ports:
      - "27017:27017"
    environment:
      - MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD
      - MONGODB_USERNAME=$MONGODB_USERNAME
      - MONGODB_PASSWORD=$MONGODB_PASSWORD
      - MONGODB_DATABASE=$MONGODB_DATABASE
    volumes:
      - /data/db:/bitnami

我尝试使用以下网址连接它,但没有成功:

mongodb://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@localhost:27017

编辑:通过 mongodb://localhost:27017 连接有效,但身份验证 url 出错。我打印出这个字符串的结果,并没有什么特别的问题。我验证了用户名和密码与 docker 容器中 mongo 中的用户匹配。

app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`);
  const url = (() => {
    if(process.env.MONGODB_USERNAME && process.env.MONGODB_PASSWORD) {
      return `mongodb://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@localhost:27017/`;
    }
    console.log('could not find environment vars for mongodb');
  })();

  MongoClient.connect(url, (err, client) => {
    if(err) {
      console.log('DB connection error');
    } else {
      console.log("Connected successfully to server");
      client.close();
    }
  });
});

【问题讨论】:

    标签: node.js mongodb docker networking


    【解决方案1】:

    问题原来是我更改了 MONGODB_PASSWORD 中的密码(其中有一个 @ 所以我认为它会干扰字符串解析,所以我因此更改了它)。问题是,当容器重新启动时,它引用相同的卷(应该如此),因此用户从未更新,因此我使用错误的凭据登录。

    【讨论】:

      【解决方案2】:

      始终检查docker logs <container-name> --tail 25 -f 的结果很重要。从我的角度来看,我认为这是与此目录“/bitnami/mongodb”的权限有关的问题。查看 sameersbn comment 如何解决此权限问题。

      我会假设它是 compose 规范。试试下面的配置

       environment:
         MONGODB_ROOT_PASSWORD:$MONGODB_ROOT_PASSWORD
         MONGODB_USERNAME:$MONGODB_USERNAME
         MONGODB_PASSWORD:$MONGODB_PASSWORD
         MONGODB_DATABASE:$MONGODB_DATABASE
       volumes:
         - '/data/db:/data/db'
      

      【讨论】:

      • 感谢您的回复。日志显示 docker 容器正在侦听端口 27017 上的数据库连接,没有任何错误或警告
      • 好的。那么当你尝试连接容器中的数据库时,你会得到什么消息呢?
      • 我没有收到消息,所以我认为这是我使用的 url 的问题。一旦我摆脱了 mongodb url 中的额外凭据参数并将其保留为 mongodb://localhost:27017,我就成功地获得了连接。我假设 bitnami 凭据设置不正确,否则我不明白为什么我能够在未经授权的情况下连接到数据库。
      • 让我更正一下。 Bitnami 正确设置了凭据,但我无法作为组成容器时创建的管理员用户之一连接到数据库
      • 我会假设它是 compose 规范。试试下面的配置环境: MONGODB_ROOT_PASSWORD:$MONGODB_ROOT_PASSWORD MONGODB_USERNAME:$MONGODB_USERNAME MONGODB_PASSWORD:$MONGODB_PASSWORD MONGODB_DATABASE:$MONGODB_DATABASE volumes: - '/data/db:/data/db'
      【解决方案3】:

      如果外部 nodejs 应用程序也在 docker 容器中运行,那么您需要链接容器。这是链接容器的 docker run cmd 示例。我添加了环境变量来说明您将从容器内部使用的主机名和端口。

          docker run -d -it -e DEST_PORT=27017 -e DEST_HOST='mongodb' --link mongodb external-application:latest
      

      【讨论】:

      • (这些天你不需要--link;从同一个docker-compose.yml 启动两个容器就足以使数据库可以作为名称mongodb 访问,它在YAML 文件中的键。 )
      • 没错,但我在 docket-compose.yml 文件中只看到一个容器。也有人说,试图通过一个也在本地运行的外部应用程序与 localhost:27017 建立连接。这意味着即使它们在同一台机器上运行,它们也是解耦的。所以我想知道这个人是否可能以特定于他或她的预期用例的方式设置了“外部应用程序”,但因此阻止了他们使用 localhost
      • 感谢您的反馈。对于没有指定外部 Web 应用程序实际上不在另一个 docker 容器中,我深表歉意。它驻留在主机上。我更新了我的问题以包含该信息。
      • 当您尝试从应用程序连接到 mongodb 容器时遇到什么错误?另外...您是否尝试过进入容器并验证一切都按您的预期设置和运行?
      • 是的,我验证了一切。我用我最近的发现更新了我的答案。
      猜你喜欢
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 2021-09-16
      相关资源
      最近更新 更多