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-org
、mongodb-org-server
、mongodb-org-shell
、mongodb-org-mongos
、mongodb-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 方便我們之後可以快速的建立出一個完整的測試環境出來