云服务器下docker部署mongodb

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

https://blog.csdn.net/qq_38839677/article/details/82421917

https://blog.csdn.net/u010649766/article/details/78498130

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值