點燈坊

失くすものさえない今が強くなるチャンスよ

使用 Docker 執行 MongoDB

Sam Xiao's Avatar 2021-10-29

若要在 macOS 使用 MongoDB,最簡單的方式就是使用 Docker。只要在 docker-compose.yml 描述好 MongoDB 設定, docker compose up -d 即可快速啟動。

Version

MongoDB 5.0.3

Docker Compose

docker-compose.yml

version: "3"

services:
  mongo:
    image: mongo:latest
    container_name: mongo
    volumes:
      - ${DATA_DIR}:/data/db
      - ${INITDB_DIR}:/docker-entrypoint-initdb.d
      - ${CONFIG_DIR}:/data/configdb
    ports:
      - ${MONGO_PORT}:27017
    restart: always
    environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_USER}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD}
  mongo-express:
    image: mongo-express:latest
    container_name: mongo-express
    ports:
      - ${MONGO_EXPRESS_PORT}:8081
    restart: always
    environment:
      - ME_CONFIG_MONGODB_URL="mongodb://${MONGO_USER}:${MONGO_PASSWORD}@mongo:27017"

第 4 行

mongo:
  image: mongo:latest
  container_name: mongo
  volumes:
    - ${DATA_DIR}:/data/db
    - ${INITDB_DIR}:/docker-entrypoint-initdb.d
    - ${CONFIG_DIR}:/data/configdb
  ports:
    - ${MONGO_PORT}:27017
  restart: always
  environment:
    - MONGO_INITDB_ROOT_USERNAME=${MONGO_USER}
    - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD}

設定 mongo service:

  • image: mongo:latest:使用 Mongo 官方所提供 image 並使用最新版本
  • container_name: mongo:設定 container 名稱
  • volumns
    • ${DATA_DIR}:/data/db:設定 host 目錄對應到 MongoDB 內部 data 目錄
    • ${INITDB_DIR}:/docker-entrypoint-initdb.d:設定 host 目錄對應到 MongoDB 內部初始化檔案目錄
    • ${CONFIG_DIR}:/data/configdb:設定 host 目錄對應到 MongoDB 內部設定檔目錄
  • ports
    • ${MONGO_PORT}:27017:設定 container 對外 port 與 MongoDB 的 port 對應
  • restart: always:若執行失敗則重新啟動
  • environment
    • MONGO_INITDB_ROOT_USERNAME=${MONGO_USER}:設定 id
    • MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD}:設定 password

17 行

mongo-express:
  image: mongo-express:latest
  container_name: mongo-express
  ports:
    - ${MONGO_EXPRESS_PORT}:8081
  restart: always
  environment:
    - ME_CONFIG_MONGODB_URL="mongodb://${MONGO_USER}:${MONGO_PASSWORD}@mongo:27017"

設定 mongo-experss service:

  • MongoDB 的 web 管理介面
  • image: mongo-express:latest:使用 MongoDB 官方所提供 image 並使用最新版本
  • container_name: mongo-express:設定 container 名稱
  • ports
    • ${MONGO_EXPRESS_PORT}:8081:設定 container 對外 port 與 Mongo Express 的 port 對應
  • restart: always:若執行失敗則重新啟動
  • environment
    • ME_CONFIG_MONGODB_URL="mongodb://${MONGO_USER}:${MONGO_PASSWORD}@mongo:27017":設定連接 MongoDB 的 id 與 password

Environment Variable

.env

DATA_DIR=.data
INITDB_DIR=.initdb
CONFIG_DIR=.configdb
MONGO_PORT=27017
MONGO_USER=admin
MONGO_PASSWORD=12345

此為 docker-compose.yml 所設定的環境變數,被獨立在 .env 中,可單獨設定,將來不用修改 docker-compose.yml

  • DATA_DIR:設定 host 儲存 data 目錄
  • INITDB_DIR:設定 host 儲存初始化檔案目錄
  • CONFIG_DIR:設定 host 儲存設定檔目錄
  • MONGO_PORT:設定 MongoDB 對外 port
  • MONGO_USER:設定 id
  • MONGO_PASSWORD:設定 password

Start MongoDB

$ docker compose up -d

使用 docker compose up 啟動 MongoDB。

-d : detach,建立 container 後,就脫離目前 process

mongo000

Mongo Express

mongo001

MongoDB 與 Mongo Express 正常啟動。

DataGrip

mongo002

以 DataGrip 連接 MongoDB。

mongo003

由於 MongoDB 是以 Docker 執行,因此 host 填 localhost,port 透過 27017 即可連接。

mongo004

DataGrip 順利連上 MongoDB。

Stop MongoDB

$ docker compose down

使用 docker compose down 結束 MongoDB,並且刪除 container,但資料仍會留在 host。

mongo005

Conclusion

  • Mongo Express 必須設定 ME_CONFIG_MONGODB_URL 才能正常啟動,不能只設定 ME_CONFIG_MONGODB_ADMINUSERNAMEME_CONFIG_MONGODB_ADMINPASSWORD

Reference

Docker Hub, mongo