基于Docker部署一个数据库实例通常比直接在服务器上安装数据库还要简单,Gevin在开发环境中经常使用基于docker的数据库服务,docker也渐渐成为Gevin在Linux上安装MongoDB的首选方式,由于MongoDB默认是不用通过认证就能直接连接的,出于安全考虑,在公网上部署MongoDB时,务必设置authentication机制,以避免类似 "黑客赎金" 问题的发生。
那么,基于Docker拉起的MongoDB,如何实现通过用户名密码访问指定数据库呢?方法很简单,但前提是要了解MongoDB授权访问的机制,参考资料如下:
Enable Auth
Authentication
Role-Based Access Control
只要了解MongoDB授权访问机制,直接按下面步骤一步步执行就可以了。
1、创建MongoDB实例
为了少写几个命令,Gevin使用Docker Compose来创建MongoDB实例:
1
2
3
4
5
6
7
8
9
10
|
version: '2'
services:
mongo:
# restart: always
image: mongo:3.2
command : [--auth]
ports:
- "37017:27017"
volumes:
- /data/db
|
运行如下命令:
1
2
3
4
5
6
7
8
9
10
11
12
|
docker-compose up -d
#----------
# Result:
#----------
# Creating mongodb_mongo_1
docker-compose ps
#----------
# Result:
#----------
# Name Command State Ports
# --------------------------------------------------------------------------
# mongodb_mongo_1 /entrypoint.sh --auth Up 0.0.0.0:37017->27017/tcp
|
2、创建用户管理员
首先要进入MongoDB容器内部,连上MongoDB,并切换到 admin 数据库,这步可以通过下面命令完成:
1
2
3
4
5
6
7
8
9
10
11
12
|
docker exec -it mongodb_mongo_1 mongo admin
#----------
# Result:
#----------
# MongoDB shell version: 3.2.12
# connecting to: admin
# Welcome to the MongoDB shell.
# For interactive help, type "help".
# For more comprehensive documentation, see
# http://docs.mongodb.org/
# Questions? Try the support group
# http://groups.google.com/group/mongodb-user
|
然后创建一个user administrator:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
db.createUser({
user: 'mongo-admin' ,
pwd : 'admin-initial-password' ,
roles: [ { role: "userAdminAnyDatabase" , db: "admin" } ] });
#----------
# Result:
#----------
Successfully added user: {
"user" : "mongo-admin" ,
"roles" : [
{
"role" : "userAdminAnyDatabase" ,
"db" : "admin"
}
]
}
|
3、创建访问指定数据库的用户
创建了user administrator后,需要退出mongodb,并重新连接,然后用user administrator 访问admin数据库,并为目标数据库创建目标用户,其具体步骤如下:
(1)重新连接MongoDB数据库
退出容器,重新用下面命令进入容器即可:
1
2
3
4
5
6
|
docker exec -it mongodb_mongo_1 mongo admin
#----------
# Result:
#----------
MongoDB shell version: 3.2.12
connecting to: admin
|
(2)授权登录admin
1
|
db.auth( "mongo-admin" , "admin-initial-password" )
|
(3)创建访问指定数据库的用户
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
|
# Step1: switch to the specified database:
use octblog
# Step2: create a user
db.createUser(
{
user: "gevin" ,
pwd : "gevin" ,
roles: [ { role: "readWrite" , db: "octblog" },
{ role: "readWrite" , db: "octblog-log" } ]
}
)
#----------
# Result:
#----------
#Successfully added user: {
# "user" : "gevin",
# "roles" : [
# {
# "role" : "readWrite",
# "db" : "octblog"
# },
# {
# "role" : "readWrite",
# "db" : "octblog-log"
# }
# ]
#}
|
这一步的目标是为 octblog 这个数据库创建一个授权访问用户,首先要从 admin 数据库切换到 octblog 数据库,然后才能为 octblog 添加授权访问用户
注:
上面所以操作均为user administrator执行的,即第二步创建的 mongo-admin user administrator的作用是管理用户,MongoDB下的每个数据库,用户都被它管理,除此外,它基本没什么更多权限做其他事情MongoDB没有通常意义的超级用户的概念,octblog的授权用户只能被user administrator创建,而user administrator只能登陆admin数据库,所以才会有上面(2)、(3)两步的麻烦。
以上所述是小编给大家介绍的基于Docker的MongoDB实现授权访问的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!