实战指南:使用 Docker Compose 优雅部署 MongoDB 并自动初始化用户
一、 目录结构准备
首先,在你的服务器或本地创建一个独立的项目文件夹,结构如下:
text
mongodb-docker/
├── docker-compose.yml # 容器编排配置文件
├── init-mongo.js # 数据库初始化脚本
├── data/ # 留空,用于挂载数据库文件
└── logs/ # 留空,用于挂载日志文件
二、 编写编排配置 (docker-compose.yml)
这是整个部署的核心。为了让 MongoDB 将日志写到特定目录,我们通常需要预先用 chown 修改目录权限。
⚠️ 常见雷区: 很多教程会教你使用 command 来执行 chown 并启动 mongod,但这会直接覆盖掉官方镜像自带的初始化流程,导致你的创建用户脚本失效!
正确做法: 使用 entrypoint 代理,并在执行完权限修改后,调用官方的 docker-entrypoint.sh 将控制权交还给镜像。
yaml
version: '3.8'
services:
mongodb:
image: mongo:7.0.32
container_name: mongodb
restart: always
environment:
# 镜像内置变量:自动在 admin 库创建最高权限的 root 账号
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin@123
MONGO_INITDB_DATABASE: admin
ports:
- "27017:27017"
volumes:
- ./data:/data/db # 数据持久化
- ./logs:/var/log/mongodb # 日志持久化
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro # 挂载初始化脚本
# 【核心技巧】修改权限后,务必使用 exec docker-entrypoint.sh 触发官方初始化流程
entrypoint: >
bash -c "
mkdir -p /var/log/mongodb &&
chown -R mongodb:mongodb /var/log/mongodb &&
exec docker-entrypoint.sh mongod --bind_ip_all --logpath /var/log/mongodb/mongod.log
"
networks:
- mongo-net
networks:
mongo-net:
driver: bridge
三、 编写初始化脚本 (init-mongo.js)
官方镜像在首次启动 时,会自动扫描 /docker-entrypoint-initdb.d/ 目录下的 .js 或 .sh 文件并执行。
💡 注意: 我们已经在上面的 YAML 文件中通过环境变量创建了 admin 用户,所以在这里只需要创建业务专属的数据库和用户即可,千万不要重复创建 admin。
在项目根目录新建 init-mongo.js:
javascript
// init-mongo.js
// ==========================================
// 模板:如果需要加其他业务用户,参考下面代码
// ==========================================
/*
db = db.getSiblingDB('你的新数据库名');
db.createUser({
user: '你的新用户名',
pwd: '你的新密码',
roles: [{ role: 'readWrite', db: '你的新数据库名' }]
});
print("========== 用户 '你的新用户名' 创建成功 ==========");
*/
四、 启动与验证
在启动前,必须牢记 MongoDB 官方镜像的一个安全机制:
只有当数据挂载目录 (
/data/db) 完全为空时,才会认定为"首次启动",从而执行环境变量账号创建和 init-mongo.js 脚本!
如果你之前启动失败过,目录里已经产生了残留数据,请务必先清空 data/ 目录。
bash
# 确保 data 目录为空 (如果是全新配置可忽略)
sudo rm -rf ./data/*
# 后台启动容器
docker-compose up -d
# 查看容器启动日志
docker logs -f mongodb
如果你在日志中看到了类似以下的输出,恭喜你,数据库已经完美跑起来了!
text
running /docker-entrypoint-initdb.d/init-mongo.js
========== 用户 '你的新用户名' 创建成功 ==========