1. 程式人生 > 資料庫 >使用Docker 部署MongoDB

使用Docker 部署MongoDB

使用 Docker 部署 MongoDB

檢視官網安裝教程後感覺直接使用包管理器安裝mongo比較複雜,本文主要介紹使用docker安裝部署mongo的方法,並對基本配置項進行自定義。保姆式全程指導。

1 使用 Docker

已經有Docker執行環境的同學可以跳過這一步

1.1 在Windows 10 使用 Docker Desktop

Docker官方推薦在Windows上使用Docker Desktop。首先下載該軟體:

https://www.docker.com/get-started

選擇Download for Windows,下載完成後按提示安裝即可。安裝期間可能會提示同時安裝WSL2核心,同意即可。

安裝完成後可能需要重啟電腦,之後便會看到工作列中出現Docker圖示。開啟Powershell執行docker,會出現使用提示。

image-20201230021821572

1.2 Ubuntu 使用 Docker-CE

Docker-CE即Community Edition,是可供個人免費使用的docker社群版本。

在Ubuntu安裝Docker-CE時,推薦使用阿里雲提供的映象,可以加快安裝下載速度

  1. 首先apt重新整理快取,並安裝一些必要的工具
sudo apt update
sudo apt -y install apt-transport-https ca-certificates curl software-properties-common
  1. 然後新增證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  1. 向apt包管理器新增用於安裝Docker-CE的源地址,此處使用阿里雲提供的地址
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  1. 使用apt安裝Docker-CE
sudo apt -y update
sudo apt -y install docker-ce
  1. 開啟終端輸入docker,可以看到使用提示

2 換源

由於Docker預設使用的是hub.docker.com提供的映象,在國內連線速度較慢,因此建議使用國內映象。

如果使用的是Docker Desktop:

點選工作列上的docker小圖示,然後點選設定的齒輪按鈕,在Docker Engine選項中,在registry- mirrors中加入映象地址,此處使用的是網易提供的映象。然後點選Apply & Restart 按鈕

image-20201230022746383

如果使用的是Docker-CE:

在終端中執行以下命令來修改/etc/docker/daemon.json即可:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hub-mirror.c.163.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3 建立 mongo 容器

開啟終端(Powershell on Windows & bash on Linux,Linux可能需要使用sudo

docker pull mongo

等待映象下載完成,接下來正式製作mongodb容器。

docker run -it --name mongodb1 \
-e MONGO_INITDB_ROOT_USERNAME=mongoroot \
-e  MONGO_INITDB_ROOT_PASSWORD=VdikAfsMhx7 \
-v /home/share/mongodb:/data/db \
-p 10001:27017 -d mongo

下面是引數解釋:

-it

[必需] 指的是為容器分配一個終端,一般來說都會加上這個引數

--name

為這個容器新增一個別名

-e MONGO_INITDB_ROOT_USERNAME

[建議] 建立mongodb的root許可權使用者,設定使用者名稱

-e MONGO_INITDB_ROOT_PASSWORD

[建議] 設定上述擁有root許可權的使用者的密碼

-v /home/share/mongodb:/data/db

[可選] 磁碟對映,將容器內的/data/db資料夾的內容對映到本機的/home/share/mongodb資料夾內。這樣之後需要備份檔案或者做檔案分析、逆向分析時就可以直接在本機上操作,不需要先進入容器再從容器中把檔案複製出來

-p 10001:27012

[必需] 與MySQL不同,mongodb預設使用的埠號為TCP27012,因此在埠對映時需要注意。埠影射時,冒號前的是本機埠,冒號後的是容器埠,這個引數的意思時,將容器內27012埠對映到本機的10001埠上,之後訪問本機的10001埠,即可連線到容器內mongodb的27012埠

-d

[必需] 在後臺執行容器。執行這條指令後,容器將在後臺執行,終端返回該容器的ID

4 使用 mongo

容器建立好後,使用exec進入容器中。實際上,現在mongo已經開始執行,使用navicat、

MongoDB Shell等工具都可以連線這個資料庫。直接進入容器內操作mongo比較簡便。

(以下命令在Linux執行時可能需要加sudo)

首先檢視當前執行中的容器

docker ps

理論上會看到所有正在執行中的容器ID,使用的映象,對映到的埠,以及容器的名字。

image-20201230033827336

使用容器ID或者容器別名都可以連線到這個容器,例如:

docker exec -it mongodb1 /bin/bash

image-20201230033900705

可以看到已經進入容器內部。然後使用mongo命令操作資料庫:

mongo -u mongoroot

此處-u 後寫剛才建立容器時設定的root許可權使用者的使用者名稱,隨後根據提示輸入密碼

需要注意的是,輸入密碼的過程中,密碼是不會在終端上顯示的,輸入之後直接按回車鍵即可。

image-20201230034054728

成功進入MongoDB Shell:

image-20201230034410104

5 配置 mongo

mongo的常見操作:

MongoDB Shell 命令 含義
show dbs 展示所有資料庫
use test 使用test資料庫(如果沒有則新建test資料庫)
show collections 檢視當前資料庫內的集合
db.createCollection("Students") 在當前資料庫內建立名為Students的集合
db.Students.insert(文件) 在Students集合中插入文件(文件具體格式後文詳述)
db.Students.find() 檢視Students集合中所有文件的所有內容

實際使用過程中,只有一個root許可權的使用者是不行的,因此需要對資料庫進行使用者許可權設定。

接下來建立一個數據庫mathgroup,並建立一個使用者leader,配置leader的許可權。

由於之前不存在mathgroup資料庫,因此首先使用use命令建立這個資料庫:

use mathgroup

在資料庫中隨意加入一些資料:

db.Questions.insert({"cate":"Easy", "Content":"1+1=?", "Answer":"2"})

檢視Question集合中的內容:

db.Questions.find()

image-20201230035808332

mongo會給每個文件自動新增"_id",提供一個類似主鍵(唯一序號)的功能

接下來建立使用者leader,併為其賦予該資料庫的管理許可權:

db.createUser({user:"leader", pwd:"123456", roles:[{role: "dbAdmin", db: "mathgroup"}]})

image-20201230040242494

下一次連線mongodb時,使用leader使用者連線:

mongo -u leader --authenticationDatabase "mathgroup"

輸入密碼後檢視所有資料庫:

show dbs

image-20201230041016922

發現只能看到mathgroup資料庫

6 其他

mongodb是NoSQL資料庫,MySQL中的表table類似於mongo中的集合collection,mongo的集合中可以儲存很多文件,文件一般是json形式,這意味著可以用json的形式在mongo中儲存各式各樣的內容。

關於文件:

mongodb的使用者控制實際上非常複雜(官方承認),但正因如此,我們可以為各種不同的場景制定合適的訪問策略

關於使用者角色【文件】:

關於使用者角色【部落格】:

你可以在Java、Python等主流語言中使用mongo,使用時主要的步驟大同小異:連線mongo,選定資料庫、使用者認證、檢索資料庫、得到資料、關閉連線。下面是一個使用Python連線Mongo的示例:

import json
import pymongo

def seekFile(fileName) -> dict:
    """
    Get a dict by filename from Mongodb Data Server

    :param fileName: The name of the file you want from mongodb
    :return: dict
    """
    client = pymongo.MongoClient(host='IP Address', port=27017)

    db = client.資料庫名
    db.authenticate("使用者名稱", "密碼")
    collection = db.集合名

    result = collection.find_one({"fileName": "{0}".format(fileName)})

    client.close()
    return result

if __name == '__main__':
    print(seekFile("John"))