从主机连接到Mongo Docker容器

38

我正在使用以下工具在 macOS 上运行 Docker:

docker run --name mongo -p 27017:27017 -v ./data/db:/data/db -d mongo mongod

并使用从中获取的IP:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <cid>

在:

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var url = 'mongodb://<ip>:27017';

MongoClient.connect(url, function(err, db) {
   assert.equal(null, err);
   db.close();
});

我遇到了超时错误。

我正在使用从Docker Hub获取的官方mongo仓库。我需要做额外的设置才能从主机连接吗?

4个回答

79

代码运行于容器中还是主机上?

如果是在主机上运行,只需使用本地主机地址即可,例如:

var url = 'mongodb://localhost:27017';
这样做是可行的,因为你使用了-p 27017:27017参数将端口发布出来。
如果代码正在容器内运行,最好重写代码使用链接,并通过名称引用mongo容器,例如:
var url = 'mongodb://mongo:27017';

然后,当您使用Node.js代码启动容器时,只需执行以下操作:

docker run -d --link mongo:mongo my_container

Docker会在容器内部向/etc/hosts添加一条条目,以便将名称mongo解析为mongo容器的IP地址。


我正在主机上运行它。当我将其更改为localhost时,我收到了连接被拒绝的错误。 - ggeise
你确定mongo容器仍在运行吗?可以在docker ps中查看。我刚测试了一下,它立即崩溃并显示日志错误 - 我必须传递--smallfiles参数才能启动它。 - Adrian Mouat
没错,对我来说它一直保持着连接。我尝试将我的程序放在一个容器中,并且使用链接语法进行连接,效果非常好。 - ggeise
1
哦,你正在使用boot2docker/Docker工具箱吗?如果是的话,你需要使用虚拟机的IP地址,而不是localhost。 - Adrian Mouat
啊,我明白了!花了一段时间才弄清楚虚拟机的IP与容器中的IP不同。谢谢您,先生! - ggeise
显示剩余3条评论

9

如果您使用docker-compose,还有另一种选择:

version: '3.1'
services:
  mongo:
    image: mongo
    container_name: "mongo"
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - './dockervolume/mongodb:/data/db'
    ports:
      - 27017:27017

您可以使用 URL 字符串进行连接

    MongoClient.connect("mongodb://root:example@localhost:27017")
        .then(()=>{
            console.log("db connect success");
        })
        .catch((err)=>{
            throw err
        });


非常有用。非常感谢您帮助我完成这个。 - Anthony Moon Beam Toorie

8
如果您使用自定义网络,应该能够在不链接或指定27017的情况下获取它。
const MONGO_NAME_STR = "mongodb://" + "your_docker_container_name";
var db = {};

mongo_client.connect(MONGO_NAME_STR, function(err, _db){
  //some err handling
  db = _db;
});

真的是被低估的答案。 - Anthony Moon Beam Toorie
惊人的答案与下面的同行相结合 - Anthony Moon Beam Toorie
这真的很不错!我们尝试了所有可能的方法整整两天,最终偶然发现了这个答案。非常感谢!! - Sukanya Pai

1
使用docker-compose,可以按照以下方式实现相同的效果。
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/

连接字符串如下所示, 在主机上 -
const uri = "mongodb://root:example@localhost:27017/

在容器中 -
const url = 'mongodb://root:example@mongo:27017'

端口映射可以配置为使用自定义主机端口[8000],例如- 8000:27017


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接