Docker环境部署MongoDB服务
1 ) 获取与验证官方镜像
bash
docker pull mongo:4.0 # 获取指定版本镜像
docker images # 验证镜像下载状态
2 ) 启动容器与数据持久化配置
bash
docker run --name mymongo -v /mongodb/data:/data/db -d mongo:4.0
- 关键参数解析:
--name mymongo:定义容器标识名称-v /mongodb/data:/data/db:宿主机目录映射至容器内默认数据存储路径-d:后台运行模式- 默认服务端口:27017
3 ) 服务状态验证
bash
docker ps -f name=mymongo # 检查容器运行状态
docker logs mymongo # 查看实时服务日志
- 日志包含启动参数与运行状态信息
MongoDB管理工具集成
1 ) MongoExpress可视化控制台
bash
docker pull mongo-express
docker run --link mymongo:mongo -p 8081:8081 -d mongo-express
- 网络连接说明:
--link:建立容器间通信通道-p 8081:8081:暴露Web访问端口- 访问地址:http://localhost:8081
2 ) MongoDB系统数据库说明
| 数据库名 | 用途 | 操作建议 |
|---|---|---|
| admin | 管理员账户及权限配置 | 禁止随意修改 |
| config | 分片集群配置信息 | 禁止随意修改 |
| local | 副本集元数据存储 | 禁止随意修改 |
3 ) 文档结构示例解析
json
{
"_id": ObjectId("5f9d1a2b3c4d5e6f7a8b9c0d"),
"hostname": "mymongo",
"startTime": ISODate("2023-10-01T08:00:00Z"),
"startVersion": "4.0.28"
}
- 核心字段:
_id:文档主键(BSON ObjectId格式)(12字节ObjectId)- 系统集合命名规范:
<database>.<collection> - 时间类型:ISODate存储时间戳
Mongo Shell操作指南
1 ) 交互式客户端连接
bash
docker exec -it mymongo mongo # 进入容器启动Shell
2 ) 基础操作命令
javascript
> show dbs // 显示所有数据库
> use local // 切换数据库
> db.startup_log.find().limit(1) // 查询文档
> db.version() // 获取数据库版本
> exit // 退出会话
3 )更多操作示例
javascript
> show dbs // 显示数据库列表
> use testdb // 创建/切换数据库
> db.createCollection("users") // 创建集合
> db.users.insertOne({ // 插入文档
name: "Alice",
role: "admin",
created: new Date()
})
> db.users.find().pretty() // 格式化查询
4 )进阶查询操作
bash
// 条件查询
> db.users.find({ role: "admin" })
// 聚合统计
> db.orders.aggregate([
{ $group: { _id: "$status", total: { $sum: 1 } }}
])
// 索引创建
> db.users.createIndex({ email: 1 }, { unique: true })
5 ) 进阶数据操作
bash
// 创建应用数据库
> use myappdb
// 插入文档
> db.users.insertOne({name: "Alice", role: "admin"})
// 条件查询
> db.users.find({role: "admin"}).pretty()
关键技术解析与优化
1 ) 数据持久化机制
- 实现原理:通过
-v参数将宿主机目录映射至容器内路径 - 效果:容器销毁后数据仍保留在宿主机
- 路径规范:
- 容器内路径:
/data/db(MongoDB默认存储) - 宿主机路径:自定义持久化目录(如
/mongodb/data)
- 容器内路径:
2 ) 容器网络优化方案
容器网络连接示意图
8081端口 容器互联 MongoExpress Docker网络 MongoDB
bash
创建自定义网络(替代--link)
docker network create mongo-net
容器加入同一网络
docker run --name mymongo --network mongo-net -v /mongodb/data:/data/db -d mongo:4.0
docker run --name myexpress --network mongo-net -p 8081:8081 -d mongo-express
3 ) 文档数据库核心特性
- 数据格式:BSON(Binary JSON)
- 无模式设计:集合无需预定义结构
- 主键约束:
_id字段为必选唯一标识
4 ) 生产环境安全配置
bash
docker run --name mymongo -v /mongodb/data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
-d mongo:4.0 --replSet rs0 --auth
- 关键安全措施:
- 启用认证(
--auth参数) - 配置副本集(
--replSet)(高可用) - 环境变量注入管理员凭证
- 启用认证(
NestJS集成示例
TypeScript-MongoDB集成
ts
// app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
@Module({
imports: [
MongooseModule.forRoot('mongodb://localhost:27017/myapp', {
useNewUrlParser: true,
useUnifiedTopology: true
})
],
})
export class AppModule {}
TypeScript-数据模型定义
typescript
// user.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
@Schema()
export class User extends Document {
@Prop({ required: true })
name: string;
@Prop({ default: 'user' })
role: string;
}
export const UserSchema = SchemaFactory.createForClass(User);
文档型数据库核心特性
- BSON存储格式:
- 二进制JSON扩展
- 支持Date/Binary等特殊类型
- 动态模式:
- 集合无需预定义结构
- 文档字段可动态增删
- 分布式架构:
- 分片集群横向扩展
- 副本集高可用保障
- 索引机制:
- 支持单字段/复合/全文索引
- 地理空间索引优化位置查询