docker-compose 安装MongoDB续创建用户及赋权

2024-04-17 20:28

本文主要是介绍docker-compose 安装MongoDB续创建用户及赋权,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 问题描述
  • 2. 分析
    • 2.1 admin
    • 2.2 config
    • 2.3 local
  • 3. 如何连接
  • 3.解决

1. 问题描述

在这一篇使用docker-compose创建MongoDB环境的笔记里,我们创建了数据库,但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误:
请添加图片描述
从截图可以看出,明显是Authorization失败了。

2. 分析

我们使用了这样的docker-compose.yaml文件来创建MongoDB的环境:

version: "3.8"
services:mongodb:container_name: mongodbimage: mongo:6.0ports:- 27017:27017restart: "no"volumes:- $PWD/data:/data/db- $PWD/logs:/var/log/mongodbenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: 123456

配置文件

# mongod.conf# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data.
storage:dbPath: /var/lib/mongodbjournal:enabled: true
#  engine:
#  wiredTiger:# where to write logging data.
systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.log# network interfaces
net:port: 27017bindIp: 0.0.0.0# how the process runs
processManagement:timeZoneInfo: /usr/share/zoneinfo#security:
auth=true#operationProfiling:#replication:#sharding:## Enterprise-Only Options:#auditLog:#snmp:

在启动数据库环境的时候,这里的INITDB的username和password都是赋值了的,但是这里并不能用这个用户名和密码进行登录。
那么这个用户名和密码是用来做什么的呢?
这个用户名和密码其实是数据库预设的admin库的。我们是可以用这个用户名和密码登录的。请添加图片描述
MongoDB一共有三个系统预设的库:

  • admin
  • config
  • local
    他们分别是用来做什么的呢?

2.1 admin

admin库是用来存储MongoDB的用户、角色等信息。
当MongoDB启用auth选项时,用户需要创建数据库帐号,访问时根据帐号信息来鉴权,而数据库帐号信息就存储在admin数据库下。

root@5db7fcc96e0f:/# mongosh -u root -p 123456
Current Mongosh Log ID:	661f969bdedb617b6878c1b9
Connecting to:		mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0
Using MongoDB:		6.0.2
Using Mongosh:		1.6.0For mongosh info see: https://docs.mongodb.com/mongodb-shell/------The server generated these startup warnings when booting2024-04-17T07:59:25.043+00:00: vm.max_map_count is too low
------------Enable MongoDB's free cloud-based monitoring service, which will then receive and displaymetrics about your deployment (disk utilization, CPU, operation statistics, etc).The monitoring data will be available on a MongoDB website with a unique URL accessible to youand anyone you share the URL with. MongoDB may use this information to make productimprovements and to suggest MongoDB products and deployment options to you.To enable free monitoring, run the following command: db.enableFreeMonitoring()To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
------test> show dbs;
admin   148.00 KiB
config  108.00 KiB
local    72.00 KiB
test> use admin
switched to db admin
admin> ls
ReferenceError: ls is not defined
admin> show collections;
system.users
system.version
admin> db.getCollection("system.version").find();
[{ _id: 'featureCompatibilityVersion', version: '6.0' },{ _id: 'authSchema', currentVersion: 5 }
]
admin> db.getCollection("system.users").find();
[{_id: 'admin.root',userId: new UUID("c0456cdb-ee1a-4ac7-a0de-695e48446983"),user: 'root',db: 'admin',credentials: {'SCRAM-SHA-1': {iterationCount: 10000,salt: '+wMEd3wWYjx5M2tuH/S7pg==',storedKey: 'juZ6GSX1639pJM4Xg99X/YLeIiI=',serverKey: 'KH9M9gFvo9DhvHlphTjrLG5HtoM='},'SCRAM-SHA-256': {iterationCount: 15000,salt: 'xJ84t11r+CStAF0EODvMzqPATo5RM8yDallqgA==',storedKey: 'ykgIr3CzzozJnQC5p6dt4quqQs8hcU1npBZFF9Q7b1g=',serverKey: 'C2Y/QrAVVdOTicGCwoAlb0RTYRJMLU02LF+iAQc/WkE='}},roles: [ { role: 'root', db: 'admin' } ]}
]
admin>

admin库里有两个collection:

  • system.version,这张表里存放的是MongoDB的版本信息和authSchema的版本信息。
  • system.users 用户的信息,包括角色

用户可以在admin数据库下建立任意集合,存储任何数据,但强烈建议不要使用admin数据库存储应用业务数据,最好创建新的数据库。
  admin数据库里的system.users、system.roles2个集合的数据MongoDB会cache在内存里,这样不用每次鉴权都从磁盘加载用户角色信息。目前cache的维护代码,只有在保证system.users、system.roles的写入都串行化的情况下才能正确工作。
  MongoDB admin数据库的写入操作的锁级别只能到DB级别,不支持多个collection并发写入,在写入时也不支持并发读取。如果用户在admin数据库里存储业务数据,则可能遭遇性能问题。

2.2 config

config库在使用MongoDB分片功能时起到作用,主要存储分片集群基础信息。
(挖个坑,以后再填,这里没怎么研究过)

2.3 local

local库它只会在本地存储数据,local数据库里的内容不会同步到副本集里其他节点上去;local数据库主要存储副本集的配置信息、oplog信息。
另外,对于重要的数据不能存储在local数据库,还要注意MongoDB默认的WriteConcern是{w: 1},即数据写到Primary上(不保证journal已经写成功)就向客户端确认,这时同样存在丢数据的风险。对于重要的数据,可以设置更高级别的如{w: “majority”}来保证数据写到大多数节点后再向客户端确认,当然这对写入的性能会造成一定的影响。

3. 如何连接

我们可以连接上admin库,那么我们就可以创建数据库,也可以为数据库创建用户,并指定用户的角色,根据不同角色赋予不同的权利。

test> use phone;
switched to db phone
phone> show dbs;
admin   100.00 KiB
config   72.00 KiB
local    72.00 KiB
admin> use admin;
admin> db.auth('root','123456');
{ ok: 1 }
admin> use phone;
switched to db phone
phone> db.createUser({user:'yy',pwd:'yy123456',roles:[{role:"readWrite", db:"phone"}]});
{ ok: 1 }

这里先创建了数据库phone,然后创建了用户yy,并设置密码为yy123456,赋予的role是读写。

数据库用户角色主要read和readWrite。
详细的角色信息看这里内置角色

3.解决

在执行完上面的操作后,就可以通过Robo 3T连接数据库了。
请添加图片描述

这篇关于docker-compose 安装MongoDB续创建用户及赋权的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912759

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Centos7安装Mongodb4

1、下载源码包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz 2、解压 放到 /usr/local/ 目录下 tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgzmv mongodb-linux-x86_64-rhel70-4.2.1/

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

Centos7安装JDK1.8保姆版

工欲善其事,必先利其器。这句话同样适用于学习Java编程。在开始Java的学习旅程之前,我们必须首先配置好适合的开发环境。 通过事先准备好这些工具和配置,我们可以避免在学习过程中遇到因环境问题导致的代码异常或错误。一个稳定、高效的开发环境能够让我们更加专注于代码的学习和编写,提升学习效率,减少不必要的困扰和挫折感。因此,在学习Java之初,投入一些时间和精力来配置好开发环境是非常值得的。这将为我

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能