docker安装mongodb

1、认识MongDB权限

MongoDB安装完成后,默认是没有权限验证的,默认是不需要输入用户名密码即可登录的,但是往往数据库方面我们会出于安全性的考虑而设置用户名密码。

mongodb 权限字段详情
  • user 字段,为新用户的名字;
  • pwd 字段,用户的密码;
  • cusomData 字段,为任意内容,例如可以为用户全名介绍;
  • 超级用户的 role 有两种,userAdmin 或者 userAdminAnyDatabase (比前一种多加了对所有数据库的访问,仅仅是访问而已)。
  • db 是指定数据库的名字,admin 是管理数据库。
  • 不能用 admin 数据库中的用户登录其他数据库。注:只能查看当前数据库中的用户,哪怕当前数据库 admin 数据库,也只能查看 admin 数据库中创建的用户。
  • roles 字段,指定用户的角色,可以用一个空数组给新用户设定空角色。在 roles 字段,可以指定内置角色和用户定义的角色。

role可选值:

  • 数据库用户角色:read、readWrite;
  • 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  • 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  • 备份恢复角色:backup、restore;
  • 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超级用户角色:root
  • 内部角色:__system,间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)

在MongDB中内置了一些用户角色roles,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选:

role具体角色 权限说明
read 允许用户读取指定数据库 数据库用户角色(Database User Roles)
readWrite 允许用户读写指定数据库 数据库用户角色(Database User Roles)
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile 数据库管理角色(Database Admininstration Roles)
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 数据库管理角色(Database Admininstration Roles)
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 数据库管理角色(Database Admininstration Roles)
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限 跨库角色(All-Database Roles)
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限 跨库角色(All-Database Roles)
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 跨库角色(All-Database Roles)
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 跨库角色(All-Database Roles)
root 只在admin数据库中可用。超级账号,超级权限。 超级角色(super master Roles)
backup 备份和还原角色(Backup and Restoration Roles)
restore 备份和还原角色(Backup and Restoration Roles)
clusterAdmin 授权管理集群的最高权限,只在admin中可用 集群管理角色(Cluster Administration Roles)
clusterManager 授权管理和监控集群的权限 集群管理角色(Cluster Administration Roles)
clusterMonoitor 授权监控集群的权限,对监控工具具有readonly的权限 集群管理角色(Cluster Administration Roles)
hostManager 管理server 集群管理角色(Cluster Administration Roles)

mongodb是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。添加账号需要使用 use admin 切换到admin数据库,在admin数据库添加的账号才是管理员账号。

在MongDB中,用户只能在用户所在数据库登录,包括管理员账号。mongo的用户是以数据库为单位来建立的,每个数据库有自己的管理员。管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。
注:帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证

2、创建账号

2.1、创建管理用户

此时添加的用户都只用于 admin 数据库,而非你存储业务数据的数据库

1
2
3
4
5
6
7
8
# 查看数据库
show dbs

# 切换admin数据库
use admin

# 查看用户
show users
创建用户
  • user : 用户名
  • pwd : 密码
  • roles : 角色
  • db : 数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建用户
db.createUser(
{
user: "root",
pwd: "lyou",
roles:
[
{ role: "root", db: "admin"}
]
})

# 重启mongo后 登录mongdb
mongo admin -u root -p 'lyou'
# or
use admin
db.auth("root","lyou")
创建一个不受访问限制的超级用户

root 角色:不仅可以授权、也可对集合进行任何操作,但不建议直接使用

1
2
3
4
5
6
7
db.createUser(
{
user:"root",
pwd:"pwd",
roles:["root"]
}
)
创建一个业务数据库管理员用户
1
2
3
4
5
6
7
8
db.createUser({
user:"user001",
pwd:"123456",
roles:[
{role:"readWrite",db:"game_db"},
'read' // 对其他数据库有只读权限,对game_db是读写权限
]
})

2.2、创建普通账号

创建普通数据库, 先切到admin数据库,然后db.auth(“用户”,“密码”) 登录

1
2
3
4
5
6
mongo admin -u root -p 'lyou'
mongo admin -u admin -p 'UhrM0wE51ZohI2*I'
use admin
# or
use admin
db.auth("root","lyou")

通过 use 创建数据库 game_db,如果已经有该数据就会进行切换。如果数据库没有数据执行 show dbs 数据库不会被显示

1
use game_db

在 game_db 数据库中 ,创建用户 ,可以通过 db 命令查看当前是哪个数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
db.createUser(
{
user: 'game',pwd: 'lyou',
roles:
[
{role: 'dbOwner',db: 'game_db'},
{role: 'userAdmin',db: 'game_db'},
{role: 'dbAdmin',db: 'game_db'},
{role: 'readWrite',db: 'game_db'}
]
})
show users


db.createUser(
{
user: 'slot',pwd: 'lyou',
roles:
[
{role: 'dbOwner',db: 'LogDB_DWC'},
{role: 'userAdmin',db: 'game_db'},
{role: 'dbAdmin',db: 'game_db'},
{role: 'readWrite',db: 'game_db'}
]
})

登录game_db数据库

1
2
use game_db
db.auth("game","lyou")

2.3、修改用户

2.3.1、修改用户权限

先进入数据库,然后使用db.updateuser修改 , 比如下面就给testuser用户新增了角色

1
2
3
4
5
6
7
8
9
use admin
db.updateUser(
"root",
{
roles : [
{ role:"dbAdmin", db:"game_db"},
{ role:"readWrite", db:"admin"}
]
})
2.3.2、修改用户密码
1
2
use admin
db.updateUser("root",{"pwd":"123456"})`

或者使用下面命令

1
db.changeUserPassword("root","123456")` 

2.4、删除用户

删除用户需要切换到对应的数据库,然后使用db.dropUser进行删除,需要具备:userAdmin ,userAdminAnyDatabase或者root权限才可以删除用户。

1
2
3
4
5
6
7
use admin
db.auth("root","lyou")
use test
db.dropUser("game")

# or
db.system.users.remove({user:"root"})

3、先创建mongod.conf 或者 通过以下方式 拷贝mongod.conf,再执行安装脚本

3.1、通过创建容器拷贝出来
1
2
3
4
docker run --name mongo-3.4.24 --hostname docker-mongo-3.4.24 -p 27017:27017   -d mongo:3.4.24

# mongod.conf.orig 具体目录和名字可能在不同的版本是不一样的
docker cp mongo-3.4.24:/etc/mongod.conf.orig /docker-data/mongo-3.4.24/config/mongod.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# mongod.conf

# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
dbPath: /data/db
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:

# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log

# network interfaces
net:
port: 27017
bindIp: 0.0.0.0


#processManagement:

security:
authorization: enabled

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:


3.2、运行以下命令创建容器
1
2
3
4
5
6
7
8
9
10
docker run \
--name mongo-3.4.24 \
--hostname docker-mongo \
--net='mynet' \
--restart=unless-stopped \
-e TZ="Asia/Shanghai" \
-p 27017:27017 \
-v '/docker-data/mongo-3.4.24/data':'/data/db':'rw' \
-v '/docker-data/mongo-3.4.24/config':'/data/configdb':'rw' \
-d mongo:3.4.24 mongod -f /data/configdb/mongod.conf
3.3、安装完成后配置信息
1
2
3
4
5
6
docker exec -it mongo-3.4.24 bash

#进入容器后
mongo

# rs.initiate()
3.4、再修改mongod.conf,后再重启容器,此时远程登录需要校验密码
1
2
3
4
5
docker stop mongo-3.4.24

#mongod.conf修改
security:
authorization: enabled

转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至 xiyugee@qq.com