前言
最近工作時,需要寫爬蟲收集某些論壇的資料,不想要透過 pickle
或是 csv
來儲存有多層結構的資料。 但也不想要花費太多心力自行部署資料庫。
這篇筆記希望能: 透過Docker快速的部署MongoDB
及Mongo Express
我們要做的事情是:
- 使用 Docker 建立一個
MongoDB
Container: 省去繁瑣的安裝及設定,以最短的時間建立一個MongoDB服務。 - 使用 Docker 建立一個
Mongo Express
Container: 這是一個輕量級的 MongoDB Web GUI,能夠透過網頁介面輕易地瀏覽資料結構、檔案內容。
Mongo Express 的基本介紹請參閱官方 Github
Step 1. 基本設定
在這個章節我們需要先進行基本的環境設定:
網路設定 (docker-network)
在這篇筆記中,我們會建立兩個 Docker Container,其中 Mongo Express
是 MongoDB
的 GUI,兩個 Container 之間是需要連線的。
Docker Container 在建立時,可以設定不同的網路模式(Docker Network),這關係到外部與 Container 的連線,大致上可以分為幾種模式:
None
: 外部無法與Container進行任何連線。Host
: 在主機A上開啟的Container B,可以直接在<A的ip>:<B開啟的port>
取得服務Bridge
: 最常見的模式,可以想像成建立一個獨立的橋樑,啟動 Container 時可以指定此橋樑,則這些擁有橋樑的Container 之間可以互通有無。 (我們建立一個橋樑,並且提供給MongoDB
及Mongo 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
環境變數 -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_USERNAME
及 ME_CONFIG_BASICAUTH_PASSWORD
後,就能進入 Mongo Express
的頁面:
能夠透過這個頁面進行基本的:
- Database 創建
- Collection 創建
- Query 指令
- 確認 Data Schema
結語
透過 Docker
能夠在主機上快速的部署 MongoDB
,不需要過多時間進行設定及安裝。
搭配 Mongo Express
能夠在三到五分鐘內建立好一套具有GUI的的完整資料庫!
祝大家都能快樂採芒果~