创建网络
docker network create mongo-cluster
创建容器
docker run -d --name mongo1 --net mongo-cluster -v D:/mongodb/data/mongo1:/data/db -p 27017:27017 mongo:4.0 --replSet "rs0"
docker run -d --name mongo2 --net mongo-cluster -v D:/mongodb/data/mongo2:/data/db -p 27018:27017 mongo:4.0 --replSet "rs0"
docker run -d --name mongo3 --net mongo-cluster -v D:/mongodb/data/mongo3:/data/db -p 27019:27017 mongo:4.0 --replSet "rs0"
进入任意节点
docker exec -it mongo1 mongo
docker容器内部可以访问,副本集的配置
rs.initiate(
{
_id : 'rs0',
members: [
{ _id: 0, host: "mongo1:27017" },
{ _id: 1, host: "mongo2:27017" },
{ _id: 2, host: "mongo3:27017" }
]
}
)
查看状态
rs.status()
进入主节点,创建用户账号密码,用于在应用程序MongoDB compass中访问
主节点的账号密码会自动复制到其他节点
db.createUser({
user: "admin",
pwd: "123456",
roles: [{ role: "root", db: "admin" }]
})
在MongoDB compass中输入mongodb://admin:123456@localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0&authSource=admin
错误消息"getaddrinfo ENOTFOUND mongo2"表明MongoDB Compass在解析主机名"mongo2"时出现问题。
起初以为是需要设置为
_id: 'rs0',
members: [
{ _id: 0, host: "localhost:27017" },
{ _id: 1, host: "localhost:27018" },
{ _id: 2, host: "localhost:27019" }
]
});
如果这样设置会导致三个节点之间无法通信,在Docker容器内部运行MongoDB时,使用localhost
并不指向你的宿主机(Windows 系统),而是指向容器本身的内部网络环境。
在mongo1
容器中执行rs.initiate()
并尝试连接到localhost:27018
和localhost:27019
时,它实际上是在尝试连接mongo1
容器自己的27018
和27019
端口,而这些端口并没有被使用。
因此不需要改动,依然使用mongo1、mongo2、mongo3,在容器内部通信是可以的。
从宿主机或任何不在Docker网络中的客户端连接副本集时,应该使用宿主机的地址(localhost
)和映射到的端口号。
重要
具有管理员权限的文本编辑器打开"C:\Windows\System32\drivers\etc\hosts"文件。
127.0.0.1 mongo1 mongo2 mongo3
设置完可以连接了。
端口映射将本地主机上的流量重定向到容器内的MongoDB服务,通过本地主机的localhost访问MongoDB容器时,本地主机的DNS解析可能无法识别这些容器内的主机名