实战指南:使用 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 小时前
Docker的两种安装
运维·docker·容器
工业一体机老司机1 小时前
工业一体机选购后的系统部署:Ubuntu下Docker容器化运行与GPIO配置
linux·ubuntu·docker·人机交互
fengkai45452 小时前
十二、Redis -2
运维·数据库·redis·容器
DolitD4 小时前
3D应用多实例并发中的GPU隔离技术路径分析
容器·gru·接口隔离原则
姜鱼问生5 小时前
docker exec 排查容器问题:从日志到进程
运维·网络·数据库·docker·容器
人生百态,人生如梦6 小时前
Ubuntu在低版本下使用ccswitch+claudecode(CCSwitch+Docker+Claude)连调教程
linux·ubuntu·docker·claudecode·ccswitch
程序员老赵6 小时前
Docker 部署 OpenViking:轻松搭建 AI Agent 上下文数据库平台
docker·开源·agent
吴声子夜歌7 小时前
Docker入门与实战——高级镜像构建
docker
小匠石钧知7 小时前
07_在k8s集群中安装ingress-nginx
nginx·容器·kubernetes·ingress
坐看风云变幻8 小时前
Betaflight 开发环境搭建保姆级教程(Ubuntu / Windows+WSL / Docker 三方案 + 官方网址大全)
windows·ubuntu·docker·无人机·飞控·betaflight