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.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

# 备份重要数据后再进行操作

最佳实践建议

  1. 安全配置

    • 始终启用认证

    • 使用强密码

    • 限制网络访问

    • 定期更新镜像版本

  2. 性能优化

    • 为数据目录使用 SSD 存储

    • 适当配置内存限制

    • 使用副本集提高可用性

  3. 监控维护

    • 定期备份数据

    • 监控日志文件

    • 设置资源使用限制

总结

通过 Docker 安装 MongoDB 不仅简化了部署过程,还提供了良好的环境隔离和数据持久化方案。本文介绍了从基础安装到生产环境配置的完整流程,包括:

  • MongoDB 镜像的拉取和容器运行

  • 数据持久化和权限配置

  • Docker Compose 编排部署

  • 数据备份恢复策略

  • 常见问题排查方法

希望这篇指南能帮助您快速上手使用 Docker 部署 MongoDB。在实际生产环境中,建议根据具体需求进一步配置副本集、分片集群等高级特性。

相关推荐
爱怪笑的小杰杰15 小时前
Cesium中的倒立四棱锥:从几何结构到交互式3D可视化
javascript·3d·arcgis·1024程序员节
Brookty15 小时前
【算法】前缀和(二)使用
java·学习·算法·前缀和·动态规划·1024程序员节
兜兜风d'15 小时前
基于 Spring Boot + RabbitMQ 实现应用通信
spring boot·rabbitmq·java-rabbitmq·1024程序员节
小范同学_15 小时前
Spring集成WebSocket
java·spring boot·websocket·spring·1024程序员节
进击的圆儿15 小时前
网络编程实战02·从零搭建Epoll服务器
1024程序员节
计算衎15 小时前
Jenkins上实现CI集成软件信息Teams群通知案例实现。
python·jenkins·1024程序员节·microsoft azure·teams消息群通知·微软 graph api
爱看老照片15 小时前
计算机端口
1024程序员节
go_bai15 小时前
Linux_基础IO(2)
linux·开发语言·经验分享·笔记·学习方法·1024程序员节
西部森林牧歌15 小时前
拒绝笨重,一款轻量、极致简洁的开源CI/CD工具 - Arbess
1024程序员节·cicd·tiklab·arbess