使用 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中保存各式各樣的內容。
關於文檔:https://www.runoob.com/mongodb/mongodb-insert.html
mongodb的用戶控制實際上非常復雜(官方承認),但正因如此,我們可以為各種不同的場景制定合適的訪問策略
關於用戶角色【文檔】:https://docs.mongodb.com/manual/reference/built-in-roles/
關於用戶角色【博客】:https://www.cnblogs.com/swordfall/p/10841418.html
你可以在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"))