MongoDB 是一個受歡迎的開源文檔數據庫,提供高性能和極大的靈活性。但你有沒有試過將一個 MongoDB 數據庫進行容器化以供你的項目使用?如果沒有,那麼你將有機會體驗到一種全新的方式!
在本教程中,你將學習如何使用 Docker 部署、保護和管理 MongoDB 數據庫。所以繼續閱讀,成為自己部署 Docker MongoDB 容器的大師!
先決條件
本教程包含實際操作演示。為了跟隨本教程,請確保你擁有以下條件:
- 一台 Ubuntu 機器 – 本教程使用的是 Ubuntu 20.04 LTS
- A user with
sudo
permission - Docker – 本教程使用的是 Docker 20.10.9
下載 Docker MongoDB 鏡像
在部署和管理 Docker MongoDB 容器之前,你需要從 Docker Hub 下載一個 MongoDB 鏡像,以便在本地運行 MongoDB 容器。
運行以下docker
命令來下載由Docker Hub托管的MongoDB Community Edition(CE)映像(pull mongo
)。撰寫時的最新版本為4.2。
如下所示,該命令會自動拉取最新版本的映像並標記為latest。

現在運行以下docker images
命令來列出伺服器上所有可用的映像。
如下所示,MongoDB映像被標記為latest。

部署Docker MongoDB容器
使用下載的MongoDB映像,您現在可以部署一個MongoDB容器。您將使用mongo可執行文件初始化MongoDB容器,創建一個數據目錄。然後,您將定義Docker容器的數據區域與主機機器之間的映射。
1. 運行以下mkdir
命令來創建名為mongodata
的數據目錄,用於存儲MongoDB數據庫和日誌。
2. 接下來,執行以下docker run
命令來創建一個名為mymongo
的容器。此外,容器在啟動時使用互動式伪TTY(-it
),以便在啟動容器時顯示輸出。
最後,新建的目錄mongodata綁定(-v
)到內部目錄/data/db。使用-d
選項以detached mode啟動容器,使其作為後台進程運行並在創建時返回控制台輸出。
系統在運行容器時自動創建/data/db目錄,用於存儲在容器中進行的更改的數據。該目錄以類似於只讀模式運行,並在主機系統上實現持久數據存儲。
命令成功完成後,您將看到以下類似的輸出。

3. 最後,運行以下命令docker ps
以識別容器的ID並檢查其狀態。docker ps
命令顯示有關當前運行容器的所有信息。
與Linux中的常規
ps
命令相比,docker ps
命令具有相似功能。
在下面的輸出中,您可以看到一個Ports部分,列出了為容器分配的所有用於監聽傳入連接的端口。
在這個例子中,端口 27017 被映射到主機。下面的輸出表示您可以通過主機上的 localhost:27017 訪問該容器上的 MongoDB 實例。

也許您想查看
mymongo
容器的日誌文件,以確定在出現問題時您的 MongoDB 數據庫/實例發生了什麼。如果是這樣,請運行docker logs
命令,如下所示:sudo docker logs docker-container
。將docker-container
替換為您的 Docker 容器名稱。

將 Docker MongoDB 容器附加到 Bash Shell
您剛剛部署了一個 Docker MongoDB 容器,但是如何管理它呢?首先,使用 docker exec
命令將 Docker 容器附加到 Bash Shell。
將容器附加到 Bash Shell 是至關重要的,因為容器目前正在以分離模式運行(在後台運行)。如果容器在後台運行,則容器既不會接收任何輸入,也不會顯示輸出。
運行下面的 docker exec
命令 來將容器(mymongo
)附加到 Bash Shell。
當命令完成時,您的提示符將變為以下內容。唯一的字母數字編號(77782fa95314)是容器 ID。
容器ID是避免命名冲突和有效识别主机之间容器的关键,所以尽量不要更改它们。

现在运行mongo
命令,没有任何参数,以登录容器(mymongo)中的MongoDB shell。MongoDB shell是您运行mongo查询/命令的地方。
一旦您进入容器,您可以在不添加
sudo
前缀的情况下运行任何命令,因为您现在是容器内的root用户。您在容器中进行的任何更改都不会影响您的主机系统。
通过查看下面显示的提示,您可以知道您现在在MongoDB shell中。

如果您想在MongoDB shell中查看所有可用命令,请运行下面显示的
help
命令。

创建一个管理员MongoDB用户
在您部署MongoDB服务器到Docker容器之后,您将创建一个管理员MongoDB用户。管理员用户可以让您连接到MongoDB服务器并管理数据库。
1.再次登录MongoDB shell,并运行下面的use
命令,首先切换到admin
数据库。这样可以为管理员用户提供管理数据库的权限。

複製並將以下代碼貼到MongoDB提示符中以創建管理員使用者。
下面的代碼使用db.createUser()
方法創建具有管理角色的使用者。下面的用戶名(user
)和密碼(pwd
)是硬編碼的,您可以根據喜好進行更改。
如果代碼正確,您將在MongoDB提示符中收到以下消息。

3.執行下面的quit()
查詢以退出MongoDB shell。
4.最後,運行以下mongo
命令以通過連接到MongoDB服務器來測試您創建的管理員使用者(ata
)。在提示時輸入管理員使用者的密碼。
正如您在下面看到的,如果成功連接到服務器,MongoDB服務器將打印出MongoDB服務器版本。

也許您想進一步測試管理使用者。如果是的話,請執行以下命令來顯示資料庫中的所有使用者。
下面,您可以看到您創建的管理使用者在列表中。

創建 MongoDB 資料庫
在 Docker 中管理 MongoDB 容器時,如果不創建資料庫,將無法完整進行操作。您將創建一個新的 MongoDB 資料庫,並通過 MongoDB shell 將資料存儲其中。
1. 在 Docker 容器的互動式會話中,執行下面的 show dbs
命令以列出伺服器中的所有資料庫。
下面,您可以看到一個 admin 資料庫、一個 config 資料庫和一個 local 資料庫。MongoDB shell 在每個 MongoDB 伺服器上默認創建這些資料庫。

2. 接下來,執行下面的 use
命令 來創建一個新的資料庫。將 <database_name>
替換為您選擇的資料庫名稱。但是,對於這個例子,資料庫名稱為 linux
。
如果存在,
use
查詢將當前資料庫切換為您指定的資料庫。如果不存在,use
查詢將創建一個新的資料庫並自動切換到該資料庫。

3. 重新執行 show dbs
命令,就像您之前做的(第一步),以查看您創建的資料庫是否存在。
仍然看不到新建的数据库(linux)在列表上?MongoDB只有在您第一次存储数据时才会建立数据库。这些数据可以是集合甚至是文档的形式。

4. 现在将下面的代码复制/粘贴到MongoDB shell,并按下Enter键。
下面的代码创建了一个名为linux_version
的新集合,您可以根据自己的喜好更改名称。该集合以键值对的格式包含数据。
在下面的输出中,您可以看到已创建了linux_version
集合,并且附带了一个ObjectID。

5. 运行show collections
命令以查看集合列表,看是否存在新的linux_version
集合。
从下面可以看到,您已成功创建了linux_version集合。

6. 最後,執行以下命令來查看和確認你在 linux_version
集合中插入的數據是否正確。使用 pretty() 方法可以以人類可讀的格式查看數據。
如果你需要修改數據庫中的數據,請使用
Update()
方法。
你可以看到下面的輸出以更易讀的格式呈現。

重新啟動 Docker MongoDB 容器
到目前為止,你已經成功運行了 Docker MongoDB 容器。但如果你不再需要這個容器,或者它不起作用該怎麼辦?幾個 Docker 命令可以幫助停止、重新啟動甚至刪除 MongoDB Docker 容器。
1. 執行以下命令 docker ps
以列出所有運行中的容器。
請注意你希望停止、重新啟動或刪除的容器的名稱和容器 ID,如下所示。

2. 然後,執行以下任一 docker stop
命令以停止運行中的 MongoDB 容器。
3. 重新執行 docker ps
命令,如之前所做(第一步),檢查容器是否已關閉。
如下所示,容器不在運行中的容器列表中,這表示你已成功停止了容器。

4. 如果您决定重新启动容器,请运行以下任一docker start
命令。
5. 最后,重新运行docker ps
命令,以查看容器是否正在运行。
也许您不再需要一个容器。如果是这样,请先停止容器,然后运行
rm
命令删除容器,如下所示:sudo docker container rm mongodb
。与前面的示例类似,将mongodb
替换为容器名称或容器ID。
结论
在本教程中,您学会了如何通过创建管理员用户来部署和管理Docker MongoDB容器,以创建数据库并将数据存储其中。您已经意识到,您可以停止、重新启动和删除不再需要的容器,以保持Docker镜像的清洁。
使用Docker部署和管理MongoDB是利用容器化技术和减少开销的第一步。为什么不利用这一步骤来进一步探索MongoDB,并了解Docker MongoDB容器如何帮助您的项目呢?