mongodb作为非关系型数据库。本次配置是在阿里云服务器上配置。
1.下载镜像
首先可以通过以下指令获取有哪些镜像:
docker search mongo
显示列表如下:
第一个为root仓库,也就是官方提供的mongo镜像 ,接着拉取这个镜像即可。
docker pull mongo
如果镜像下载过慢,则可以使用docker镜像加速器:
①.ubunut下
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://l10nt4hq.mirror.aliyuncs.com"]
}
之后EOF结束输入(在linux下输入ctrl d表示的就是EOL)
然后在控制台接着键入:
sudo systemctl daemon-reload
sudo systemctl restart docker
其他的linux系统可以参考: https://www.cnblogs.com/longronglang/p/8651534.html
接着键入:
docker images
来判断镜像是否下载成功。
2.运行mongodb容器
然后运行mongo镜像,mongo默认的端口是27017,所以在一开始启动的时候需要指定这个端口。
docker run -d -p 27017:27017 --name mongo_test mongo
此命令是创建一个基于mongo镜像、名称为mongo_test、并开放了27017=》27017的端口的一个容器。
如果开启无误的话,键入
docker ps
就会显示正在运行的mongo_test容器。
如果失败,则可以通过
docker logs mongo_test
来查看出错原因。
注意:这里采用了-p 27017:27017来强制使得容器内的27017端口绑定到本地宿主机的27017端口上。
3.测试
阿里云默认只是开启了一些必须的端口,比如用于ssh的21端口,开启其他端口可参考这里。
接着就可以在客户端上登录mongodb来进行一些操作了,这里使用的是python3和pymongo库:
import pymongo
if __name__ == '__main__':
client = pymongo.MongoClient(host=替换成云服务器的IP地址, port=27017)
# 如果数据库不存在,则创建名为school的库
db = client['school']
collection = db.students
student = {
"id": "1234",
"name": "sky",
"gender": "male",
}
result = collection.insert_one(student)
print(result)
如果没出错则表示成功。
也可以使用mongodb的客户端来进行访问。
4.加入用户验证
从上面的代码可以看出,在mongodb暴露在了公网并开启了端口后,所有人都可以直接操作数据库而无需身份验证,这显然是存在问题的,所以接下来加入用户验证来保证安全性。
首先,需要停止、然后删除掉原来的容器。
docker stop mongo_test
docker rm mongo_test
然后再重新开启一个容器:
docker run -d -p 27017:27017 --name mongo_test mongo --auth
添加--auth表示mongo需要验证才能操作。
接着需要进入mongo_test容器内创建用户管理员账户。
①.添加用户
首先需要进入到正在运行的mongo_test容器中,
docker exec -it mongo_test /bin/bash
然后输入mongo进入到MongoDB的命令行交互模式下,在此模式下运行如下命令:
use admin
db.createUser({user: "admin", pwd: "admin123", roles:[{role: "root", db: "admin"}]})
上面的命令先是切换到admin数据库,然后创建一个名为“admin”,密码为“admin123”的用户,并赋予最高权限。
接着之后在切换到admin时就需要验证成功后才可以操作,比如在mongo客户端下:
use admin
db.auth("admin", "admin123")
返回1则表示验证成功。之后再键入show users则会返回admin下的所有用户。
创建普通用户和创建管理员用户基本类似,只不过权限不同而已。
use school
db.createUser(
{
user: "simple",
pwd: "admin123",
roles: [ { role: "readWrite", db: "school" }]
}
)
如果不存在school库,则创建这个库,之后创建一个用户 ,它对于school库有读写的权限。
注意:use school表示的是创建的用户是在school下的;还有就是如果 admin 库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,默认的连接方式依然会有超级权限。
权限说明:
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限
之后就需要改写之前的python代码了,在操作前需要先验证,成功后才可以接着操作。
import pymongo
if __name__ == '__main__':
client = pymongo.MongoClient(host=IP地址, port=27017)
# 如果数据库不存在,则创建名为school的库
db = client['school']
db.authenticate(name="simple", password="admin123")
collection = db.students
student = {
"id": "1234",
"name": "sky",
"gender": "male",
}
result = collection.insert_one(student)
print(result)
②.删除用户
比如要删除之前在school库中创建的simple角色的话,需要在mongoDB命令行中输入:
use school;
db.dropUser("simple")
删除所有账户
db.dropAllUser()
参考链接:
https://www.jianshu.com/p/79caa1cc49a5