【Docker】之安装MongoDB

安装mongodb

获取MongoDB镜像

docker pull mongo:5.0.6

本地创建数据库目录

mkdir -p /root/dockerdata/mongo/{data,configdb,backup,logs}

sudo chmod 777 -R /root/dockerdata/mongo

data : 数据文件
configdb : 配置文件
backup : 备份文件
logs : 日志文件

创建 mongodb配置文件

  创建 mongo.conf配置文件

cd /root/dockerdata/mongo/configdb
vi mongo.conf

port = 27017
dbpath=/data/db
maxConns = 10000
auth = true
bind_ip = 0.0.0.0
logpath=/data/log/mongo.log
logappend=true
objcheck = true

注意
logpath: /data/log/mongo.log
logAppend: true
写入日志文件的地址是容器中的路径(不是宿主机里的地址)

dbpath: /data/db
数据库目录是容器中的路径 (不是宿主机里的地址路径)

port: 27037
bind_ip: 0.0.0.0
指定容器mongodb启动监听 27037 端口
0.0.0.0 是为了让宿主机可以访问容器的mongodb服务.

auth:
是开启账号密码登录验证方式,用井号做了注释,暂时不需要账号密码验证方式登录.

运行容器

docker run -d --restart=always \
--privileged=true \
-p 27017:27017 \
--net mynet --ip 172.172.0.9 \
--name mymongo \
-v /root/dockerdata/mongo/logs:/data/log/ \
-v /root/dockerdata/mongo/data:/data/db \
-v /root/dockerdata/mongo/backup:/data/backup 
-v /root/dockerdata/mongo/configdb:/data/configdb  \
-v /root/dockerdata/mongo/configdb/mongo.conf:/data/configdb/mongo.conf \
-e MONGODB_INITDB_ROOT_USERNAME=admin \
-e MONGODB_INITDB_ROOT_PASSWORD=12345678 \
-d mongo:5.0.6 --auth --bind_ip_all

# 如果想要使用配置文件启动mongodb,则执行自己的启动命令:

docker run -d --restart=always \
--privileged=true \
-p 27017:27017 \
--net mynet --ip 172.172.0.9 \
--name mymongo \
-v /root/dockerdata/mongo/logs:/data/log/ \
-v /root/dockerdata/mongo/data:/data/db \
-v /root/dockerdata/mongo/backup:/data/backup 
-v /root/dockerdata/mongo/configdb:/data/configdb  \
-v /root/dockerdata/mongo/configdb/mongo.conf:/data/configdb/mongo.conf \
-e MONGODB_INITDB_ROOT_USERNAME=admin \
-e MONGODB_INITDB_ROOT_PASSWORD=12345678 \
-d mongo:5.0.6 \
mongod -f /data/configdb/mongo.conf --auth --bind_ip_all

记住:自己的mongod启动命令是在容器内执行的,因此使用的配置文件路径是相对于容器的内部路径。

  1. -v /root/dockerdata/mongo/data/db:/data/db 使用卷持久化数据
  2. -e MONGODB_INITDB_ROOT_USERNAME=admin 授予超级用户权限
  3. -e MONGODB_INITDB_ROOT_PASSWORD=leeze 授予超级用户权限
  4. -e MONGODB_INITDB_ROOT_PASSWORD_FILE=/run/secrets/mongo-root-pw docker inspect用于查看容器的变量时,您的密码都将不可见
  5. -v ./mongo.conf:/etc/mongo/mongo.conf Mongo 配置文件
  6. -e MONGODB_INITDB_DATABASE=xiaosige 更改此默认数据库
  7. --privileged 拥有真正的root权限
  8. ----restart=always Docker服务重启容器也启动
  9. --bind_ip_all 允许所以IP访问
  10. --auth 是开启权限认证
  11. -f /data/configdb/mongo.conf 容器目录下配置文件路径

创建mongoDb用户

#进入mongoDb容器,创建管理员
docker exec -it mongoDb bash
#进入mongoDb
mongo
> use admin
switched to db admin
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]});
Successfully added user: {
	"user" : "admin",
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	]
}
> db.auth('admin','123456') # 认证
#出现创建成功提示就对了,退出管理员
> exit;
#用刚创建的管理用户登录在创建个普通用户
mongo --port 27017 -u admin -p admin --authenticationDatabase admin
> use test
switched to db test
> db.createUser({user:"tester",pwd:"tester",roles:[{role:"readWrite",db:"test"}]});
Successfully added user: {
	"user" : "tester",
	"roles" : [
		{
			"role" : "readWrite",
			"db" : "test"
		}
	]
}
> exit

mongoDb用户角色权限说明

  • 数据库用户角色 readreadWrite
  • 数据库管理角色 dbAdmindbOwneruserAdmin
  • 集群管理角色 clusterAdminclusterManagerclusterMonitorhostManager
  • 备份恢复角色 backuprestore
  • 所有数据库角色 readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabase
  • 超级用户角色 root
  • 内部角色 __system

  角色说明

  • Read 允许用户读取指定数据库
  • readWrite 允许用户读写指定数据库
  • dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
  • userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
  • clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  • readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
  • dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
  • root 只在admin数据库中可用。超级账号,超级权限

  至此mongoDb数据库据安装好了,可以愉快的玩耍使用了

mongodb副本集

  一个最小的副本集为3个成员,包括主节点,备节点和仲裁节点,如果没有仲裁节点,备节点是不会自动升级为主节点的。

创建mongodb节点

# 创建一个网络
docker network create tms

docker run --name m1 -p 27001:27017  --network tms --network-alias m1 -d mongo:5.0.6 --replSet mset --bind_ip 0.0.0.0
docker run --name m2 -p 27002:27017  --network tms --network-alias m2 -d mongo:5.0.6 --replSet mset --bind_ip 0.0.0.0
docker run --name m3 -p 27003:27017  --network tms --network-alias m3 -d mongo:5.0.6 --replSet mset --bind_ip 0.0.0.0

注意一定要将bind_ip设置成不是只有本地访问,否则副本集不能初始化成功。

配置节点

rs.initiate({ _id:"mset", members:[
{_id:0,host:"m1:27017",priority:2}, {_id:1,host:"m2:27017",priority:1}, {_id:2,host:"m3:27017",arbiterOnly:true}
]})
priority:设置优先级,数字越大优先级越高,优先级最高的是主节点

rs.status() # 查看状态

# 默认备份节点不能读写,可以设置
rs.slaveOk();

# 增加节点,需要进入主节点执行
rs.add('ip:port')

创建用户

use admin
db.createUser({ 
    user:'admin',
    pwd:'123456',
    roles:[{role:'root',db:'admin'}],
})

db.auth('admin','123456') 

开启认证

  如果需要开启认证,使用ssl的keyfile文件作为认证文件:

openssl rand -base64 666 > mongodb.key # 生成认证文件
chmod 600 mongodb.key # 设置执行权限
  • 设置配置文件
    # /mnt/mongodb/mconf/mongod.conf
    net:
      port: 27017
      bindIp: 0.0.0.0
    
    systemLog:
      logAppend: true
    
    processManagement:
      fork: false
    
    security:
      keyFile: "/data/configdb/mongodb.key"
      clusterAuthMode: "keyFile"
      authorization: "enabled"
    
    replication:
      replSetName: "mset"
      secondaryIndexPrefetch: "all"
     
  • 启动容器
    docker run --name m1 -p 27001:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m1 -d mongo:5.0.6 mongod -f /data/configdb/mongod.conf
    docker run --name m2 -p 27002:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m2 -d mongo:5.0.6 mongod -f /data/configdb/mongod.conf
    docker run --name m3 -p 27003:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m3 -d mongo:5.0.6 mongod -f /data/configdb/mongod.conf
    

PS

mongodb://10.211.55.81:27017
mongodb://leeze:leeze@10.211.55.81:27017/?authSource=flux

#更新源 
apt-get update 
# 安装 
vim apt-get install vim 
# 修改 mongo 配置文件 
vim /etc/mongod.conf.orig

参考