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。在实际生产环境中,建议根据具体需求进一步配置副本集、分片集群等高级特性。

相关推荐
u0103055272 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055273 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝4 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055274 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055275 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055277 天前
Java实用类应用精讲
人工智能·1024程序员节
u0103055278 天前
Java I/O核心操作实战
人工智能·1024程序员节
u0103055279 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u0103055279 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节
u01030552710 天前
使用BufferedReader读取控制台输入
人工智能·1024程序员节