【问题标题】:Connecting to mongo docker container from host从主机连接到 mongo docker 容器
【发布时间】:2016-01-25 00:32:30
【问题描述】:

我在 OS X 上运行 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 存储库。为了从主机连接,我需要做任何其他设置吗?

【问题讨论】:

    标签: node.js macos mongodb docker


    【解决方案1】:

    node.js 代码是从容器运行还是从主机运行?

    如果它在主机上,只需使用本地主机地址,即:

    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 时,连接被拒绝。
    • 你确定 mongo 容器还在运行吗?看看docker ps。我刚刚进行了测试,它立即崩溃并出现日志错误 - 我必须传递 --smallfiles 参数才能启动它。
    • 是的,这对我来说是熬夜。我尝试将我的程序放在一个容器中,它与链接语法连接得很好。
    • 哦,您使用的是 boot2docker/Docker 工具箱吗?如果是这样,您需要使用 VM 的 IP,而不是 localhost。
    • 啊,我明白了!我花了一段时间才弄清楚 VM 的 IP 和容器的 IP 之间存在差异。谢谢你,先生!
    【解决方案2】:

    如果您使用用户定义的网络,您应该能够在不链接或指定 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;
    });
    

    【讨论】:

    • 真正被低估的答案
    • 与下面的人结合的惊人答案
    • 这真是太棒了!!我们尝试了所有可能的方法整整 2 天,最后偶然发现了这个答案。非常感谢!
    【解决方案3】:

    任何使用 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
            });
    
    

    【讨论】:

    • 非常有用。非常感谢你帮我解决这个问题
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2018-01-09
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2016-01-05
    相关资源
    最近更新 更多