使用 Docker 快速建立 MongoDB 測試環境 使用 Docker 和 Docker Compose 快速建立 MongoDB 測試環境

Published on Friday, March 24, 2023

Docker MongoDB

最近在學習 MongoDB 的基礎,需要快速建立出一個練習環境,因為只會輸入練習用的資料所以資料不需要持久化因此這次使用 Docker 來建立我們的環境
首先看看 MongoDB 的官方安裝文檔 這邊官方文檔是使用 mongodb/mongodb-community-server 這個 image ,此 image 是由 mongodb 官方負責維護的
不過還有另一個比較多人使用的 image mongo 這個是由 docker 官方社區負責維護的,可以按照自己的需求進行挑選,這篇文章將使用 mongo 這個 image

既然是 docker 官方社區負責維護的那麼相關的 Dockerfile 一定會在 Github 上面進行開源,我們順便看看 Dockerfile 裡面寫了什麼內容 Github
大致閱讀完後可以得知以下資訊

  • 此 image 是選用 ubuntu 作為底層
  • 分別建立 mongodb group and user
  • 建立兩個路徑 /data/db /data/configdb 並更改所有權給剛剛建立的 mongodb group and user
  • 安裝並設定 gosu 之後用來降低 service 權限,由原本的 root user 改成 mongodb user
  • keyserver.ubuntu.com 下載gpg public key 並保存成 mongodb.gpg
  • 添加 mongodb 第三方倉庫來源
  • 下載對應版本的 mongodb 並且安裝 mongodb-orgmongodb-org-servermongodb-org-shellmongodb-org-mongosmongodb-org-tools
  • 建立兩個 docker volume /data/db /data/configdb 這兩個路徑底下的資料會進行持久化保存
  • 將 HOME 環境變數修改成 /data/db
  • 開啟 27017 Port 並運行 docker-entrypoint.sh mongod

基本上 Docker 流程與直接本機 Ubuntu 安裝流程相同,那麼接下來就實際將 mongodb docker image 運行起來

docker run --name mongo -d mongo:latest
$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE          COMMAND                         CREATED         STATUS         PORTS       NAMES
c0301a9af2d46613329d3e508f81557bb10c1c394fb329c278abdd28022e24e5   mongo:latest   "docker-entrypoint.sh mongod"   2 minutes ago   Up 2 minutes   27017/tcp   mongo

接下來我們進入 mongodb container 內部看看

docker exec -it c03 bash

可以輸入 TOP 命令查看目前運行的程序,可以看到 PID 1 為 mongod 並且運行的 user 為 mongodb

top - 09:00:15 up 64 days, 17:07,  0 users,  load average: 4.20, 8.64, 11.10
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.6 us, 10.5 sy,  0.1 ni, 75.3 id,  0.1 wa,  0.0 hi,  0.5 si,  0.0 st
MiB Mem :  32174.8 total,   2129.9 free,  20609.6 used,   9435.3 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  10717.2 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                           
    1 mongodb   20   0 2600660 124832  63808 S   0.7   0.4   0:04.43 mongod                            
   56 root      20   0    4616   3732   3156 S   0.0   0.0   0:00.05 bash                              
   69 root      20   0    7360   3492   2904 R   0.0   0.0   0:00.00 top     

我們輸入 ls /usr/bin -l | grep "mongo" 會發現預設裝了許多的軟體

root@c0301a9af2d4:~# ls /usr/bin -l | grep "mongo"
-rwxr-xr-x 1 root root   140783984 Dec 19  2013 mongod
-rwxr-xr-x 1 1000   1000  15828424 Mar  1 14:40 mongodump
-rwxr-xr-x 1 1000   1000  15522960 Mar  1 14:40 mongoexport
-rwxr-xr-x 1 1000   1000  16383648 Mar  1 14:40 mongofiles
-rwxr-xr-x 1 1000   1000  15784248 Mar  1 14:40 mongoimport
-rwxr-xr-x 1 1000   1000  16160976 Mar  1 14:40 mongorestore
-rwxr-xr-x 1 root root   102737736 Dec 19  2013 mongos
-rwxr-xr-x 1 1000   1000  97206776 Feb 28 14:13 mongosh
-rwxr-xr-x 1 1000   1000  15385656 Mar  1 14:40 mongostat
-rwxr-xr-x 1 1000   1000  14957432 Mar  1 14:40 mongotop

這邊可以使用 mongosh 會開啟一個 MongoDB shell 讓你可以直接跟 MongoDB 互動

root@c0301a9af2d4:~# mongosh
Current Mongosh Log ID: 641d69fd6288c45b7d629ba5
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.8.0
Using MongoDB:          6.0.5
Using Mongosh:          1.8.0

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

------
   The server generated these startup warnings when booting
   2023-03-24T08:51:59.168+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2023-03-24T08:51:59.168+00:00: vm.max_map_count is too low
------

------
   Enable MongoDB's free cloud-based monitoring service, which will then receive and display
   metrics about your deployment (disk utilization, CPU, operation statistics, etc).
   
   The monitoring data will be available on a MongoDB website with a unique URL accessible to you
   and anyone you share the URL with. MongoDB may use this information to make product
   improvements and to suggest MongoDB products and deployment options to you.
   
   To enable free monitoring, run the following command: db.enableFreeMonitoring()
   To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
------

test> 

輸入命令 db.runCommand( { hello: "container" }) 來插入一筆資料

test> db.runCommand( { hello: "container" })
{
  isWritablePrimary: true,
  topologyVersion: {
    processId: ObjectId("641d64ae0810439e7907dc76"),
    counter: Long("0")
  },
  maxBsonObjectSize: 16777216,
  maxMessageSizeBytes: 48000000,
  maxWriteBatchSize: 100000,
  localTime: ISODate("2023-03-24T09:16:17.507Z"),
  logicalSessionTimeoutMinutes: 30,
  connectionId: 9,
  minWireVersion: 0,
  maxWireVersion: 17,
  readOnly: false,
  ok: 1
}

以上便是最基本的操作,不過如果每次要操作 mongodb 都要進入 container 內部會有點麻煩
可以直接在運行 docker exec 時改成直接運行 mongosh 不進入bash,也可以達到一樣的效果

docker exec -it c03 mongosh

Docker Compose MongoDB

或是另外使用 mongo-express 這個 image,會額外啟動一個 UI 能夠直接操作 MongoDB 我們這邊直接建立一個 docker-compose.yml 方便以後測試

# docker-compose.yml
services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
docker compose up -d
$ docker compose up -d
[+] Running 9/9
 ⠿ mongo-express Pulled                                                                           6.4s
   ⠿ 6a428f9f83b0 Pull complete                                                                   0.4s
   ⠿ f2b1fb32259e Pull complete                                                                   2.5s
   ⠿ 40888f2a0a1f Pull complete                                                                   2.7s
   ⠿ 4e3cc9ce09be Pull complete                                                                   2.9s
   ⠿ eaa1898f3899 Pull complete                                                                   3.1s
   ⠿ ab4078090382 Pull complete                                                                   5.8s
   ⠿ ae780a42c79e Pull complete                                                                   6.0s
   ⠿ e60224d64a04 Pull complete                                                                   6.1s
[+] Running 3/3
 ⠿ Network hello_default            Created                                                       0.1s
 ⠿ Container hello-mongo-express-1  Started                                                       1.0s
 ⠿ Container hello-mongo-1          Started                                                       1.0s

此範例會建立一個獨立的 Docker network 並且開放 8081 port
之後只要訪問 8081 port 就能看到我們的管理頁面了


Summary

今天成功透過 docker 來建立一個可以使用的測試環境,並且了解了 Dockerfile 裡面的相關內容
最後建立一個 docker-compose.yml 方便我們之後可以快速的建立出一個完整的測試環境出來