docker-compose 部署 MongoDB
本文是通过三台机器部署的三个
mongo
副本组成的集群,每个节点部署一个mongo
服务,数据存储采用绑定nfs
进行存储
前提: 机器上安装好docker
和docker-compose
1. 生成 keyFile
- MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
- keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
- 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
- 可以使用任意方法生成keyFile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。这是MongoDB官方推荐keyFile的生成方式
# 400权限是要保证安全性,否则mongod启动会报错
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key
还有另外值的注意的是该keyfile文件的所属用户不正确会出现:bad file错误。解决:(不是必须执行,出错执行)
sudo chown 999 mongodb.key
将keyFile
复制到其他两台机器上
mkdir /data/mongo/{data,configdb} -pv
# 将mongodb.key复制到 /data/mongo目录下,注意根据实际的磁盘空间创建目录
2. 详细的 docker-compose.yml
文件信息
我这是使用的
nfs
存储的mongo的数据,配置里面的nfs_host_ip
需要替换为你自己的nfs server的ip
可参考博客:https://blog.51cto.com/u_16175450/7974774 进行配置
- 一号机
version: "3"
services:
mongodb1:
image: mongo:5.0.6
container_name: mongo1
restart: always
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=shuhuantong
- MONGO_INITDB_ROOT_PASSWORD=shuhuantong123
- MONGO_PACKAGE=mongodb-org
- MONGO_REPO=repo.mongodb.org
- HOME=/data/db
- MONGO_DATA_DIR=/data/db
- MONGO_INITDB_DATABASE=ipaas
- TZ=Asia/Shanghai
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- volume-data:/data/db
- /etc/localtime:/etc/localtime
- /data/mongo/configdb:/data/configdb
- /data/mongo/mongodb.key:/mongodb.key
deploy:
resources:
limits:
cpus: '8'
memory: 32G
reservations:
cpus: '4'
memory: 16G
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
volumes:
volume-data:
driver_opts:
type: nfs
o: addr=nfs_host_ip,nolock,soft,rw
device: ":/data/nfs/mongo"
- 二号机
version: "3"
services:
mongodb1:
image: mongo:5.0.6
container_name: mongo2
restart: always
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=shuhuantong
- MONGO_INITDB_ROOT_PASSWORD=shuhuantong123
- MONGO_PACKAGE=mongodb-org
- MONGO_REPO=repo.mongodb.org
- HOME=/data/db
- MONGO_DATA_DIR=/data/db
- MONGO_INITDB_DATABASE=ipaas
- TZ=Asia/Shanghai
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- volume-data:/data/db
- /etc/localtime:/etc/localtime
- /data/mongo/configdb:/data/configdb
- /data/mongo/mongodb.key:/mongodb.key
deploy:
resources:
limits:
cpus: '8'
memory: 32G
reservations:
cpus: '4'
memory: 16G
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
volumes:
volume-data:
driver_opts:
type: nfs
o: addr=nfs_host_ip,nolock,soft,rw
device: ":/data/nfs/mongo2"
- 三号机
version: "3"
services:
mongodb1:
image: mongo:5.0.6
container_name: mongo3
restart: always
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=shuhuantong
- MONGO_INITDB_ROOT_PASSWORD=shuhuantong123
- MONGO_PACKAGE=mongodb-org
- MONGO_REPO=repo.mongodb.org
- HOME=/data/db
- MONGO_DATA_DIR=/data/db
- MONGO_INITDB_DATABASE=ipaas
- TZ=Asia/Shanghai
command: mongod --replSet rs0 --keyFile /mongodb.key
volumes:
- volume-data:/data/db
- /etc/localtime:/etc/localtime
- /data/mongo/configdb:/data/configdb
- /data/mongo/mongodb.key:/mongodb.key
deploy:
resources:
limits:
cpus: '8'
memory: 32G
reservations:
cpus: '4'
memory: 16G
entrypoint:
- bash
- -c
- |
chmod 400 /mongodb.key
chown 999:999 /mongodb.key
exec docker-entrypoint.sh $$@
volumes:
volume-data:
driver_opts:
type: nfs
o: addr=nfs_host_ip,nolock,soft,rw
device: ":/data/nfs/mongo3"
3. 启动三个容器
分别在三台机器上执行启动命令
# 启动命令
docker-compose -f docker-compose.yml up -d
# 重启命令
docker-compose -f docker-compose.yml restart
# 停止命令
docker-compose -f docker-compose.yml stop
# 删除容器命令
docker-compose -f docker-compose.yml rm
4. 配置集群
- 进入
Mongo
容器链接Mongo
# 选择第一个容器mongo1,进入mongo 容器
docker exec -it mongo1 /bin/bash
# 登录mongo
mongo -u shuhuantong -p shuhuantong123
通过以下指令配置 mongo
副本集集群
# 认证
> use admin
> db.auth('shuhuantong', 'shuhuantong123')
成功返回1,失败返回0
5. 使用配置文件初始化集群
单主机模式部署
3副本集
添加节点必须使用宿主机IP+PORT
,使用容器内部IP的情况下代码层面连接到 mongodb-cluster 集群,
获取到的集群地址信息为docker
容器内部IP
,若业务代码没有部署在mongodb
主机则无法访问
- 配置文件
> config={_id:"rs0",members:[
{_id:0,host:"192.168.8.120:27017"},
{_id:1,host:"192.168.8.121:27017"},
{_id:2,host:"192.168.8.122:27017"}]
}
- 初始化集群
> rs.initiate(config)
- 增长 mongo1 和 mongo2 的权重
> cfg = rs.conf()
# 修改权重
> cfg.members[0].priority=5
> cfg.members[1].priority=3
# 从新配置
> rs.reconfig(cfg)
- 验证副本集
# 切换节点查看同步状态:
> rs.printReplicationInfo()
# 仅当建立了集合后副节点才会进行同步
标签:compose,mongo,部署,MongoDB,key,mongodb,docker,data,MONGO
From: https://blog.csdn.net/qq_43239389/article/details/141063742