前言
在当今的软件开发中,容器化技术已经成为不可或缺的一部分。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.0
container_name: mongodb
restart: always
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: 123456
MONGO_INITDB_DATABASE: myapp
volumes:
- ./data/db:/data/db
- ./data/log:/var/log/mongodb
- ./init:/docker-entrypoint-initdb.d
networks:
- mongo-network
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always
ports:
- "8081:8081"
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: admin
ME_CONFIG_MONGODB_ADMINPASSWORD: 123456
ME_CONFIG_MONGODB_URL: mongodb://admin:123456@mongodb:27017/
networks:
- mongo-network
networks:
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/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
port: 27017
bindIp: 0.0.0.0
security:
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.d
command: ["--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。在实际生产环境中,建议根据具体需求进一步配置副本集、分片集群等高级特性。