使用 Docker 執行 MongoDb
在之前的筆記中 使用 Node.js + express 建立一個電子商務後端服務的 REST API 已有紀錄了使用 https://cloud.mongodb.com/ 線上的免費服務版本的 MonogoDb,本篇再把 Docker 版的 MongoDb 也一併紀錄下來。把如何使用 docker (docker compose) 來快速設置 MongoDb 及其管理工具 MongoDb Compass 的相關設定過程寫下來。
檢查是否已安裝了 Docker (docker version)
$ docker version
Client: Docker Engine - Community
Version: 20.10.23
API version: 1.41
Go version: go1.18.10
Git commit: 7155243
Built: Thu Jan 19 17:36:25 2023
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.23
API version: 1.41 (minimum version 1.12)
Go version: go1.18.10
Git commit: 6051f14
Built: Thu Jan 19 17:34:14 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.16
GitCommit: 31aa4358a36870b21a992d3ad2bef29e1d693bec
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
檢查是否已安裝了 docker compose
$ docker compose version
Docker Compose version v2.15.1
建置專案
目錄結構
$ mkdir mkdir mongodb && cd mongodb
$ touch init-mongo.js docker-compose.yml
./mongodb
├── docker-compose.yml
└── init-mongo.js
建立 docker-compose.yml
在這個 compse command file 中指令與說明如下:
version: '3.8'
services:
db:
container_name: mongo_db
image: mongo
restart: always
environment:
- MONGO_INITDB_DATABASE=mongo-db
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=<password>
ports:
- '27017-27019:27017-27019'
volumes:
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro # 設置環境的設定檔
- ./mongo-volume:/data/db # 保存資料的目錄
建立 init-mongo.js
這用檔案的用途是給 docker compose 啟動時設置環境用。
db.createUser(
{
user : "admin",
pwd : "admin1911",
roles : [
{
role : "readWrite",
db : "mongo-db"
}
]
}
)
執行 docker compose
上述的目錄與檔案內容準備完成後,在與 docker-compose.yml 的相同目錄中執行 docker compose up -d
來啟動 MongoDb Container Services,啟動成功後使用 `$ docker ps` 指令查看容器啟動狀況
$ docker compose up -d
# ...
[+] Running 2/0
⠿ Network mongodb_default Created 0.0s
⠿ Container mongo_db Created 0.0s
Attaching to mongo_db
...
查看 docker 執行的情況
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d3924dcd94e mongo "docker-entrypoint.s…" About a minute ago Up 12 seconds 0.0.0.0:27017-27019->27017-27019/tcp, :::27017-27019->27017-27019/tcp mongo_db
使用 MongoDb Compass 連結到 Mongo DB
打開 MongoDb Compass 應用程式
第一次開啟時要設定 Connections String 後按下 Connect 按鈕。Connection String 格式如:mongodb://
連結成功後,點選畫面下方的 ‘CREATE DATABASE’
再輸入 Database Name 及 Collection Name(即 Document 或稱 Table Name),按下"Create Database"
資料庫及表單 建立完成,如下圖。
新增資料
要新增資料到 Collection 中,按下"ADD DATA"按鈕,可選擇二種方式來進行
- Import File
- Insert Document
方法一 Import File
匯入檔案的格式可以是 Json 或 CSV
方法二 Insert Document
可直接在此功能中輸入 JSON 格式資料來新增資料到 collection 中。
[
{
"imageName": "offer1",
"title": "10% off on personal cares",
"handsetCols": 2,
"handsetRows": 1,
"webCols": 2,
"webRows": 1
},
{
"imageName": "offer2",
"title": "Flash sales in Footwears",
"handsetCols": 2,
"handsetRows": 1,
"webCols": 1,
"webRows": 1
},
{
"imageName": "offer3",
"title": "Extended warranty for Apple products",
"handsetCols": 2,
"handsetRows": 1,
"webCols": 1,
"webRows": 2
},
{
"imageName": "offer4",
"title": "5% discount for grocery",
"handsetCols": 2,
"handsetRows": 1,
"webCols": 1,
"webRows": 1
}
]
新增成功畫面:
資料庫的實際檔案存放在 Local 的 ./pgdbdata 目錄中
使用作業系統管理者權限來查看此目錄
$ ls -al ./mongo-volume/
[總用量 528
drwxr-xr-x 5 systemd-coredump root 4096 2月 8 20:46 .
drwxrwxr-x 3 egs egs 4096 2月 8 12:37 ..
-rw------- 1 systemd-coredump root 86 2月 8 12:54 .bash_history
-rw------- 1 systemd-coredump systemd-coredump 20480 2月 8 20:14 collection-0-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 20480 2月 8 20:45 collection-0-5598796086185130121.wt
-rw------- 1 systemd-coredump systemd-coredump 36864 2月 8 20:15 collection-2-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 36864 2月 8 20:34 collection-4-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 20480 2月 8 20:24 collection-7-3111193408736420755.wt
drwx------ 2 systemd-coredump systemd-coredump 4096 2月 8 20:47 diagnostic.data
-rw------- 1 systemd-coredump systemd-coredump 20480 2月 8 20:14 index-1-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 20480 2月 8 20:45 index-1-5598796086185130121.wt
-rw------- 1 systemd-coredump systemd-coredump 36864 2月 8 20:15 index-3-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 36864 2月 8 20:34 index-5-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 36864 2月 8 20:34 index-6-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 20480 2月 8 12:37 index-8-3111193408736420755.wt
-rw------- 1 systemd-coredump systemd-coredump 20480 2月 8 20:24 index-9-3111193408736420755.wt
drwx------ 2 systemd-coredump systemd-coredump 4096 2月 8 20:14 journal
-rw------- 1 systemd-coredump systemd-coredump 36864 2月 8 20:30 _mdb_catalog.wt
drwx------ 3 systemd-coredump systemd-coredump 4096 2月 8 12:37 .mongodb
-rw------- 1 systemd-coredump systemd-coredump 2 2月 8 20:14 mongod.lock
-rw------- 1 systemd-coredump systemd-coredump 36864 2月 8 20:46 sizeStorer.wt
-rw------- 1 systemd-coredump systemd-coredump 114 2月 8 12:37 storage.bson
-rw------- 1 systemd-coredump systemd-coredump 50 2月 8 12:37 WiredTiger
-rw------- 1 systemd-coredump systemd-coredump 4096 2月 8 20:14 WiredTigerHS.wt
-rw------- 1 systemd-coredump systemd-coredump 21 2月 8 12:37 WiredTiger.lock
-rw------- 1 systemd-coredump systemd-coredump 1475 2月 8 20:46 WiredTiger.turtle
-rw------- 1 systemd-coredump systemd-coredump 86016 2月 8 20:46 WiredTiger.wt