实战指南:使用 Docker Compose 优雅部署 MongoDB 并自动初始化用户

实战指南:使用 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
========== 用户 '你的新用户名' 创建成功 ==========
相关推荐
阿里云瑶池数据库1 小时前
AI时代下的数智投研:九方智投携手阿里云MongoDB打造智能投顾新范式
人工智能·mongodb·阿里云
一坨阿亮1 小时前
Docker 离线部署
java·spring cloud·docker
yyyyy_abc1 小时前
docker学习笔记
运维·docker·容器
一起逃去看海吧1 小时前
Dify-01-docker安装 和 dify部署
运维·docker·容器
月光技术杂谈1 小时前
深度解析:基于Docker跨架构构建RK3588嵌入式rootfs的原理、边界与最佳实践
docker·容器·rootfs·rk3588·openeuler·欧拉·文件系统构建
容器魔方1 小时前
Kthena 核心原语:ModelServing CRD 如何定义分布式推理“新标准”?
大数据·分布式·云原生·容器·云计算
头发够用的程序员1 小时前
WSL2 Ubuntu 24.04 离线安装 Docker 全流程
linux·ubuntu·docker
xingfujie1 小时前
第1章:整体架构与准备工作
linux·云原生·容器·架构·kubernetes·kubelet
七爷不在我这里1 小时前
dockerB站笔记
笔记·docker