【保姆级教程】Docker部署MongoDB,NoSQL文档数据库(最新版)
大家好,我是Goya!
今天是Docker部署系列的第五篇文章:用Docker部署MongoDB。
MongoDB是最流行的NoSQL数据库,以灵活的数据结构和高扩展性著称。如果你处理的数据格式经常变化,或者需要快速迭代开发,MongoDB会是很好的选择。
本篇要点:
-
✅ 一分钟启动MongoDB容器
-
✅ 设置用户名密码(开启认证)
-
✅ 数据持久化到宿主机
-
✅ 配置文件自定义
-
✅ 远程客户端连接(MongoDB Compass)
-
✅ 基本CRUD操作
-
✅ 与MySQL/PostgreSQL的核心区别
一、MongoDB vs 关系型数据库
| 特性 | MongoDB | MySQL/PostgreSQL |
|---|---|---|
| 数据结构 | 文档(JSON-like) | 表格(行和列) |
| Schema | 动态(无模式) | 固定(需预先定义) |
| 关系处理 | 嵌套文档/引用 | 外键/JOIN |
| 扩展方式 | 水平扩展(分片) | 垂直扩展为主 |
| 查询语言 | 面向文档的API | SQL |
| 事务支持 | 4.0+支持多文档事务 | 完善的事务支持 |
| 适用场景 | 日志、内容管理、实时分析 | 金融、ERP、强一致性业务 |
一句话总结: 关系型数据库像Excel表格,MongoDB像JSON文件。如果你的数据像JSON一样灵活多变,用MongoDB就对了!
二、准备工作
2.1 检查Docker环境
docker --version
2.2 拉取MongoDB镜像
我们选择最新的稳定版MongoDB 7.0:
docker pull mongodb/mongodb-community-server:latest
或者用官方镜像:
docker pull mongo:7
查看镜像:
docker images | grep mongo
三、创建挂载目录
在宿主机上创建目录,存放MongoDB的数据和配置:
# 创建数据目录和配置目录
mkdir -p ~/docker/mongodb/{data,config,backup}
目录说明:
- data:存放数据库文件
- config:存放配置文件
- backup:存放备份文件
四、准备配置文件(可选)
创建一个配置文件,设置存储引擎和日志等参数:
vim ~/docker/mongodb/config/mongod.conf
粘贴以下内容:
# mongod.conf
# 存储引擎配置
storage:
dbPath: /data/db
journal:
enabled: true
engine: wiredTiger
# 网络配置
net:
bindIp: 0.0.0.0
port: 27017
# 安全配置(认证)
security:
authorization: enabled
# 日志配置
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
# 进程管理
processManagement:
fork: false
# 性能配置
setParameter:
enableLocalhostAuthBypass: false
配置说明:
- bindIp: 0.0.0.0:允许远程连接
- authorization: enabled:开启认证(需要用户名密码)
- wiredTiger:MongoDB默认存储引擎,性能好
保存退出(:wq)。
五、运行MongoDB容器
5.1 带认证的运行方式(推荐)
docker run -d \
--name mongodb7 \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=123456 \
-v ~/docker/mongodb/data:/data/db \
-v ~/docker/mongodb/config/mongod.conf:/etc/mongo/mongod.conf \
--restart=always \
mongo:7 \
mongod -f /etc/mongo/mongod.conf
命令解释:
| 参数 | 说明 |
|---|---|
-p 27017:27017 | 映射 MongoDB 默认端口 |
-e MONGO_INITDB_ROOT_USERNAME=admin | 设置管理员用户名 |
-e MONGO_INITDB_ROOT_PASSWORD=123456 | 设置管理员密码 |
-v ~/docker/mongodb/data:/data/db | 挂载数据目录 |
-v ~/docker/mongodb/config/mongod.conf:/etc/mongo/mongod.conf | 挂载配置文件 |
mongod -f /etc/mongo/mongod.conf | 指定配置文件启动 |
5.2 不带认证的快速启动(仅测试用)
docker run -d \
--name mongodb7 \
-p 27017:27017 \
-v ~/docker/mongodb/data:/data/db \
--restart=always \
mongo:7
生产环境一定要开启认证! 本文采用第一种带认证的方式。
六、验证部署是否成功
6.1 查看容器状态
docker ps | grep mongodb7
应该能看到mongodb7容器,状态是Up
6.2 查看容器日志
docker logs mongodb7
看到Waiting for connections就说明启动成功了。
6.3 进入容器连接MongoDB
# 进入容器
docker exec -it mongodb7 bash
# 连接MongoDB(需要认证)
mongosh -u admin -p 123456 --authenticationDatabase admin
或者一步到位:
docker exec -it mongodb7 mongosh -u admin -p 123456 --authenticationDatabase admin
6.4 测试MongoDB命令
看到test>提示符后,试试几个基本命令:
// 查看所有数据库
show dbs
// 切换到test数据库
use test
// 插入一条数据
db.users.insertOne({
name: "张三",
age: 28,
email: "zhangsan@example.com",
tags: ["developer", "docker"],
address: {
city: "北京",
street: "朝阳路"
}
})
// 查询数据
db.users.find()
// 美化输出
db.users.find().pretty()
// 条件查询
db.users.find({age: {$gt: 25}})
// 退出
exit
七、测试数据持久化
# 先写入一些数据
docker exec -it mongodb7 mongosh -u admin -p 123456 --authenticationDatabase admin --eval '
use test;
db.products.insertMany([
{name: "手机", price: 2999, stock: 100},
{name: "电脑", price: 5999, stock: 50},
{name: "耳机", price: 299, stock: 200}
]);
db.products.count()
'
# 重启容器
docker restart mongodb7
# 再次查看数据
docker exec -it mongodb7 mongosh -u admin -p 123456 --authenticationDatabase admin --eval '
use test;
db.products.find()
'
如果还能看到数据,说明持久化成功!
八、配置远程连接
8.1 查看服务器IP
curl ifconfig.me
8.2 配置防火墙/安全组
Ubuntu系统(UFW防火墙):
# 开放27017端口
ufw allow 27017/tcp
# 查看防火墙状态
ufw status
云服务器:
1.登录阿里云/腾讯云控制台
2.找到你的实例的安全组
3.添加入方向规则:
-
端口范围:27017
-
授权对象:0.0.0.0/0(或指定你的IP)
-
协议:TCP
**安全警告:**生产环境不要直接开放给所有IP!建议只允许你的办公网络IP访问,或者使用SSH隧道。
九、常用MongoDB命令
// 查看所有数据库
show dbs
// 切换/创建数据库
use mydb
// 查看当前数据库
db
// 查看所有集合
show collections
// 查看集合统计信息
db.users.stats()
// 创建索引
db.users.createIndex({email: 1}, {unique: true})
// 查看索引
db.users.getIndexes()
// 删除索引
db.users.dropIndex("email_1")
// 聚合查询(分组统计)
db.orders.aggregate([
{$group: {_id: "$product", total: {$sum: "$quantity"}}}
])
十、Docker操作MongoDB
# 停止容器
docker stop mongodb7
# 启动容器
docker start mongodb7
# 重启容器
docker restart mongodb7
# 查看实时日志
docker logs -f mongodb7
# 进入容器
docker exec -it mongodb7 bash
# 执行MongoDB命令(一行命令)
docker exec -it mongodb7 mongosh -u admin -p 123456 --authenticationDatabase admin --eval "show dbs"
# 备份数据库
docker exec -it mongodb7 mongodump -u admin -p 123456 --authenticationDatabase admin --out /backup
# 复制备份到宿主机
docker cp mongodb7:/backup ~/docker/mongodb/backup/
# 恢复数据库
docker cp ~/docker/mongodb/backup mongodb7:/
docker exec -it mongodb7 mongorestore -u admin -p 123456 --authenticationDatabase admin /backup
# 删除容器(数据还在)
docker rm -f mongodb7
十一、常见问题排查
Q1:连接失败 “Authentication failed”
# 检查用户名密码
docker exec -it mongodb7 mongosh -u admin -p 123456 --authenticationDatabase admin --eval "db.runCommand({connectionStatus: 1})"
Q2:连接失败 “Connection refused”
# 检查容器是否运行
docker ps | grep mongo
# 检查端口监听
netstat -tlnp | grep 27017
# 检查防火墙
ufw status
Q3:远程连接不上,但本地可以
# 进入容器查看配置
docker exec -it mongodb7 bash
cat /etc/mongo/mongod.conf | grep bindIp
# 应该看到 bindIp: 0.0.0.0
Q4:数据丢了?
# 检查数据卷挂载
docker inspect mongodb7 | grep -A 10 Mounts
# 查看数据目录
ls -la ~/docker/mongodb/data/
Q5:性能慢?
# 查看慢查询
db.setProfilingLevel(1, 100) # 记录超过100ms的查询
db.system.profile.find().pretty()
十二、总结
通过本文,我们在服务器上成功实现了:
| 功能 | 实现方式 | 验证方法 |
|---|---|---|
| ✅ Docker部署MongoDB | docker run | docker ps 查看容器 |
| ✅ 开启认证 | 环境变量+配置文件 | 需要密码才能登录 |
| ✅ 数据持久化 | 数据卷挂载 | 重启后数据还在 |
| ✅ 配置文件自定义 | 挂载mongod.conf | 查看配置是否生效 |
| ✅ 远程连接 | 端口映射+防火墙 | MongoDB Compass连接 |
| ✅ 基本CRUD | mongosh命令 | 增删改查测试 |
| ✅ 初始化脚本 | js脚本自动执行 | 预置数据存在 |
MongoDB是NoSQL数据库的代表,掌握了它,你就掌握了非关系型数据库的核心思想。
搞定! 🎯 现在你的服务器上有了:
-
✅ MySQL(关系型数据库)
-
✅ Redis(缓存)
-
✅ Nginx(Web服务器)
-
✅ PostgreSQL(另一个关系型数据库)+ pgAdmin
-
✅ MongoDB(NoSQL文档数据库)
如果本文对你有帮助,欢迎点赞、收藏、评论!
更多推荐
所有评论(0)