Docker 部署 MongoDB 7.0:开箱即用带持久化与鉴权
背景与目标
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;无非是配置写错、密码不合规或目录权限,逐条对照上面的特有坑。
实操截图
容器运行

工具连接


小结与参考
用 Docker 部署 MongoDB 7.0,本机只留一份
docker-compose.yaml。开鉴权三件套:
MONGO_INITDB_ROOT_USERNAME+MONGO_INITDB_ROOT_PASSWORD+ 连接时带--authenticationDatabase admin。本篇核心矛盾:账号只在空数据目录首次初始化时创建。改账号、改密码、从无鉴权切到有鉴权,统统要
down -v删卷重来。持久化:挂载
./mongo-data:/data/db,删容器不丢数据。端口、数据卷这类通用坑同型文章共用,本篇不再展开。
参考:
镜像:
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mongo:7.0MongoDB 官方文档:https://www.mongodb.com/docs/
mongosh 参考:https://www.mongodb.com/docs/mongodb-shell/

