杂记 | 使用Docker安装并配置MongoDB以支持事务(单副本,并解决了证书文件错误的问题)

文章目录

  • 00 安装前的准备
  • 01 创建Docker Compose文件
  • 02 设置证书文件
  • 03 启动MongoDB
  • 04 初始化副本集和创建用户
  • 05 验证安装


00 安装前的准备

在开始之前,确保已经安装了Docker,本文基于Docker Compose进行示范,没有装Docker Compose也可将其中的docker-compose命令转换为docker run命令执行。

01 创建Docker Compose文件

首先,新建一个名为mongo的目录,并在其中创建一个名为docker-compose.yml的文件,并写入以下内容:

version: '3.8'
services:mongo:image: mongo:latestcontainer_name: mongocommand: --auth --bind_ip_all --replSet rs0 --keyFile /data/mongodb/keyFileports:- "27017:27017"volumes:- ./data:/data/db- ./conf:/data/configdb- ./backup:/data/backup- ./keyFile:/data/mongodb/keyFile

这个配置会启动一个MongoDB容器,使用最新的MongoDB镜像,并将容器命名为mongo

命令解释:

  1. command: --auth --bind_ip_all --replSet rs0 --keyFile /data/mongodb/keyFile: 这是传递给MongoDB服务器的命令行参数。

    • --auth: 开启身份验证。
    • --bind_ip_all: 允许MongoDB绑定到服务器上的所有IP地址。
    • --replSet rs0: 初始化一个名为rs0的副本集。
    • --keyFile /data/mongodb/keyFile: 指定用于副本集成员之间身份验证的密钥文件路径。
  2. ports:: 这部分定义了容器和宿主机之间的端口映射。

    • "27017:27017": 将容器的27017端口映射到宿主机的27017端口。MongoDB默认使用27017端口。
  3. volumes:: 这部分定义了宿主机和容器之间的数据卷映射,用于数据持久化和配置管理。

    • ./data:/data/db: 将宿主机当前目录下的data文件夹映射到容器的/data/db路径,用于存储MongoDB的数据文件。
    • ./conf:/data/configdb: 将宿主机的conf文件夹映射到容器的/data/configdb路径,通常用于存放MongoDB的配置文件。
    • ./backup:/data/backup: 将宿主机的backup文件夹映射到容器的/data/backup路径,用于存储备份文件。
    • ./keyFile:/data/mongodb/keyFile: 将宿主机的keyFile文件映射到容器的/data/mongodb/keyFile路径,这是副本集认证所需的密钥文件。

02 设置证书文件

为了安全性和配置副本集,需要创建一个证书文件。在存放docker-compose.yml的mongo目录下,运行以下命令来生成证书文件:

# 生成一个756字节的自签名证书
openssl rand -base64 756 > ./keyFile
# 赋予该证书400权限
chmod 400 ./keyFile
# 更改文件的所有者和群组
chown 999:999 ./keyFile

MongoDB是以用户ID 999运行的,更改keyFile的所有者和群组为UID和GID 999,以确保MongoDB进程能够访问该文件。

必需要完成权限设置和访问组设置,否则MongoDB无法正常启动。

03 启动MongoDB

使用以下命令来启动MongoDB服务:

# 拉取镜像
docker-compose pull
# 启动容器
docker-compose up -d
# 停止容器
# docker-compose down

启动完成后,该目录:
在这里插入图片描述

04 初始化副本集和创建用户

进入到MongoDB容器并初始化副本集:

# 进入容器 这里的mongo是容器名称 mongosh是脚本命令
docker exec -it mongo mongosh
# 进入容器后 执行初始化(带 > 符号说明是在容器内操作,并非命令的一部分)
> rs.initiate()

然后,创建管理员用户:

# 切换数据库
> use admin
# 创建管理员用户
> db.createUser({user:'admin', pwd:'admin123456', roles:[{role: 'userAdminAnyDatabase', db:'admin'}]});
# 用户认证登录
> db.auth("admin", "admin123456")

接下来,切换到printing账户,并创建一个具有读写权限的用户:

# 切换数据库
> use printing
# 创建一个用户
> db.createUser({user: "lily", pwd: "lily1997", roles: [{role:"readWrite", db: "printing"}]});
# 先退出
> exit

05 验证安装

最后,验证用户是否可以成功连接并认证:

# 进入容器
docker exec -it mongo mongosh
# 切换数据库
> use printing
# 用户认证登录
> db.auth("lily", "lily1997")

通过以上步骤,我们成功在Linux服务器上使用Docker安装并配置了MongoDB。开启了单副本,支持事务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/229904.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elFinder ZIP 参数注入导致命令注入 (CVE-2021-32682)

漏洞描述 elFinder 是一个用于 Web 的开源文件管理器,使用 jQuery UI 用 JavaScript 编写。 在 elFinder 2.1.48 及更早版本中发现一个参数注入漏洞。此漏洞可能允许攻击者在托管 elFinder PHP 连接器的服务器上执行任意命令,即使配置最少也是如此。这…

【Android知识笔记】架构专题(一)

什么是 MVC 其实我们日常开发中的Activity,Fragment和XML界面就相当于是一个MVC的架构模式,但往往Activity中需要处理绑定UI,用户交互,以及数据处理。 这种开发方式的缺点就是业务量复杂的时候一个Activity过于臃肿。但是页面结构不复杂的情况下使用这种方式就会显得很简…

基于Java SSM框架+Vue实现房屋租赁网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现房屋租赁网站演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,房屋租赁系统当然也不能排除在外。房屋租赁系统是以实际运用为开发背景&…

Image Segmentation Using Deep Learning: A Survey

论文标题:Image Segmentation Using Deep Learning:A Survey作者:发表日期:阅读日期 :研究背景:scene understanding,medical image analysis, robotic perception, video surveillance, augmented reality, and image…

CATIA CAA 编译报错 提示 error LNK2019 无法解析的外部符号 public cdecl

CATIA CAA 编译报错 提示 error LNK2019 无法解析的外部符号 public cdecl 项目架构如图所示:一个FrameWork下有两个Module,分别是DFMProcessCheckMdl.m和ProcessCheckUtilMdl.m 我需要在DFMProcessCheckMdl.m模块调用ProcessCheckUtilMdl.m模块的一个自…

numpy知识库:np.random.randint()用法及其使用场景举例

randint函数解析 import numpy as np# 【随机】返回[0,5)范围内的一个整数 # [0, 5) --> 左闭右开区间 int_a np.random.randint(5) # int_a 可能为 0、1、2、3、4 int_a np.random.randint(low5) # int_a 可能为 0、1、2、3、4# 【随机】返回[1,5)范围内的一个整数 int_…

UE Web Remote Control

前言 最近在研究UE自启WEB服务和网页通信以此来通过网页与UE进行数据交互,这样最好的方式就是可以摒弃掉整个繁琐的通信连接流程如TCP UDP,但是找到的一些方法都不是很适用,尤其是WEBUI这个插件它只适合内嵌到UE本身才能完成交互,…

哪里可了解低代码数据可视化开发平台?

如果想要提升办公协作效率,可以用什么样的平台助力实现这一目标?其实,随着市场竞争的日益加剧,低代码技术平台的应用价值也逐渐凸显出来,其可视化、易操作、灵活便利等优势特点,是很多中大型企业倾向于使用…

ThinkPHP的方法接收json数据问题

第一次接触到前后端分离开发,需要在后端接收前端ajax提交的json数据,开发基于ThinkPHP3.2.3框架。于是一开始习惯性的直接用I()方法接收到前端发送的json数据,然后用json_decode()解析发现结果为空!但是打印出还未解析的值却打印得…

【数据挖掘】国科大刘莹老师数据挖掘课程作业 —— 第二次作业

Written Part 1. 给定包含属性{Height, Hair, Eye}和两个类别{C1, C2}的数据集。构建基于信息增益(info gain)的决策树。 HeightHairEyeClass1TallBlondBrownC12TallDarkBlueC13TallDarkBrownC14ShortDark…

phpstudy安装redis

Redis 是一个开源的高性能键值存储数据库,广泛用于缓存、消息队列、会话管理和实时数据分析等应用场景。 使用 PHP Redis 扩展,你可以在 PHP 代码中使用一系列的函数来连接到 Redis 服务器,并执行各种操作,如设置和获取键值对、操…

【axios】TypeScript实战,结合源码,从0到1教你封装一个axios - 基础封装篇

目录 前言版本环境变量配置引入的类型1、AxiosIntance: axios实例类型2、InternalAxiosRequestConfig: 高版本下AxiosRequestConfig的拓展类型3、AxiosRequestConfig: 请求体配置参数类型4、AxiosError: 错误对象类型5、AxiosResponse: 完整原始响应体类型 目标效果开始封装骨架…