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

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

移动端开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值