从外部应用程序连接到Docker中的MongoDB

时间:2018-09-25 21:57:52

标签: node.js mongodb docker networking

是否可以从本地运行的外部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();
    }
  });
});

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

我将假定它是撰写规范。尝试以下配置

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

答案 2 :(得分:0)

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