使用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中保存各式各樣的內容。

關於文檔: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"))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM