版本说明

当前版本的MongoDB使用相关的中间件对应的版本如下:

中间件名称 版本号
mongo 5.0.5

中间件对应镜像

Mongo

MongoDB的官方Docker镜像,更新速度很快,镜像地址:

Docker Hub

并且官方出了N个同一版本的不同镜像,这里我们选择最新版本的镜像(不选latest,点进去看对应的dockfile内容里面mongo版本,然后查找对应版本的镜像,方便做版本管理,当前docker最新版本是5.0.5)

  1. docker pull mongo:5.0.5;

等镜像拉取完毕以后,我们开始运行MongoDB容器,这里需要注意的是,MongoDB官方的文档说明,3.5.X版本以后的配置文件都是yaml格式,文档地址:

https://docs.mongodb.com/manual/reference/configuration-options/#configuration-file

里面有所有的yaml配置文件的核心配置说明,但是,当我们将一个基础的yml配置放上去的时候,无法正确的将数据存储进去,导致mongo容器意外关闭,因此改为旧版本的conf配置方式,才启动成功,yaml配置如下:

  1. # mongod.conf
  2. systemLog:
  3. destination: file
  4. path: /var/log/mongodb/mongod.log
  5. logAppend: true
  6. # Where and how to store data.
  7. storage:
  8. #mongo数据库存储的目录,默认就是/data/db
  9. dbPath: /data/db
  10. journal:
  11. enabled: true
  12. # engine:
  13. # wiredTiger:
  14. # how the process runs
  15. processManagement:
  16. #fork: true # fork and run in background
  17. pidFilePath: /var/run/mongodb/mongod.pid
  18. # network interfaces
  19. net:
  20. #启动端口
  21. port: 27017
  22. #绑定的ip,如果不拦截ip,开放所有远程设备都可以访问,可以改为0.0.0.0
  23. bindIp: 0.0.0.0
  24. #security:
  25. security:
  26. #是否开启用户必须经过认证才能访问对应数据库,默认:disabled(不开启)
  27. authorization: enabled
  28. #operationProfiling:
  29. #replication:

而conf方式的配置文件(mongo旧版本的配置2.6及以前的版本),我们需要配置成这样:

  1. # 数据库文件存储位置
  2. dbpath = /data/db
  3. # log文件存储位置
  4. logpath = /var/log/mongodb/mongod.log
  5. # 使用追加的方式写日志
  6. logappend = true
  7. # 是否以守护进程方式运行
  8. # fork = true
  9. # 全部ip可以访问
  10. bind_ip = 0.0.0.0
  11. # 端口号
  12. port = 27017
  13. # 是否启用认证
  14. auth = true
  15. # 设置oplog的大小(MB)
  16. oplogSize=2048
  17. #pid的存储路径
  18. pidfilepath= /var/run/mongodb/mongod.pid

yaml配置文件的参数可以直接参考官方文档:

https://docs.mongodb.com/manual/reference/configuration-options/#processmanagement-options

而properties格式的配置文件,从2.6版本开始就已经弃用了,改为yaml格式了,如果需要查找对应配置,官方能查找的最新旧版本文档,只能是2.4版本的:

Configuration File Options — MongoDB Manual

创建目录,启动容器

docker镜像下载完毕以后,我们需要在宿主机中创建对应目录,映射到docker容器中,需要注意的是,这里的配置文件,我们指定了三个路径,分别是存放数据库文件的,存放log日志的,存放启动进程id文件的,因此,我们需要在宿主机创建对应三个目录,同时在config目录下创建刚刚的conf配置文件,这里需要注意的是,docker启动的容器,不要将fork参数设置为true,否则在初始化完成以后,会出现关闭mongo容器的情况,如果我们是手动在linux上构建mongo,没有使用官方的init脚本的话,是允许开启fork的,否则是不建议开启fork,尤其是当前属于docker启动,默认使用的是系统的init启动脚本,因此不要开启fork参数,这一点在新版本的文档中有说明:

  1. The Linux package init scripts do not expect processManagement.fork to change from the defaults. If you use the Linux packages and change processManagement.fork, you will have to use your own init scripts and disable the built-in scripts

接着我们需要创建docker对应的目录,用于存放yml配置文件,以及db的存储目录,log的目录,以及pid的目录:

  1. mkdir -p /home/docker/mongo/{config,data,log,run};
  2. cd /home/docker/mongo;
  3. vim config/mongod.conf;
  4. #将上面的yml配置copy进来,注意fork参数不开启,默认就是false禁止的

文件创建完毕以后,我们需要将刚刚的几个文件夹设置操作权限,这里为了方便,直接将/home/docker及其子目录全部开放777权限:

  1. chmod 777 -R /home/docker;

接着我们就需要启动docker容器,参考官方docker镜像文档中的内容,其中我们可以在容器启动的时候,传入MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD参数,用于覆盖和初始化指定一个超级管理员账号,如果没有传这两个参数,则还是先不开启认证,进入mongo以后,创建用户以后,重新启动容器,再去开启认证参数,这里建议直接在启动容器的时候指定超管用户信息,通过该用户再去创建业务系统的用户信息,同时官方文档也有说明,默认情况下docker容器启动是不会使用配置文件的,因此,我们如果想要使用配置文件,需要先将配置文件的目录挂载到docker容器目录下,然后在run命令结尾添加

--config /${path}/mongod.conf指定配置文件,所以我们启动的完整命令应该如下:

  1. docker run -d --name mongo-dev -p 27017:27017 \
  2. -v /home/docker/mongo/data:/data/db \
  3. -v /home/docker/mongo/log:/var/log/mongodb \
  4. -v /home/docker/mongo/run:/var/run/mongodb \
  5. -v /home/docker/mongo/config:/etc/mongo \
  6. -e MONGO_INITDB_ROOT_USERNAME="hearyou" \
  7. -e MONGO_INITDB_ROOT_PASSWORD="hearyou2021" \
  8. mongo:5.0.5 --config /etc/mongo/mongod.conf

这个时候我们去查看log,发现没有异常,并且查看docker进程,也是启动状态,说明此时docker容器已经启动成功:

  1. docker ps|grep mongo-dev;
  2. docker logs mongo-dev;

这个时候我们就可以使用mongo客户端进行连接,然后创建对应的业务系统的用户,这里我们进入容器中创建:

  1. docker exec -it mongo-dev bash;
  2. mongo --host 127.0.0.1 --port 27017 -u hearyou -p hearyou2021 --authenticationDatabase admin;

或者合在一起,一步到位:

  1. docker exec -it mongo-dev mongo --host 127.0.0.1 --port 27017 -u hearyou -p hearyou2021 --authenticationDatabase admin

接着我们创建一个管理员账号和一个业务系统账号:

  1. use admin;
  2. db.createUser({ user: 'admin', pwd: 'hearyou2021', roles: [ { role: "userAdminAnyDatabase", db: "admin"}]});
  3. db.auth('admin','hearyou2021');
  4. db.createUser({ user: "ihap-dev", pwd: "123456", roles: [{ role: "readWriteAnyDatabase", db: "admin" },{ role: "dbOwner", db: "ihap_dev"}]});
  5. db.auth('ihap-dev','123456');

至此,MongoDb基本搭建完成,可以正式使用了

附:mongo内置角色

  1. 内建角色:
  2. 数据库用户角色:readreadWrite
  3. 数据库管理角色:dbAdmindbOwneruserAdmin
  4. 集群管理角色: clusterAdminclusterManagerclusterMonitorhostManager
  5. 备份恢复角色: backuprestore
  6. 所有数据库角色:readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabase
  7. 超级用户角色: root 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner userAdminuserAdminAnyDatabase
  8. 内部角色: __system
  9. 角色说明:
  10. Read 允许用户读取指定数据库
  11. readWrite 允许用户读写指定数据库
  12. dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
  13. userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
  14. dbOwner 允许在当前DB中执行任意操作
  15. readAnyDatabase 赋予用户所有数据库的读权限,只在admin数据库中可用
  16. readWriteAnyDatabase 赋予用户所有数据库的读写权限,只在admin数据库中可用
  17. userAdminAnyDatabase:赋予用户所有数据库管理User的权限,只在admin数据库中可用
  18. dbAdminAnyDatabase 赋予管理所有数据库的权限,只在admin数据库中可用
  19. root 超级账号,超级权限,只在admin数据库中可用。
  20. 集群管理角色:
  21. clusterAdmin 赋予管理集群的最高权限,只在admin数据库中可用
  22. clusterManager 赋予管理和监控集群的权限
  23. clusterMonitor 赋予监控集群的权限,对监控工具具有readonly的权限
  24. hostManager 赋予管理Server