成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MongoDB 云數(shù)據(jù)庫太貴了,試一下用 Docker 安裝,也不是很難

數(shù)據(jù)庫 MongoDB 運(yùn)維
我們從 MongoDB 的安裝、運(yùn)行配置、授權(quán)驗證等方面,全面介紹了如何用 Docker 將 MongoDB 運(yùn)行起來,并在項目中連接使用。

我想既然接口跑在 Serverless 上,索性數(shù)據(jù)庫也買一個 MongoDB 云數(shù)據(jù)庫吧,這樣大家完全不需要買服務(wù)器自己部署,對前端來說門檻更低。

然后我找到了云數(shù)據(jù)庫,看到價格傻眼了:

圖片

確實(shí)買不起啊,還是我自己搭建吧。還好我有好基友 Docker,搭建一個 MongoDB 不費(fèi)事。

目前 MongoDB 最新版本是 7.x,我們用上一個版本 6.x。

運(yùn)行容器啟動 MongoDB

安裝 Docker 大家直接從 官網(wǎng) 下載安裝就可以了,測試的話在本地裝一個 Docker Desktop 很方便。

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

$ docker pull mongo:6

(2)在宿主環(huán)境中創(chuàng)建兩個目錄,作為容器數(shù)據(jù)卷:

/docker/mongodb/data/    #數(shù)據(jù)庫數(shù)據(jù)目錄
/docker/mongodb/dump/    #備份數(shù)據(jù)目錄

(3)執(zhí)行命令,把 MongoDB 容器運(yùn)行起來:

$ 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

上面的幾個重要參數(shù)說明一下:

  • --restart=always:容器退出時自動重啟,這個很有用。
  • 27017:用于連接 MongoDB 的端口。
  • --auth:開啟授權(quán)驗證。
  • -d:后臺運(yùn)行,要加。

運(yùn)行成功后,使用 docker ps 命令查看容器列表:

圖片

圖中圈住的地方就是容器ID,接著進(jìn)入這個容器,并連接數(shù)據(jù)庫:

$ docker exec -it <container_id>  /bin/bash
$ mongosh  # 進(jìn)入數(shù)據(jù)庫,不需要用戶名

mongosh 是從  MongoDB 4.2 開始推出的 shell 工具,取代了之前的 mongo 命令,用于執(zhí)行數(shù)據(jù)庫的操作,這里要留意一下。

圖片

上圖可以看到,默認(rèn)連接到了 test 數(shù)據(jù)庫。

現(xiàn)在切換到 admin 數(shù)據(jù)庫(身份驗證數(shù)據(jù)庫),創(chuàng)建一個超級用戶:

$ use admin # 切換數(shù)據(jù)庫
$ db.createUser({
  user:'root',
  pwd:'mongo_root_pass',
  roles:[{
    role:'root',
    db:'admin'
  }]
})

接下來使用這個用戶登錄 MongoDB,就可以執(zhí)行“創(chuàng)建數(shù)據(jù)庫、創(chuàng)建用戶”等操作了。

啟動容器并創(chuàng)建用戶

上一步我們先啟動容器,然后再創(chuàng)建超級用戶,實(shí)際上這兩個步驟可以一次完成。

在運(yùn)行容器時,如果傳入下面的兩個環(huán)境變量:

  • MONGO_INITDB_ROOT_USERNAME:用戶名
  • MONGO_INITDB_ROOT_PASSWORD:密碼

MongoDB 會自動在 admin 數(shù)據(jù)庫中創(chuàng)建該用戶,指定角色為 root,并自動啟用身份驗證(--auth)。

所以上面的運(yùn)行容器命令可以優(yōu)化為這樣:

$ 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 啟動之后,便自動創(chuàng)建了超級用戶。

啟動時自動執(zhí)行腳本

默認(rèn)的 admin 數(shù)據(jù)庫用于身份驗證。當(dāng)真正存儲數(shù)據(jù)時,需要創(chuàng)建一個新的數(shù)據(jù)庫。

創(chuàng)建數(shù)據(jù)庫和用戶需要權(quán)限,一般我們會用超級用戶登錄到 admin 數(shù)據(jù)庫,然后再創(chuàng)建其他數(shù)據(jù)庫和用戶,如下:

$ docker exec -it <container_id>  /bin/bash # 進(jìn)入容器
$ mongosh admin --username root --password mongo_root_pass # 登錄 admin 數(shù)據(jù)庫
$ use test_db  # 創(chuàng)建/切換數(shù)據(jù)庫

然而如果是在 CI(自動化部署)環(huán)境中,我們希望 MongoDB 啟動后自動創(chuàng)建需要的數(shù)據(jù)庫和用戶,而不是每次都要手動創(chuàng)建,這時應(yīng)該怎么辦呢?

這時候要借助一個 Docker 下的特殊目錄:docker-entrypoint-init.d。

該目錄下可以自定義腳本文件,在容器第一次啟動時自動執(zhí)行。mongo 鏡像可以識別該目錄下的 .sh 和 .js 文件,并按照順序執(zhí)行。

那么我們就在 /docker/mongodb 目錄下創(chuàng)建一個 mongo-init.js 文件,并在運(yùn)行容器時掛載:

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

現(xiàn)在在該文件中編寫初始化邏輯,比如創(chuàng)建一個用戶:

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

提示:docker-entrypoint-init.d 目錄下的腳本只會在第一次運(yùn)行容器的時候執(zhí)行。如果通過 -v 掛載過數(shù)據(jù),那么就不是第一次。可以去掉 -v 模擬第一次運(yùn)行。

上面的 JS 文件中可以訪問 db 對象,因為它在 mongosh 環(huán)境下執(zhí)行。默認(rèn)情況下,db 代表 “test” 數(shù)據(jù)庫。

如果我們要切換數(shù)據(jù)庫,命令是 use <db_name>。然而在 JS 文件中,顯然這種語法是不支持的。

關(guān)于如何在 JS 文件中切換數(shù)據(jù)庫,我找了很多方法,翻了一整天的文檔,終于找到了。

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

因此,在 test_db 數(shù)據(jù)庫中創(chuàng)建/切換用戶,可以修改如下:

db = db.getSiblingDB('test_db');

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

通過 db.getSiblingDB() 方法,我們可以在 JS 腳本中創(chuàng)建多個數(shù)據(jù)庫和用戶。

如果你不想在 JS 代碼中創(chuàng)建/切換數(shù)據(jù)庫,更簡單的方法是,用環(huán)境變量 MONGO_INITDB_DATABASE 指定腳本在某個數(shù)據(jù)庫下執(zhí)行。

Docker Compose 運(yùn)行

如果你覺得運(yùn)行容器的命令太長,那么使用 Docker Compose 也是一個不錯的選擇。

首先創(chuàng)建 compose.yml 配置文件如下:

version: '3.1'

services:
  mongodb:
    image: mongo:6
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: mongo_root_pass
      MONGO_INITDB_DATABASE: test_db
    volumes:
      - '/docker/mongodb/data:/data/db'
      - '/docker/mongodb/dump:/var/dump'
      - '/docker/mongodb/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js'

然后運(yùn)行啟動命令:

$ docker compose up -d

客戶端連接到 MongoDB

在啟動 MongoDB 時,傳入 --auth 參數(shù)表示開啟授權(quán)驗證,不傳則不開啟。

如果未開啟授權(quán)驗證,連接 MongoDB 不需要賬號密碼,連接 URL 如下:

mongodb://127.0.0.1:27017

如果開啟授權(quán)驗證,則連接 URL 中必須指定數(shù)據(jù)庫、賬號、密碼,如下:

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

在《前端開發(fā)實(shí)戰(zhàn)派》的項目中使用 mongoose 連接數(shù)據(jù)庫,有了上面的 url 和用戶名密碼,連接方法如下:

const mongoose = require('mongoose')

mongoose.connect('mongodb://127.0.0.1:27017/dbname', {
   user: 'username',
   pass: 'password',
}).then(() => {
   console.log('數(shù)據(jù)庫連接成功:')
}).catch(err => {
   console.log('數(shù)據(jù)庫連接失敗:', err)
})

現(xiàn)在,你可以在我的開源項目 仿掘金博客系統(tǒng) 中添加自己的數(shù)據(jù)庫配置,項目就可以運(yùn)行起來了。

總結(jié)

前面我們從 MongoDB 的安裝、運(yùn)行配置、授權(quán)驗證等方面,全面介紹了如何用 Docker 將 MongoDB 運(yùn)行起來,并在項目中連接使用。

責(zé)任編輯:姜華 來源: 程序員成功
相關(guān)推薦

2010-12-06 09:10:02

LightSwitch

2022-12-03 18:24:13

數(shù)據(jù)能力場景

2023-11-01 20:06:32

云計算前端后端

2019-05-31 08:23:00

Oracle數(shù)據(jù)庫云渡劫

2023-02-08 09:02:05

VS Code摸魚神器

2022-06-29 10:04:01

PiniaVuex

2021-01-21 10:23:43

數(shù)據(jù)庫架構(gòu)技術(shù)

2021-08-04 09:00:53

Python數(shù)據(jù)庫Python基礎(chǔ)

2018-10-16 16:00:39

數(shù)據(jù)庫鎖舞MySQL

2020-10-15 11:18:13

Linux內(nèi)核虛擬機(jī)

2022-03-02 10:53:22

Postman工具開發(fā)

2022-08-08 10:09:08

Vitest單元測試

2011-08-03 15:14:17

Excel XP數(shù)據(jù)庫功能

2023-08-01 15:46:18

數(shù)據(jù)

2021-08-26 12:27:47

云數(shù)據(jù)庫數(shù)據(jù)庫云計算

2011-10-28 16:14:12

思杰云計算桌面虛擬化

2010-03-17 17:33:47

云計算

2009-07-24 13:11:52

敏捷開發(fā)

2021-01-21 07:31:11

Filter框架權(quán)限

2013-11-20 13:41:32

IE微軟解決方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品亚洲成在人线 | 天天搞天天操 | 精品国产一区二区三区日日嗨 | 国产日韩视频在线 | 国产精品夜间视频香蕉 | 欧美一级片在线 | 一区二区在线 | 免费观看日韩av | 91麻豆精品国产91久久久久久久久 | 国产精彩视频 | 亚洲精品美女 | 国产精品久久久久久久久久久久久久 | 成人午夜免费网站 | 精品视频亚洲 | 国产四虎 | 国产精品久久国产精品久久 | 日韩激情视频一区 | 在线观看不卡av | 精品久久中文 | 成人免费视频网站在线观看 | 中文字幕第100页 | 99av成人精品国语自产拍 | 国产视频一区二区三区四区五区 | 蜜桃传媒一区二区 | 亚洲日本激情 | 高清一区二区三区 | 操人网站 | 区一区二在线观看 | 在线成人av | 9999精品视频 | 久久久91精品国产一区二区三区 | 国产在线一区观看 | 日韩高清一区 | www.久久久久久久久久久久 | 亚洲视频中文字幕 | www.色综合| 亚洲第一网站 | 亚洲免费视频在线观看 | 国产精品观看 | 浴室洗澡偷拍一区二区 | 午夜精品一区二区三区在线视频 |