使用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,會出現使用提示。
1.2 Ubuntu 使用 Docker-CE
Docker-CE即Community Edition,是可供個人免費使用的docker社群版本。
在Ubuntu安裝Docker-CE時,推薦使用阿里雲提供的映象,可以加快安裝下載速度
- 首先apt重新整理快取,並安裝一些必要的工具
sudo apt update sudo apt -y install apt-transport-https ca-certificates curl software-properties-common
- 然後新增證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
- 向apt包管理器新增用於安裝Docker-CE的源地址,此處使用阿里雲提供的地址
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
- 使用apt安裝Docker-CE
sudo apt -y update sudo apt -y install docker-ce
- 開啟終端輸入docker,可以看到使用提示
2 換源
由於Docker預設使用的是hub.docker.com提供的映象,在國內連線速度較慢,因此建議使用國內映象。
如果使用的是Docker Desktop:
點選工作列上的docker小圖示,然後點選設定的齒輪按鈕,在Docker Engine選項中,在registry- mirrors中加入映象地址,此處使用的是網易提供的映象。然後點選Apply & Restart 按鈕
如果使用的是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,使用的映象,對映到的埠,以及容器的名字。
使用容器ID或者容器別名都可以連線到這個容器,例如:
docker exec -it mongodb1 /bin/bash
可以看到已經進入容器內部。然後使用mongo命令操作資料庫:
mongo -u mongoroot
此處-u 後寫剛才建立容器時設定的root許可權使用者的使用者名稱,隨後根據提示輸入密碼
需要注意的是,輸入密碼的過程中,密碼是不會在終端上顯示的,輸入之後直接按回車鍵即可。
成功進入MongoDB Shell:
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()
mongo會給每個文件自動新增"_id",提供一個類似主鍵(唯一序號)的功能
接下來建立使用者leader,併為其賦予該資料庫的管理許可權:
db.createUser({user:"leader", pwd:"123456", roles:[{role: "dbAdmin", db: "mathgroup"}]})
下一次連線mongodb時,使用leader使用者連線:
mongo -u leader --authenticationDatabase "mathgroup"
輸入密碼後檢視所有資料庫:
show dbs
發現只能看到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"))