从主机连接到mongo docker容器

gge*_*ise 21 macos mongodb node.js docker

我在OS X上运行Docker:

docker run --name mongo -p 27017:27017 -v ./data/db:/data/db -d mongo mongod
Run Code Online (Sandbox Code Playgroud)

并使用我得到的IP:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <cid>
Run Code Online (Sandbox Code Playgroud)

在:

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();
});
Run Code Online (Sandbox Code Playgroud)

而且我得到了一个超时错误.

我正在使用Docker Hub的官方mongo存储库.是否需要进行任何其他设置才能从主机进行连接?

Adr*_*uat 33

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

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

var url = 'mongodb://localhost:27017';
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为您发布了端口-p 27017:27017.

如果代码在容器内运行,最好重写它以使用链接并通过名称引用mongo容器,例如:

var url = 'mongodb://mongo:27017';
Run Code Online (Sandbox Code Playgroud)

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

docker run -d --link mongo:mongo my_container
Run Code Online (Sandbox Code Playgroud)

然后,Docker将/etc/hosts在容器内添加一个条目,以便名称mongo解析为mongo容器的IP.


rol*_*oll 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

Run Code Online (Sandbox Code Playgroud)

你可以使用 url 字符串进行连接

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

Run Code Online (Sandbox Code Playgroud)


ful*_*ife 6

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