使用Docker,快速佈建MongoDB + Mongo Express

Posted by MingLun Allen Wu on Wednesday, January 6, 2021

前言

最近工作時,需要寫爬蟲收集某些論壇的資料,不想要透過 pickle 或是 csv 來儲存有多層結構的資料。 但也不想要花費太多心力自行部署資料庫。

這篇筆記希望能: 透過Docker快速的部署MongoDBMongo Express

我們要做的事情是:

  • 使用 Docker 建立一個 MongoDB Container: 省去繁瑣的安裝及設定,以最短的時間建立一個MongoDB服務。
  • 使用 Docker 建立一個 Mongo Express Container: 這是一個輕量級的 MongoDB Web GUI,能夠透過網頁介面輕易地瀏覽資料結構、檔案內容。

Mongo Express 的基本介紹請參閱官方 Github

Step 1. 基本設定

在這個章節我們需要先進行基本的環境設定:

網路設定 (docker-network)

在這篇筆記中,我們會建立兩個 Docker Container,其中 Mongo ExpressMongoDB 的 GUI,兩個 Container 之間是需要連線的。

Docker Container 在建立時,可以設定不同的網路模式(Docker Network),這關係到外部與 Container 的連線,大致上可以分為幾種模式:

  • None: 外部無法與Container進行任何連線。
  • Host: 在主機A上開啟的Container B,可以直接在 <A的ip>:<B開啟的port> 取得服務
  • Bridge: 最常見的模式,可以想像成建立一個獨立的橋樑,啟動 Container 時可以指定此橋樑,則這些擁有橋樑的Container 之間可以互通有無。 (我們建立一個橋樑,並且提供給 MongoDBMongo Express,則這兩者之間就能互相連線)
  • Overlay: 適用於跨主機間的 Docker 連線。

更多 Docker Network 的細節可以參考 Docker 網路介紹 這篇文章。

建立Network

# docker network create -d <模式> <名稱>
docker network create -d bridge mongo-network  # 建立 Docker Network
docker network ls # 顯示所有的Docker Network

設定Volume (Optional)

建立 MongoDB Container時,資料會儲存在 Container 內部,在這樣的情境下是可以正常讀取/寫入的。

然而如果這個 Container 被移除(docker rm)後,裡面的資料就會全部消失了! 這好嗎? 這不好

如果只是想要測試 MongoDB 的功能,不在乎資料遺失的話,可以直接跳過這個步驟!

在建立 Container 時,通常會進行 Volume 的操作,也就是將 Container內部的某個資料夾主機上的某個實體資料夾 綁定

一榮俱榮、一損俱損,對實體資料夾的操作,也等於對Container內部的資料夾進行操作,反之亦然。

Container 內部有自己的資料夾結構,就像是個獨立的小世界,MongoDB 在執行時會將資料以某種特定的形式寫入到「某個資料夾」中。我們所要做的,就是將這個資料夾透過 volume 鏡像映射到主機的某個資料夾。

使用 Volume 有什麼好處呢?

資料儲存在實體主機上後,將不會因為 Container 的移除而消失。啟動新的 Container 時,只要在進行一次掛載,即可無痛將資料「放回」Container 中。

接下來我們先在主機上創立一個實體的資料夾,用來存放 Docker Volume 的資料(路徑可以自訂)

mkdir /mnt/mongodb

Step 2. 設定 MongoDB

Docker Image 部分使用官方提供的 Docker File: Docker Hub 連結 - MongoDB

其中也包含基本的設定文件。

下載 Docker Image

docker pull mongo:latest # 從 Docker Hub 將 Image Pull到本地端
docker image # 確認本地端現有的 Docker Image

Docker run 標籤

在建立Container時,會用到許多標籤,分別有不同的意義,接下來分別介紹:

設定環境變數 -e

在啟動 MongoDB 的 Container 時,需要設定兩個環境變數,這兩個變數是用來設定 MongoDB 的最高權限使用者帳號及密碼:

  • MONGO_INITDB_ROOT_USERNAME: 帳號
  • MONGO_INITDB_ROOT_PASSWORD: 密碼

在啟動 Container 時,會透過 -e 標籤設定。

設定 Volume -v

介紹完 Docker Volume 的好處後,在實際建立 Container 時會透過:

docker run <image名稱> -v <實體資料夾路徑>:<container中資料夾路徑>

來綁定 「主機上的實體資料夾」「Container中的資料夾」

記得在Container中的資料夾可不能隨便亂選,必須要選擇 MongoDB 實際儲存檔案的位置,這個位置可以從官方文件找到 : /data/db

docker run <image名稱> -v <實體資料夾路徑>:/data/db

設定網路模式 --network

在第一小節介紹完並創立完 Docker Network ,在建立 Container 時透過:

docker run <image名稱> --network <network名稱>

來設定使用的網路模式。

設定連線 Port -p

啟動 MongoDB Container 時, MongoDB 預設會將服務開設於 27017 port.

但可別忘了! Container 就像是一個小世界! 我們需要將小世界中的 27017 port 與 外面的主機連接在一起,這個動作稱之為 Port Forwarding:

# docker run <image名稱> -p <外部的Port>:<Container的Port>
docker run <image名稱> -p 8080:27017 # 將Container的27017連接到主機的8080 port,所以可以從主機呼叫 127.0.0.1:8080 來取得MongoDB的服務

啟動 MongoDB Container

了解各項標籤後,接下來我們看看完整指令:

docker run --name mongodb \ # 將這個Container命名為 mongodb
    -e MONGO_INITDB_ROOT_USERNAME=<USERNAME> \ # 設定環境變數
    -e MONGO_INITDB_ROOT_PASSWORD=<PASSWORD> \ # 設定環境變數
    -v /mnt/mongodb:/data/db \ # 設定Volume
    --network mongo-network \ # 在Step1. 設定的Docker Network
    -p 27017:27017 # Port Forwarding
    -d \ # 使整個Container在背景運行
    mongo:latest # 此Container要使用的Docker Image

執行後如果沒有錯誤,透過下列語法:

docker ps

應該就能看到 MongoDB 正常運行! 此時已經可以透過 pymongo 或是其他介面來進行操作。

接下來要安裝 Mongo Express 來更方便的查看 MongoDB 中的資料。

Step 3. 設定 Mongo Express

在 Step 2 了解 Docker 的各項標籤後,這個步驟非常快速!

下載 Docker Image

docker pull mongo-express:latest # 從 Docker Hub 將 Image Pull到本地端
docker image # 確認本地端現有的 Docker Image

Docker Hub 連結 - Mongo Express

環境變數 -e

MongoDB 一樣, Mongo Express 也提供了幾個環境變數讓使用者設定,這些設定的細節可以在上方連結中看到:

  • ME_CONFIG_MONGODB_SERVER : 這裡要放置的是 MongoDB container的名稱 (mongodb)
  • ME_CONFIG_MONGODB_ADMINUSERNAME: MongoDB 的最高使用者帳號 (對應到MongoDB 環境變數的MONGO_INITDB_ROOT_USERNAME)
  • ME_CONFIG_MONGODB_ADMINPASSWORD: MongoDB 的最高使用者密碼 (對應到MongoDB 環境變數的MONGO_INITDB_ROOT_PASSWORD)
  • ME_CONFIG_BASICAUTH_USERNAME: 連線至 Mongo Express 網頁時所需的登入帳號。
  • ME_CONFIG_BASICAUTH_PASSWORD: 連線至 Mongo Express 網頁時所需的登入密碼。

啟動 Mongo Express Container

我們來看看完整的指令 :

docker run --name mongo_express  \ # 將 Container 命名為 mongo_express
--network mongo-network \ # 設定 Docker network為 mongo-network (與MongoDB同一個)
-e ME_CONFIG_MONGODB_SERVER=mongodb \ # 環境變數
-e ME_CONFIG_MONGODB_ADMINUSERNAME=<USERNAME> \ # 環境變數
-e ME_CONFIG_MONGODB_ADMINPASSWORD=<PASSWORD> \ # 環境變數
-e ME_CONFIG_BASICAUTH_USERNAME=<USERNAME> \ # 環境變數
-e ME_CONFIG_BASICAUTH_PASSWORD=<PASSWORD> \ # 環境變數
-p 8081:8081 \ # Port Forwarding
-d \ # 使Container在背景運行
mongo-express:latest # 此 Container 要使用的 Docker Image

執行成功後,此時在瀏覽器輸入 127.0.0.1:8081 ,應該就會跳出登入頁面,輸入剛剛設定的環境變數 ME_CONFIG_BASICAUTH_USERNAMEME_CONFIG_BASICAUTH_PASSWORD 後,就能進入 Mongo Express 的頁面:

img

能夠透過這個頁面進行基本的:

  • Database 創建
  • Collection 創建
  • Query 指令
  • 確認 Data Schema

結語

透過 Docker 能夠在主機上快速的部署 MongoDB,不需要過多時間進行設定及安裝。

搭配 Mongo Express 能夠在三到五分鐘內建立好一套具有GUI的的完整資料庫!

祝大家都能快樂採芒果~



See Also

監控資料品質的旅程