Docker容器部署MongoDB(副本集)
本文记录一下使用docker部署MongoDB的过程,本文使用mongo 7.0,搭建两个副本集节点。本文示例用户为root
,密码为123456
,地址为mongo.example.com
,请注意替换。
最终目录结构
├── docker-compose.yml
├── mongo1
│ ├── configdb
│ └── db
├── mongo2
│ ├── configdb
│ └── db
└── mongodb-replica-keyfile
目录和权限
# mongo1和mongo2分别为两个节点的数据映射目录
chmod 777 -R ./mongo1
chmod 777 -R ./mongo2
# mongo5.0以上副本集需要keyFile
openssl rand -base64 756 > mongodb-replica-keyfile
chmod 400 mongodb-replica-keyfile
sudo chown 998:996 mongodb-replica-keyfile
如果不指定keyFile或者权限(组)不正确会报错误BadValue: security.keyFile is required when authorization is enabled with replica sets
容器中用户(mongod)ID是998,用户组(mongod)ID是996。keyFile的用户和用户组为mongod:mongod
。
部署和初始化
编写docker-compose.yml
如果想增加节点,复制服务同时改变一下映射端口和目录即可
services:
mongo1:
image: mongodb/mongodb-community-server:7.0-ubi8
container_name: mongo1
command: --replSet rs0 --keyFile /etc/mongo/keyfile
ports:
- 27017:27017
volumes:
- ./mongodb-replica-keyfile:/etc/mongo/keyfile:ro
- ./mongo1/configdb:/data/configdb
- ./mongo1/db:/data/db
environment:
MONGODB_INITDB_REPLICA_SET_NAME: "rs0"
MONGODB_INITDB_ROOT_USERNAME: "root"
MONGODB_INITDB_ROOT_PASSWORD: "123456"
mongo2:
image: mongodb/mongodb-community-server:7.0-ubi8
container_name: mongo2
command: --replSet rs0 --keyFile /etc/mongo/keyfile
ports:
- 27018:27017
volumes:
- ./mongodb-replica-keyfile:/etc/mongo/keyfile:ro
- ./mongo2/configdb:/data/configdb
- ./mongo2/db:/data/db
environment:
MONGODB_INITDB_REPLICA_SET_NAME: "rs0"
MONGODB_INITDB_ROOT_USERNAME: "root"
MONGODB_INITDB_ROOT_PASSWORD: "123456"
启动
docker-compose up -d
初始化副本集
# 连接MongoDB
mongosh "mongodb://root:123456@mongo.example.com:27017,mongo.example.com:27018/admin?authSource=admin&replicaSet=rs0"
# mongosh中执行
> rs.initiate({_id: "rs0", members: [{ _id: 0, host: "mongo.example.com:27017" },{ _id: 1, host: "mongo.example.com:27018" }]})
附:常用命令
# 唯一索引
db.members.createIndex( { "user_id": 1 }, { unique: true } )
# 创建用户
db.createUser({ user: "testuser", pwd: "userpasswd", roles: [{ role: "dbOwner", db: "testdb" }] })