Java-159 MongoDB 副本集容器化 10 分钟速查卡|keyfile + –auth + 幂等 init 附 docker-compose
·
MongoDB 副本集容器化配置
使用 Docker Compose 部署带认证的 MongoDB 副本集,包含 keyfile 生成和初始化脚本的幂等性处理。以下配置示例支持快速搭建三节点副本集。
Docker Compose 文件
version: '3.8'
services:
mongo1:
image: mongo:5.0
container_name: mongo1
restart: always
ports:
- "27017:27017"
volumes:
- ./keyfile:/data/keyfile
- ./init.js:/docker-entrypoint-initdb.d/init.js
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
command: mongod --replSet rs0 --keyFile /data/keyfile --auth
mongo2:
image: mongo:5.0
container_name: mongo2
restart: always
ports:
- "27018:27017"
volumes:
- ./keyfile:/data/keyfile
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
command: mongod --replSet rs0 --keyFile /data/keyfile --auth
mongo3:
image: mongo:5.0
container_name: mongo3
restart: always
ports:
- "27019:27017"
volumes:
- ./keyfile:/data/keyfile
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
command: mongod --replSet rs0 --keyFile /data/keyfile --auth
Keyfile 生成步骤
在宿主机生成 keyfile 并设置权限:
openssl rand -base64 756 > keyfile
chmod 400 keyfile
初始化脚本 (init.js)
幂等性初始化脚本,放置在 docker-entrypoint-initdb.d/ 目录下自动执行:
// 检查是否已初始化
rs.status().ok || rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo1:27017" },
{ _id: 1, host: "mongo2:27017" },
{ _id: 2, host: "mongo3:27017" }
]
});
// 创建应用数据库用户(幂等操作)
try {
db.getSiblingDB("appdb").createUser({
user: "appuser",
pwd: "apppass",
roles: [{ role: "readWrite", db: "appdb" }]
});
} catch (e) {
// 用户已存在时忽略错误
if (e.code !== 51003) throw e;
}
操作命令
启动副本集:
docker-compose up -d
手动连接验证(主节点):
docker exec -it mongo1 mongosh -u root -p example
强制重新配置副本集(故障恢复时):
rs.reconfig(cfg, {force: true})
注意事项
- 所有容器必须共享相同的 keyfile
- 初始化脚本仅在主节点首次启动时执行
- 生产环境应使用更复杂的密码和权限配置
- 网络延迟可能导致初始化需要等待节点完全启动
该配置实现了带认证的MongoDB副本集容器化方案,初始化过程具有幂等性,适合快速搭建开发测试环境。
ilo.n8d3po3s.INFo
更多推荐
所有评论(0)