Mongodb 是最像关系型数据库的 NoSql 数据库,其数据类型非常丰富,数据结构松散,采用类似 Json 的 Bson 二进制格式存储数据,还支持对索引功能。主要应用在数据量大、读多写少或者读写都比较频繁、数据价值较低的场景中,如果社交平台的点赞和评论、游戏、物流信息和轨迹存储等。
由于在企业中,无论是开发环境还是生产环境,基本上都采用 Docker 或其它容器化技术部署中间件,因此这里也只是介绍使用 Docker 和 DockerCompose 部署 Mongodb,毕竟采用容器化部署中间件非常方便快速,不存在环境兼容性,省去了很多不必要的麻烦,开发人员也很容易掌握。
我的 CentOS7 的虚拟机地址为:192.168.136.128 ,已经安装过了 Docker 和 DockerCompose,在此虚拟机上演示。
Mongodb 的中文官网地址:https://www.mongodb.com/zh-cn
一、使用 Docker 部署
对于 docker 的 mongodb 镜像中,其数据存放目录在 /data/db 中,日志的存放目录为 /var/log/mongodb 中,配置文件存放路径为 /etc/mongod.conf,因此我们首先要在宿主机的 CentOS7 上创建好对应的目录或文件。
# 创建宿主机用于存放数据的目录
mkdir -p /app/mongo/data
# 创建宿主机用于存放日志的目录
mkdir -p /app/mongo/logs
# 创建 mongodb 的配置文件,用于映射 docker 镜像内的配置文件
vim /app/mongo/mongod.conf
将以下配置内容,放置到 mongod.conf 中
systemLog:
# MongoDB发送所有日志输出的目标指定为文件
destination: file
# mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/var/log/mongodb/mongodb.log"
# 当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
# mongod实例存储其数据的目录。
dbPath: "/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
net:
# 服务实例绑定的IP,默认是localhost(多个ip用逗号分隔)
bindIp: 0.0.0.0
#绑定的端口,默认是27017
port: 27017
注意:上面的配置文件中配置的数据和日志存放目录,是 Docker 镜像内部的路径。
然后运行命令,下载最新的 mongodb 的 docker 镜像并启动容器:
# 由于命令太长,为了方便阅读,采用反斜线(\)换行
docker run --name mymongo -p 27017:27017 \
-v /app/mongo/data:/data/db \
-v /app/mongo/logs:/var/log/mongodb \
-v /app/mongo/mongod.conf:/etc/mongod.conf \
-d mongo --auth
由于 mongodb 默认情况下,不需要用户名密码就可以使用,使用 --auth 参数表示需要用户名和密码登录。因此我们就必须进入到 mongodb 的容器内部创建一个用户,这里准备创建一个权限很大的用户,方便后续的使用和各种操作。
# 查看容器列表,找到 mongodb 的容器 id
docker ps
# 我的虚拟机中 mongodb 容器的 id 为 93e457219920
# 进入容器中
docker exec -it 93e457219920 bash
# 使用 mongo 命令进入 admin 库中
mongo admin
# 在 mongodb 的 shell 中,创建一个超级用户
db.createUser({user:'root',pwd:'root',roles:[{role:'root',db:'admin'}]})
# mongodb 的 admin 库里面是专门存放 mongodb 用户的,
# 以下是 mongodb 内置的角色,我这里基于 admin 库创建了一个 root 角色的用户,拥有最高权限
# Read:允许用户读取指定数据库
# readWrite:允许用户读写指定数据库
# dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
# userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
# clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
# readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
# readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
# userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
# dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
# root:只在admin数据库中可用。超级账号,超级权限
备注:给 mongodb 创建用户时,用户名和密码可以随便指定,这里设置的用户名和密码都是 root,指定的角色也是 root
由于 mongodb 的用户是存储在 admin 库中,因此重启 mongodb 的 docker 容器,用户信息也不会丢失
OK,经过以上过程,docker 部署 mongodb 就完成了,下面我们可以检验以下成果。
目前高版本的 Navicat 已经支持连接 Mongodb ,我使用的 Navicat 的版本是 16,如下图新建 mongodb 的连接。
我的虚拟机 ip 是 192.168.136.128,连接 admin 库,端口是 27017,用户名和密码都输入 root ,然后点击测试连接。
测试连接没问题后,点击确定即可,打开如下界面,发现 mongodb 下没有任何数据库,这很正常。
我们可以新建一个 mongodb 的数据库,比如 mytest 数据库。
创建后的 mytest 数据库如下图所示:
二、使用 DockerCompose 部署
由于我是在同一台虚拟机进行部署 mongodb ,为了区分,这次换个部署的目录,这次放在 root 目录下
# 创建宿主机用于存放数据的目录
mkdir -p /root/mongo/data
# 创建宿主机用于存放日志的目录
mkdir -p /root/mongo/logs
# 创建 mongodb 的配置文件,用于映射 docker 镜像内的配置文件
vim /root/mongo/mongod.conf
mongo.conf 配置文件的内容,跟上面 docker 部署时的配置文件内容一致,这里省略。
# 对于 dockercompose 来说,其默认的配置文件名称为 docker-compose.yml
# 因此在创建一个 docker-compose.yml 配置文件
vim /root/mongo/docker-compose.yml
将以下内容,填写到 docker-compose.yml 文件中:
version: '3.9'
services:
# 服务名称为 mongodb,该名称主要用于容器之间服务的 dns 解析
mongodb:
# 容器的名称为 mymongo
container_name: mymongo
# 使用的镜像名称
image: mongo:latest
# 对外暴露的端口
ports:
- "27017:27017"
# 当 docker 服务启动后,自动启动 mongodb 容器
restart: always
# 增加启动参数,--auth,表示连接 mongodb 需要用户名和密码
command:
- "--auth"
# 宿主机硬盘目录映射容器内的路径
volumes:
- /root/mongo/data:/data/db
- /root/mongo/logs:/var/log/mongodb
- /root/mongo/mongod.conf:/etc/mongod.conf
然后进入到 docker-compose.yml 文件所在的目录,指定 up 命令即可
# 进入 docker-compose.yml 文件所在的目录
cd /root/mongo/
# 通过 docker-compose 启动 mongodb 容器
docker-compose up -d
接下来的操作,跟上面的 docker 部署 mongodb 的操作一样,需要进入到容器内部,创建一个超级用户。
# 通过 docker ps 命令,查到容器的 id
# 这里查询到的 id 为 34e6ddb4aac9
docker ps
# 进入容器中
docker exec -it 34e6ddb4aac9 bash
# 使用 mongo 命令进入 admin 库中
mongo admin
# 在 mongodb 的 shell 中,创建一个超级用户
# 为了区分,这里创建一个名称为 jobs 的超级用户
db.createUser({user:'jobs',pwd:'123456',roles:[{role:'root',db:'admin'}]})
最后通过 navicat 创建一个 mongodb 连接 admin 库的连接,然后测试是否可以连接成功,如下图
以上就是本篇博客有关使用 docker 和 docker-compose 部署 mongodb 的介绍,总体非常简单。
启动 mongodb 时,如果不加 --auth 参数时,默认情况下连接是不需要用户密码的,在开发环境还可以,但是生产环境肯定不行。
如果增加了 --auth 参数,但是由于 mongodb 部署后没有用户,因此需要进入到容器中,到 admin 库中添加一个用户才行。
新添加的用户保存在 admin 库中,而 mongodb 的数据库文件已经映射存储到宿主机的磁盘中,所以后续每次重启 mongodb 的容器,以及销毁了容器,重新创建了新的容器,都不受影响。
有关 mongodb 的操作命令,就不再介绍了,后续会介绍 Java 程序如何通过 SpringData 操作 mongodb 进行增删改查。