Docker 安装 MongoDB 完整指南:从入门到实战
前言
在当今的软件开发中,容器化技术已经成为不可或缺的一部分。Docker 作为容器化的代表,让应用的部署和管理变得前所未有的简单。对于数据库而言,使用 Docker 可以快速创建隔离的环境,避免复杂的安装配置过程。本文将详细介绍如何使用 Docker 安装和配置 MongoDB。
什么是 MongoDB?
MongoDB 是一个流行的开源 NoSQL 数据库,采用文档型数据存储模式,具有高性能、高可用性和易扩展等特点。它使用类似 JSON 的 BSON 格式存储数据,非常适合现代 Web 应用开发。
环境准备
在开始之前,请确保您的系统已经安装了 Docker:
bash
# 检查 Docker 是否安装 docker --version# 检查 Docker 服务状态 docker info
如果尚未安装 Docker,请参考 官方文档 进行安装。
安装 MongoDB
1. 拉取 MongoDB 镜像
首先,我们从 Docker Hub 拉取官方的 MongoDB 镜像:
bash
# 拉取最新版本的 MongoDB docker pull mongo:latest# 或者拉取特定版本(推荐) docker pull mongo:6.0# 查看已下载的镜像 docker images
2. 运行 MongoDB 容器
基础运行方式
bash
# 最简单的运行方式 docker run -d --name mongodb -p 27017:27017 mongo:latest
这个命令会:
-
-d:在后台运行容器 -
--name mongodb:为容器指定名称 -
-p 27017:27017:将容器的 27017 端口映射到主机的 27017 端口
推荐的生产环境配置
bash
# 创建数据持久化目录 mkdir -p /home/docker/mongodb/data mkdir -p /home/docker/mongodb/log# 运行 MongoDB 容器(推荐配置) docker run -d \--name mongodb \--restart always \-p 27017:27017 \-v /home/docker/mongodb/data:/data/db \-v /home/docker/mongodb/log:/var/log/mongodb \-e MONGO_INITDB_ROOT_USERNAME=admin \-e MONGO_INITDB_ROOT_PASSWORD=123456 \mongo:latest
参数说明:
-
--restart always:容器退出时自动重启 -
-v:挂载数据卷,实现数据持久化 -
-e:设置环境变量,这里设置了管理员账号和密码
3. 验证安装
检查容器是否正常运行:
bash
# 查看容器状态 docker ps# 查看容器日志 docker logs mongodb
如果看到类似下面的输出,说明 MongoDB 已经成功启动:
text
{"t":{"$date":"2023-07-01T10:00:00.000+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
连接 MongoDB
1. 使用命令行连接
bash
# 进入容器内部的 MongoDB Shell docker exec -it mongodb mongosh# 或者使用认证方式连接 docker exec -it mongodb mongosh -u admin -p 123456 --authenticationDatabase admin
2. 使用 GUI 工具连接
推荐使用 MongoDB Compass 或 NoSQLBooster 等图形化工具连接:
-
连接地址:
localhost:27017 -
认证数据库:
admin -
用户名:
admin -
密码:
123456
3. 基本操作测试
在 MongoDB Shell 中尝试以下操作:
javascript
// 显示数据库
show dbs// 切换到 admin 数据库
use admin// 创建新数据库
use myapp// 创建集合并插入数据
db.users.insertOne({name: "张三",age: 25,email: "zhangsan@example.com",created_at: new Date()
})// 查询数据
db.users.find()// 创建索引
db.users.createIndex({ email: 1 }, { unique: true })
高级配置
1. 使用 Docker Compose 部署
创建 docker-compose.yml 文件:
yaml
version: '3.8'services:mongodb:image: mongo:6.0container_name: mongodbrestart: alwaysports:- "27017:27017"environment:MONGO_INITDB_ROOT_USERNAME: adminMONGO_INITDB_ROOT_PASSWORD: 123456MONGO_INITDB_DATABASE: myappvolumes:- ./data/db:/data/db- ./data/log:/var/log/mongodb- ./init:/docker-entrypoint-initdb.dnetworks:- mongo-networkmongo-express:image: mongo-expresscontainer_name: mongo-expressrestart: alwaysports:- "8081:8081"environment:ME_CONFIG_MONGODB_ADMINUSERNAME: adminME_CONFIG_MONGODB_ADMINPASSWORD: 123456ME_CONFIG_MONGODB_URL: mongodb://admin:123456@mongodb:27017/networks:- mongo-networknetworks:mongo-network:driver: bridge
启动服务:
bash
# 启动服务 docker-compose up -d# 查看服务状态 docker-compose ps# 停止服务 docker-compose down
2. 初始化脚本
创建初始化脚本 init/init.js:
javascript
// 初始化数据库和用户
db = db.getSiblingDB('myapp');// 创建应用专用用户
db.createUser({user: 'appuser',pwd: 'apppassword',roles: [{role: 'readWrite',db: 'myapp'}]
});// 创建示例集合和数据
db.products.insertMany([{name: '笔记本电脑',price: 5999,category: '电子产品',in_stock: true,created_at: new Date()},{name: '无线鼠标',price: 129,category: '电子产品',in_stock: true,created_at: new Date()}
]);// 创建索引
db.products.createIndex({ name: 1 });
db.products.createIndex({ category: 1, price: 1 });
3. 配置文件挂载
创建自定义配置文件 mongod.conf:
yaml
# MongoDB 配置文件 storage:dbPath: /data/dbjournal:enabled: truesystemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.lognet:port: 27017bindIp: 0.0.0.0security:authorization: enabled
更新 docker-compose.yml 挂载配置文件:
yaml
volumes:- ./data/db:/data/db- ./data/log:/var/log/mongodb- ./mongod.conf:/etc/mongod.conf- ./init:/docker-entrypoint-initdb.dcommand: ["--config", "/etc/mongod.conf"]
数据备份与恢复
1. 备份数据库
bash
# 备份单个数据库 docker exec mongodb mongodump -u admin -p 123456 --authenticationDatabase admin --db myapp --out /backup/$(date +%Y%m%d)# 备份所有数据库 docker exec mongodb mongodump -u admin -p 123456 --authenticationDatabase admin --out /backup/full_backup_$(date +%Y%m%d)# 将备份文件从容器复制到主机 docker cp mongodb:/backup ./backup
2. 恢复数据库
bash
# 将备份文件复制到容器 docker cp ./backup/full_backup_20230701 mongodb:/backup/# 恢复数据库 docker exec mongodb mongorestore -u admin -p 123456 --authenticationDatabase admin /backup/full_backup_20230701
常见问题排查
1. 连接失败
bash
# 检查容器状态 docker ps -a# 查看容器日志 docker logs mongodb# 检查端口占用 netstat -tulpn | grep 27017# 进入容器检查服务 docker exec -it mongodb bash mongosh -u admin -p 123456
2. 权限问题
bash
# 如果没有设置认证,可以临时进入容器修改
docker exec -it mongodb mongosh# 在 MongoDB Shell 中创建用户
use admin
db.createUser({user: 'admin',pwd: '123456',roles: ['root']
})
3. 数据持久化问题
bash
# 检查卷挂载 docker volume ls# 检查数据目录权限 ls -la /home/docker/mongodb/data# 备份重要数据后再进行操作
最佳实践建议
-
安全配置
-
始终启用认证
-
使用强密码
-
限制网络访问
-
定期更新镜像版本
-
-
性能优化
-
为数据目录使用 SSD 存储
-
适当配置内存限制
-
使用副本集提高可用性
-
-
监控维护
-
定期备份数据
-
监控日志文件
-
设置资源使用限制
-
总结
通过 Docker 安装 MongoDB 不仅简化了部署过程,还提供了良好的环境隔离和数据持久化方案。本文介绍了从基础安装到生产环境配置的完整流程,包括:
-
MongoDB 镜像的拉取和容器运行
-
数据持久化和权限配置
-
Docker Compose 编排部署
-
数据备份恢复策略
-
常见问题排查方法
希望这篇指南能帮助您快速上手使用 Docker 部署 MongoDB。在实际生产环境中,建议根据具体需求进一步配置副本集、分片集群等高级特性。
