副本集 my-mongo-set 的新配置 1 中没有描述的主机映射到此节点

Jam*_*mie 3 mongodb docker

我正在使用 Docker 来设置 MongoDB 集群。

我有一个 bash 脚本,它启动三个共享网桥的容器,以便它们可以相互通信。我可以连接到网络中的所有 MongoDB 数据库。

NodeJS 脚本将集群成员添加到网络。

docker rm -v -f mongo0
docker rm -v -f mongo1
docker rm -v -f mongo2

docker network create my-mongo-cluster

docker run -d \
-p 30002:27017 \
--name mongo0 \
--net my-mongo-cluster \
mongo mongod --replSet my-mongo-set

docker run -d \
-p 30003:27017 \
--name mongo1 \
--net my-mongo-cluster \
mongo mongod --replSet my-mongo-set

docker run -d \
-p 30004:27017 \
--name mongo2 \
--net my-mongo-cluster \
mongo mongod --replSet my-mongo-set

node setupDatabase.js
Run Code Online (Sandbox Code Playgroud)

节点脚本:

async function configure() {
    let database = await connect();

    let adminDb = database.admin();

    await addMembers(adminDb);

    await returnStatus(adminDb);
}

async function connect() {
    return await MongoClient.connect("mongodb://localhost:30002/test");
}

async function addMembers(admin) {
    var config = {
        "_id" : "my-mongo-set",
        "members" : [
            {
                "_id" : 0,
                "host" : "mongo0:30002"
            },
            {
                "_id" : 1,
                "host" : "mongo1:30003"
            },
            {
                "_id" : 2,
                "host" : "mongo2:30004"
            }
        ]};

    return admin.command({replSetInitiate : config});
}

async function returnStatus(admin) {
    return admin.command({replSetGetStatus : 1});
}
Run Code Online (Sandbox Code Playgroud)

每当我调用时addMembers,都会出现以下错误:

副本集 my-mongo-set 的新配置 1 中没有描述的主机映射到此节点

根据我的理解,这意味着 MongoDB 无法连接到给定的成员。但他们都有自己的名字,共享一个网桥。所以他们应该能够相互连接。

任何想法是什么导致了这个问题?

Mat*_*att 5

复制集配置是容器到容器的,因此需要内部容器地址和端口 container-name:27017

var config = {
    "_id" : "my-mongo-set",
    "members" : [
        {
            "_id" : 0,
            "host" : "mongo0:27017"
        },
        {
            "_id" : 1,
            "host" : "mongo1:27017"
        },
        {
            "_id" : 2,
            "host" : "mongo2:27017"
        }
    ]};
Run Code Online (Sandbox Code Playgroud)

可以通过 Docker 映射端口进行连接,但是您需要使用 Docker 主机可以响应的主机名/地址。它还包括不必要的网络跃点,以退出和返回容器。