9
0
0

Docker 部署 MongoDB 7.0:开箱即用带持久化与鉴权

2026-10-28
2026-10-30
文章摘要
|

背景与目标

MongoDB 是自托管应用最常用的文档型数据库(非关系型),文档模型(JSON 式 BSON)适合存结构不那么固定的数据。Windows 上其实有官方 MSI 安装包,装了就能跑,但"能跑"和"用起来顺"是两回事:装成系统服务后卸载不干净、端口被占、加不了访问控制、数据目录乱放。

用 Docker 部署干净得多——官方镜像抹平平台差异,鉴权、数据目录、持久化全部写进一份看得见的 docker-compose.yaml,可复现、可删可重来。

本篇与其他三篇部署教程的差异只有一个,但很关键:MongoDB 的 root 账号只在首次针对空数据目录初始化时创建。这决定了后续所有"改密码、加用户、从无鉴权切到有鉴权"的操作都不能靠改配置完成,必须删数据重来。

读者将得到:一份验证过的 compose 配置、一次带鉴权的连接验证,以及那个不可逆坑的完整处理路径。

提示:本文作者宿主是 Windows (Docker Desktop)。镜像通过华为云镜像站拉取(国内更快更稳)。

步骤

第 0 步:确认 Docker Desktop 已就绪

docker version
docker compose version

输出版本号即 OK。

第 1 步:准备目录

mkdir mongodb && cd mongodb

第 2 步:写 docker-compose.yaml

新建 docker-compose.yaml,整段复制:

services:
  mongodb:
    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mongo:7.0
    container_name: mongodb
    environment:
      MONGO_INITDB_ROOT_USERNAME: "root"
      MONGO_INITDB_ROOT_PASSWORD: "YourStrong!Passw0rd"
    ports:
      - "27017:27017"
    volumes:
      - ./mongo-data:/data/db
    restart: unless-stopped

要点:

  • mongo:7.0:MongoDB 7.0 官方镜像,想用最新 8.x 可改成 mongo:8。

  • MONGO_INITDB_ROOT_USERNAME / MONGO_INITDB_ROOT_PASSWORD:首次初始化时创建 root 管理账号,务必换强密码。这是开鉴权的关键参数,也是不可逆的源头。

  • 数据卷 ./mongo-data 绑定挂载到容器 /data/db,数据落盘。

  • 端口 27017 是 MongoDB 默认端口。

第 3 步:启动

docker compose up -d

首次启动要初始化数据目录与 root 账号,需要一点时间。看日志:

docker compose logs -f mongodb

看到 Waiting for connections 即就绪。

第 4 步:连接验证

用 docker compose exec 进容器,再用 mongosh 连接。--authenticationDatabase admin 不能省(root 账号建在 admin 库):

docker compose exec mongodb mongosh -u root -p YourStrong!Passw0rd --authenticationDatabase admin

能进入 test> 提示符即连接成功。做一轮读写验证:

db.runCommand({ ping: 1 })

返回 { ok: 1 } 即部署成功。退出用 exit。

(若镜像里没有 mongosh,可改用宿主端 mongosh 或 MongoDB Compass 连接 localhost:27017)

踩坑与解决

1. 连接报 Authentication failed:root 根本没建成,或没指定鉴权库

  • 问题:用 root + 密码连,返回 Authentication failed. 或 MongoServerError: bad auth。

  • 复现:mongosh -u root -p 密码 直接连,报认证失败。

  • 根因:a) 密码输错;b) 首次启动时 MONGO_INITDB_ROOT_USERNAME/PASSWORD 没设对,root 没建成;c) 连接时漏了 --authenticationDatabase admin。

  • 解决:确认 yaml 两个环境变量拼写正确且值非弱密码;连接命令带全 -u root -p <密码> --authenticationDatabase admin。

  • 验证:带对参数后 db.runCommand({ ping: 1 }) 返回 { ok: 1 }。

2. 改了账号密码不生效:初始化只发生一次,不可逆

  • 问题:改完 MONGO_INITDB_ROOT_* 重新 up,连接还是用旧信息,或一直报错。

  • 复现:docker compose up -d 后连不上;日志显示仍在用旧配置。

  • 根因:MONGO_INITDB_ROOT_* 只在首次针对空数据目录初始化时生效。容器已存在或数据卷里已有数据,改参数不会重建账号。这是 MongoDB 与 MySQL 等"每次启动都读环境变量"的中间件最本质的差别。

  • 解决:改完 yaml 要 docker compose down && docker compose up -d 重建;若数据目录里已有初始用户,必须删卷重来——docker compose down -v,或手动清空 mongo-data/,再 up。

  • 验证:重建后 mongosh 用新账号密码能连上。

提示:若不需要任何鉴权(仅本机测试),可不设 MONGO_INITDB_ROOT_USERNAME/PASSWORD,连接时直接 mongosh 即可;但对内网/可被访问的服务务必开鉴权。反过来说,一旦以无鉴权方式跑过并生成了数据目录,再想加鉴权同样只能删卷重来。

3. 容器一启动就退出,日志报 Permission denied

  • 问题:docker compose up -d 后容器秒退,日志见权限错误。

  • 复现:docker compose logs mongodb 看到 Permission denied 或 Unable to create/open lock file。

  • 根因:/data/db 目录权限不对,或容器内 mongod 无权限写入挂载目录(Windows 下常见于挂到受保护目录,或目录没建好)。

  • 解决:确认 ./mongo-data 存在且有写权限;本教程的 yaml 直接绑定 ./mongo-data:/data/db,通常无需额外设置。若仍报错,先 mkdir mongo-data 再重启。

  • 验证:重启后 docker compose logs -f mongodb 出现 Waiting for connections,容器稳定运行。

通用坑(与 SQL Server / MySQL / Redis 篇相同,不再重复展开)

  • 数据丢了:没挂数据卷,容器销毁即丢失。本教程已挂 ./mongo-data:/data/db;写条数据,docker compose down 再 up,集合数据仍在。

  • 端口 27017 被占:报 port is already allocated 或 address already in use。停掉旧的 MongoDB 服务,或改外部端口 27018:27017,连接串跟着改。

  • 容器秒退:先看 docker compose logs mongodb;无非是配置写错、密码不合规或目录权限,逐条对照上面的特有坑。

实操截图

容器运行

ScreenShot_2026-10-29_093501_571.png

工具连接

ScreenShot_2026-10-29_093541_345.png
ScreenShot_2026-10-29_094535_000.png

小结与参考

  • 用 Docker 部署 MongoDB 7.0,本机只留一份 docker-compose.yaml。

  • 开鉴权三件套:MONGO_INITDB_ROOT_USERNAME + MONGO_INITDB_ROOT_PASSWORD + 连接时带 --authenticationDatabase admin。

  • 本篇核心矛盾:账号只在空数据目录首次初始化时创建。改账号、改密码、从无鉴权切到有鉴权,统统要 down -v 删卷重来。

  • 持久化:挂载 ./mongo-data:/data/db,删容器不丢数据。

  • 端口、数据卷这类通用坑同型文章共用,本篇不再展开。

参考:

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

Docker 部署 MongoDB 7.0:开箱即用带持久化与鉴权
/archives/docker-bu-shu-mongodb-7.0-kai-xiang-ji-yong-dai-chi-jiu-hua-yu-jian-quan
作者
隔壁老陈
发布于
2026-10-28
许可协议
CC BY-NC-SA 4.0

评论