啟動一個基本可用的MongoDB服務相對簡單,只要使用MongoDB官方提供的Image,設定對應的連接阜(Port)、使用者(User)、以及要存放資料的位置(如果想要保存在Host主機上的話)即可。
以下以專案名稱:nextpage為例:
我們使用 MongoDB 6.0.4 的官方 image 來建立一個 service:
version: "2"
services:
mongodb:
image: mongo:6.0.4
container_name: mongodb
restart: unless-stopped
volumes:
- MONGO_VOLUMES:/data/db
ports:
- 27017:27017
volumes:
MONGO_VOLUMES:
MONGO_VOLUMES的volume來保存Mongodb的資料。
圖: Inbound Rule: TCP 27017
這樣就啟動了一個可連線的MongoDB。
但除了基本的連線環境外,對於專案的使用來說,還需要進一步的設定,主要包含以下兩個方面:
下面進一步介紹如何進行這些設定:
這部分會對MongoDB服務做以下設定:
authentication enabled模式啟動,驗證User在Database的操作。nextpage,並新增一個具備Read / Rrite這個Database權限的User。整個檔案結構如下:
├── docker-compose.yml
├── mongodb
│   └── initdb.d
│       └── nextpage.js
docker-entrypoint-initdb.d目錄下存在script檔案,在啟動MongoDB時,會自動use MONGO_INITDB_DATABASE指定的資料庫,並執行scrip內的指令。下面說明把Script 掛載進Container的方式:
docker-entrypoint-initdb.d這個接口,來讓容器啟動時執行一些初始化script。以我們專案使用的例子來說,可在docker-compose如下設定:
…
volumes:
- ./mongodb/initdb.d/:/docker-entrypoint-initdb.d/
…
/mongodb/initdb.d mount 到 容器的路徑:/docker-entrypoint-initdb.d。這樣在容器啟動執行MongoDB時,就會自動執行被mount進去/docker-entrypoint-initdb.d下面的nextpage.js。version: "2"
services:
  mongodb:
    image: mongo:6.0.4
    container_name: mongodb
    restart: unless-stopped
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=root
      - MONGO_INITDB_DATABASE=nextpage
    volumes:
      - ./mongodb/initdb.d/:/docker-entrypoint-initdb.d/
      - MONGO_VOLUMES:/data/db
    ports:
     - 27017:27017
volumes:
  MONGO_VOLUMES:
其中:
docker-entrypoint-initdb.d/的路徑。nextpage
authentication enabled 的模式啟動 (等同於使用指令: mongod — auth),也就是所有操作都會驗證User的權限。Authentication Database會是admin這個Database。所以如果要用這個root登入,連線的connection string必須指定authSource為admin
例如:
mongodb://root:root@Server的URL:27017/nextpage?serverSelectionTimeoutMS=5000&connectTimeoutMS=10000&authSource=admin&authMechanism=SCRAM-SHA-256
Authentication Database。Authentication Database + User當作User權限驗證的唯一識別,並且存在admin這個database的collection: system.users。admin及 Authentication Database的關聯system.users 裡面。Authentication Database。mongodb/initdb.d/nextpage.js 中:
action_record 和 food_record 這兩個 Collection,來存放我們專案要紀錄的使用者訓練及飲食紀錄。developer
下面是mongodb/initdb.d/nextpage.js 的內容
db.createCollection("action_record");
db.createCollection("food_record");
// 已經在MONGO_INITDB_DATABASE指定過資料庫名稱,所以預設就是使用`nextpage`這個Database,
// 不用加上use nextpage
db.createUser({
 user: "developer",
 // 在mongo shell 操作時可以用passwordPrompt, 輸入完指令後自己打密碼進去
 // 這邊因為是給測試用docker自動執行的指令,所以直接指定密碼 (cleartext password)
 pwd: "1qaz2wsx..",
 // 任何額外資訊
 customData: { name: "Henry" },
 roles: [
  // 針對當前db(nextpage)的role可以直接用字串指定role name
  "readWrite",
  // 針對其他db的role需要用 object: {role: "role name", db: "db name"}
  // Note: db: "" 代表for 所有database
  { role: "clusterAdmin", db: "admin" },
  { role: "readAnyDatabase", db: "admin" },
 ]
},)
.js 或 .sh的腳本檔案。可用的資源,以及可對資源做的操作:MongoDB的Role又分成Built-in及自訂Role,及其他種類:
1.Built-in Role
Database administration Role 及 一般(非admin)database的Built-in role2.Admin相關 Role:只針對admin這個database的Role。
3.其他:
本篇文章說明如何以Docker啟動一個MongoDB服務:
/docker-entrypoint-initdb.d/,目的是將我們寫的script掛載到Container,讓他啟動時自動執行初始設定。至此,我們在EC2上執行的基礎設施: Kafka, MongoDB,以及我們開發的BotServer程式都已經設置完成。
下一篇將說明OpenAI的基礎觀念,以及API的實作。
本文修改自作者的blog文章: [Mongo] 如何使用Docker Compose設置一個包含初始資料庫和使用者驗證的MongoDB Service