容器可以理解为一个进程,镜像是把环境,组件等都配置好,运行成容器的,容器里面运行服务,也可以说是一个进程。镜像是模板,镜像是实例。
一个镜像可以创建多个实例。也就是多个容器,容器之间相互独立。
创建副本集,1主2从,主负责增删改,当然查也可以,从负责只读。
远程的linux系统,在远程的linux系统上使用docker搭建mongoDB的三节点副本集。
注意:mongoDB版本:mongo6.0之前的版本,执行的时候使用mongo这个命令启动客户端,mongo的6.0版本之后使用mongosh命令启动客户端。
重要的事情说三遍!
重要的事情说三遍!
重要的事情说三遍!
注意:mongoDB版本:mongo6.0之前的版本,执行的时候使用mongo这个命令启动客户端,mongo的6.0版本之后使用mongosh命令启动客户端。
docker pull mongo:6.2
mkdir -p /home/data/master
mkdir -p /home/data/slave1
mkdir -p /home/data/slave2
如果有特殊要求就创建一个属于自己的网络。如果没有特殊要求就用默认的。
这儿我自己创建了一个。
// 查看网络信息
docker network ls
// 创建一个驱动是网桥,网络名是ste_net的网络
docker network create --driver bridge mynet
下面是通过启动三个容器,三个容器通过宿主机的端口10001 10002 10003 映射27017,也就是通过这三个端口都可以访问到27017的端口。当然这三个端口都是暴露在外面的。
--itd:既交互式访问,又让服务后端执行
--restart always:假如服务断了,可以尝试启动
-v:主机路径:docker路径;挂载卷,这个可以同步数据,同步宿主机和容器的数据。持久化数据。
--name :给新容器取名
--replSet :设置副本集名称,这里的名称是rs
sudo docker run -itd --restart always --name mongodb-master
-p 10001:27017
-v /home/master/data:/data/db
-v /home/master/conf:/data/conf
-v /home/master/log:/data/log mongo:6.2 --replSet "rs"
sudo docker run -itd --restart always --name mongodb-slave1
-p 10002:27017
-v /home/slave1/data:/data/db
-v /home/slave1/conf:/data/conf
-v /home/slave1/log:/data/log mongo:6.2 --replSet "rs"
sudo docker run -itd --restart always --name mongodb-slave2
-p 10003:27017
-v /home/slave2/data:/data/db
-v /home/slave2/conf:/data/conf
-v /home/slave2/log:/data/log mongo:6.2 --replSet "rs"
最后使用docker ps 查看容器是否创建成功!
想把哪个容器当做主节点,就进入哪个容器。
注意:我的mongo的版本是6以上的,如果你是6以下的,请使用mongo,6以上使用Mongosh。
docker exec -it mongodb-master mongosh
如果出现下面一堆东西,说明通过客户端创建成功了!
上面我们已经完成了宿主机和容器之间的映射,下面设置主从节点。
进入容器后,通过rs.initiate()命令对主从节点进行初始化。
下面是进入容器后的状态 test>
格式:
rs.initiate(
... {
... _id:"集群名称", // 这儿也就是创建容器的时候后面的 副本集名称
... version:1,
... members:[
... {_id:0,host:"宿主机IP:10001"},
... {_id:1,host:"宿主机IP:10002"},
... {_id:2,host:"宿主机IP:10003"}
... ]
... }
)
看到"ok":1为成功,0为失败,如果你为0,看看上面有无操作出错。
下面已经变成了主节点
最后,通过rs.status()查看状态: