当前位置: 首页 > 创领中心 > 网络优化

装置 也不是很难 云数据库太贵了 Docker MongoDB 试一下用

  • 网络优化
  • 2024-11-15

我想既然接口跑在 Serverless 上,索性数据库也买一个 MongoDB 云数据库吧,这样大家齐全不须要买主机自己部署,对前端来说门槛更低。

而后我找到了云数据库,看到多少钱傻眼了:

确实买不起啊,还是我自己搭建吧。还好我有好基友 Docker,搭建一个 MongoDB 不麻烦。

目前 MongoDB 最新版本是 7.x,咱们用上一个版本 6.x。

运转容器启动 MongoDB

(1)拉取 MongoDB 的官方镜像:

$ docker pull mongo:6

(2)在宿主环境中创立两个目录,作为容器数据卷:

/docker/mongodb/data/#数据库数据目录/docker/mongodb/dump/#备份数据目录

(3)口头命令,把 MongoDB 容器运转起来:

$ docker run --name mongodb \--restart=always \-p 27017:27017 \-v /docker/mongodb/data:/data/db \-v /docker/mongodb/dump:/var/dump \-d mongo:6 --auth

上方的几个关键参数说明一下:

运转成功后,经常使用docker ps命令检查容器列表:

图中圈住的中央就是容器ID,接着进入这个容器,并衔接数据库:

$ docker exec -it <container_id>/bin/bash$ mongosh# 进入数据库,不须要用户名

mongosh是从 MongoDB 4.2 开局推出的 shell 工具,取代了之前的mongo命令,用于口头数据库的操作,这里要当心一下。

上图可以看到,自动衔接到了 test 数据库。

如今切换到 admin 数据库(身份验证数据库),创立一个超级用户:

$ use admin # 切换数据库$ db.createUser({user:'root',pwd:'mongo_root_pass',roles:[{role:'root',db:'admin'}]})

接上去经常使用这个用户登录 MongoDB,就可以口头“创立数据库、创立用户”等操作了。

启动容器并创立用户

上一步咱们先启动容器,而后再创立超级用户,实践上这两个步骤可以一次性成功。

在运转容器时,假设传入上方的两个环境变量:

MongoDB 会智能在 admin 数据库中创立该用户,指定角色为 root,并智能启用身份验证(--auth)。

所以上方的运转容器命令可以提升为这样:

$ docker run --name mongodb \--restart=always \-p 27017:27017 \-v /docker/mongodb/data:/data/db \-v /docker/mongodb/dump:/var/dump \-e MONGO_INITDB_ROOT_USERNAME=root \-e MONGO_INITDB_ROOT_PASSWORD=mongo_root_pass \-d mongo:6

这样 MongoDB 启动之后,便智能创立了超级用户。

启动时智能口头脚本

自动的 admin 数据库用于身份验证。当真正存储数据时,须要创立一个新的数据库。

创立数据库和用户须要权限,普通咱们会用超级用户登录到 admin 数据库,而后再创立其余数据库和用户,如下:

$ docker exec -it <container_id>/bin/bash # 进入容器$ mongosh admin --username root --password mongo_root_pass # 登录 admin 数据库$ use test_db# 创立/切换数据库

但是假设是在 CI(智能化部署)环境中,咱们宿愿 MongoDB 启动后智能创立须要的数据库和用户,而不是每次都要手动创立,这时应该怎样办呢?

这时刻要借助一个 Docker 下的不凡目录:docker-entrypoint-init.d。

该目录下可以自定义脚本文件,在容器第一次性启动时智能口头。mongo镜像可以识别该目录下的.sh和.js文件,并依照顺序口头。

那么咱们就在 /docker/mongodb 目录下创立一个mongo-init.js文件,并在运转容器时挂载:

-v /docker/mongodb/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js

如今在该文件中编写初始化逻辑,比如创立一个用户:

// mongo-init.jsdb.createUser({user: 'test_user',pwd: 'test_pass',roles: [{role: 'dbOwner',db: 'test_db',},],});

上方的 JS 文件中可以访问db对象,由于它在mongosh环境下口头。自动状况下,db 代表 “test” 数据库。

假设咱们要切换数据库,命令是use <db_name>。但是在 JS 文件中,显然这种语法是不允许的。

关于如何在 JS 文件中切换数据库,我找了很多方法,翻了一终日的文档,终于找到了。

就是它:db.getSiblingDB(),同等于 use 命令。

因此,在 test_db 数据库中创立/切换用户,可以修正如下:

db = db.getSiblingDB('test_db');db.createUser({user: 'test_user',pwd: 'test_pass',roles: [{role: 'dbOwner',db: 'test_db',},],});

经过db.getSiblingDB()方法,咱们可以在 JS 脚本中创立多个数据库和用户。

假设你不想在 JS 代码中创立/切换数据库,更繁难的方法是,用环境变量MONGO_INITDB_DATABASE指定脚本在某个数据库下口头。

Docker Compose 运转

假设你感觉运转容器的命令太长,那么经常使用 Docker Compose 也是一个不错的选用。

首先创立compose.yml性能文件如下:

version: '3.1'services:mongodb:image: mongo:6restart: alwaysenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: mongo_root_passMONGO_INITDB_DATABASE: test_dbvolumes:- '/docker/mongodb/data:/data/db'- '/docker/mongodb/dump:/var/dump'- '/docker/mongodb/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js'

而后运转启动命令:

$ docker compose up -d

客户端衔接到 MongoDB

在启动 MongoDB 时,传入--auth参数示意开启授权验证,不传则不开启。

假设未开启授权验证,衔接 MongoDB 不须要账号明码,衔接 URL 如下:

mongodb://127.0.0.1:27017

假设开启授权验证,则衔接 URL 中必定指定数据库、账号、明码,如下:

mongodb://user:pass@127.0.0.1:27017/dbname

在《前端开发实战派》的名目中经常使用mongoose衔接数据库,有了上方的 url 和用户名明码,衔接方法如下:

const mongoose = require('mongoose')mongoose.connect('mongodb://127.0.0.1:27017/dbname', {user: 'username',pass: 'password',}).then(() => {console.log('数据库衔接成功:')}).catch(err => {console.log('数据库衔接失败:', err)})

如今,你可以在我的开源名目 仿掘金博客系统 中减少自己的数据库性能,名目就可以运转起来了。

总结

前面咱们从 MongoDB 的装置、运转性能、授权验证等方面,片面引见了如何用 Docker 将 MongoDB 运转起来,并在名目中衔接经常使用。

  • 关注微信

本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://clwxseo.com/wangluoyouhua/8671.html

猜你喜欢

热门资讯

关注我们

微信公众号