大家好,我是Goya!

今天是Docker部署系列的第五篇文章:用Docker部署MongoDB。

MongoDB是最流行的NoSQL数据库,以灵活的数据结构高扩展性著称。如果你处理的数据格式经常变化,或者需要快速迭代开发,MongoDB会是很好的选择。
本篇要点:

  • ✅ 一分钟启动MongoDB容器

  • ✅ 设置用户名密码(开启认证)

  • ✅ 数据持久化到宿主机

  • ✅ 配置文件自定义

  • ✅ 远程客户端连接(MongoDB Compass)

  • ✅ 基本CRUD操作

  • ✅ 与MySQL/PostgreSQL的核心区别

一、MongoDB vs 关系型数据库

特性MongoDBMySQL/PostgreSQL
数据结构文档(JSON-like)表格(行和列)
Schema动态(无模式)固定(需预先定义)
关系处理嵌套文档/引用外键/JOIN
扩展方式水平扩展(分片)垂直扩展为主
查询语言面向文档的APISQL
事务支持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部署MongoDBdocker rundocker ps 查看容器
✅ 开启认证环境变量+配置文件需要密码才能登录
✅ 数据持久化数据卷挂载重启后数据还在
✅ 配置文件自定义挂载mongod.conf查看配置是否生效
✅ 远程连接端口映射+防火墙MongoDB Compass连接
✅ 基本CRUDmongosh命令增删改查测试
✅ 初始化脚本js脚本自动执行预置数据存在

MongoDB是NoSQL数据库的代表,掌握了它,你就掌握了非关系型数据库的核心思想。

搞定! 🎯 现在你的服务器上有了:

  • ✅ MySQL(关系型数据库)

  • ✅ Redis(缓存)

  • ✅ Nginx(Web服务器)

  • ✅ PostgreSQL(另一个关系型数据库)+ pgAdmin

  • ✅ MongoDB(NoSQL文档数据库)

如果本文对你有帮助,欢迎点赞、收藏、评论!

更多推荐