如何部署和管理Docker MongoDB容器

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。

sudo docker pull mongo

如下所示,該命令會自動拉取最新版本的映像並標記為latest

Pulling mongo image

現在運行以下docker images命令來列出伺服器上所有可用的映像。

sudo docker images

如下所示,MongoDB映像被標記為latest

Listing all Docker images

部署Docker MongoDB容器

使用下載的MongoDB映像,您現在可以部署一個MongoDB容器。您將使用mongo可執行文件初始化MongoDB容器,創建一個數據目錄。然後,您將定義Docker容器的數據區域與主機機器之間的映射。

1. 運行以下mkdir命令來創建名為mongodata的數據目錄,用於存儲MongoDB數據庫和日誌。

sudo mkdir -p /mongodata

2. 接下來,執行以下docker run命令來創建一個名為mymongo的容器。此外,容器在啟動時使用互動式伪TTY(-it),以便在啟動容器時顯示輸出。

最後,新建的目錄mongodata綁定(-v)到內部目錄/data/db。使用-d選項以detached mode啟動容器,使其作為後台進程運行並在創建時返回控制台輸出。

系統在運行容器時自動創建/data/db目錄,用於存儲在容器中進行的更改的數據。該目錄以類似於只讀模式運行,並在主機系統上實現持久數據存儲。

sudo docker run -it -v mongodata:/data/db --name mymongo -d mongo

命令成功完成後,您將看到以下類似的輸出。

Deploying MongoDB Container

3. 最後,運行以下命令docker ps以識別容器的ID並檢查其狀態。docker ps命令顯示有關當前運行容器的所有信息。

與Linux中的常規ps命令相比,docker ps命令具有相似功能。

sudo docker ps

在下面的輸出中,您可以看到一個Ports部分,列出了為容器分配的所有用於監聽傳入連接的端口。

在這個例子中,端口 27017 被映射到主機。下面的輸出表示您可以通過主機上的 localhost:27017 訪問該容器上的 MongoDB 實例。

Checking Docker MongoDB Container Status

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

Reading Docker Container Log File

將 Docker MongoDB 容器附加到 Bash Shell

您剛剛部署了一個 Docker MongoDB 容器,但是如何管理它呢?首先,使用 docker exec 命令將 Docker 容器附加到 Bash Shell。

將容器附加到 Bash Shell 是至關重要的,因為容器目前正在以分離模式運行(在後台運行)。如果容器在後台運行,則容器既不會接收任何輸入,也不會顯示輸出。

運行下面的 docker exec 命令 來將容器(mymongo)附加到 Bash Shell。

sudo docker exec -it mymongo bash

當命令完成時,您的提示符將變為以下內容。唯一的字母數字編號(77782fa95314)是容器 ID。

容器ID是避免命名冲突和有效识别主机之间容器的关键,所以尽量不要更改它们。

Attaching Docker MongoDB Container to Bash Shell

现在运行mongo命令,没有任何参数,以登录容器(mymongo)中的MongoDB shell。MongoDB shell是您运行mongo查询/命令的地方。

一旦您进入容器,您可以在不添加sudo前缀的情况下运行任何命令,因为您现在是容器内的root用户。您在容器中进行的任何更改都不会影响您的主机系统。

mongo

通过查看下面显示的提示,您可以知道您现在在MongoDB shell中。

Logging in to the MongoDB shell

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

Listing Available Commands in MongoDB Shell

创建一个管理员MongoDB用户

在您部署MongoDB服务器到Docker容器之后,您将创建一个管理员MongoDB用户。管理员用户可以让您连接到MongoDB服务器并管理数据库。

1.再次登录MongoDB shell,并运行下面的use命令,首先切换到admin数据库。这样可以为管理员用户提供管理数据库的权限。

use admin
Switching to the Admin Database

複製並將以下代碼貼到MongoDB提示符中以創建管理員使用者。

下面的代碼使用db.createUser()方法創建具有管理角色的使用者。下面的用戶名(user)和密碼(pwd)是硬編碼的,您可以根據喜好進行更改。

# 創建管理員使用者
db.createUser(
{
	# 設置管理員使用者的用戶名
	user: "ata",
	# 設置管理員使用者的密碼
	pwd: "password123",
	# 設置管理員使用者的角色
	roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

如果代碼正確,您將在MongoDB提示符中收到以下消息。

Creating an Administrative New User

3.執行下面的quit()查詢以退出MongoDB shell。

quit()

4.最後,運行以下mongo命令以通過連接到MongoDB服務器來測試您創建的管理員使用者(ata)。在提示時輸入管理員使用者的密碼。

mongo -u ata -p --authenticationDatabase admin

正如您在下面看到的,如果成功連接到服務器,MongoDB服務器將打印出MongoDB服務器版本。

Connecting to the MongoDB Server

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

use admin
show users

下面,您可以看到您創建的管理使用者在列表中。

Listing Users in Database

創建 MongoDB 資料庫

在 Docker 中管理 MongoDB 容器時,如果不創建資料庫,將無法完整進行操作。您將創建一個新的 MongoDB 資料庫,並通過 MongoDB shell 將資料存儲其中。

1. 在 Docker 容器的互動式會話中,執行下面的 show dbs 命令以列出伺服器中的所有資料庫。

show dbs

下面,您可以看到一個 admin 資料庫、一個 config 資料庫和一個 local 資料庫。MongoDB shell 在每個 MongoDB 伺服器上默認創建這些資料庫。

Listing all MongoDB Databases

2. 接下來,執行下面的 use 命令 來創建一個新的資料庫。將 <database_name> 替換為您選擇的資料庫名稱。但是,對於這個例子,資料庫名稱為 linux

如果存在,use 查詢將當前資料庫切換為您指定的資料庫。如果不存在,use 查詢將創建一個新的資料庫並自動切換到該資料庫。

use <database_name>
Creating a new MongoDB Database

3. 重新執行 show dbs 命令,就像您之前做的(第一步),以查看您創建的資料庫是否存在。

show dbs

仍然看不到新建的数据库(linux)在列表上?MongoDB只有在您第一次存储数据时才会建立数据库。这些数据可以是集合甚至是文档的形式。

Listing all MongoDB Databases

4. 现在将下面的代码复制/粘贴到MongoDB shell,并按下Enter键。

下面的代码创建了一个名为linux_version的新集合,您可以根据自己的喜好更改名称。该集合以键值对的格式包含数据。

# 使用insertOne方法插入数据
db.linux_version.insertOne(
	# 要插入数据库的键值对
	{ "debian" : "11",
	"ubuntu" : "20.04",
	"rocky linux" : "8.4",
	"alma linux" : "8"
	}
)

在下面的输出中,您可以看到已创建了linux_version集合,并且附带了一个ObjectID

Showing collection with its ID

5. 运行show collections命令以查看集合列表,看是否存在新的linux_version集合。

show collections

从下面可以看到,您已成功创建了linux_version集合。

Showing List of Collections

6. 最後,執行以下命令來查看和確認你在 linux_version 集合中插入的數據是否正確。使用 pretty() 方法可以以人類可讀的格式查看數據。

db.linux_version.find().pretty()

如果你需要修改數據庫中的數據,請使用 Update() 方法。

你可以看到下面的輸出以更易讀的格式呈現。

Viewing Data from MongoDB Database

重新啟動 Docker MongoDB 容器

到目前為止,你已經成功運行了 Docker MongoDB 容器。但如果你不再需要這個容器,或者它不起作用該怎麼辦?幾個 Docker 命令可以幫助停止、重新啟動甚至刪除 MongoDB Docker 容器。

1. 執行以下命令 docker ps 以列出所有運行中的容器。

sudo docker ps

請注意你希望停止、重新啟動或刪除的容器的名稱和容器 ID,如下所示。

Showing all running docker containers

2. 然後,執行以下任一 docker stop 命令以停止運行中的 MongoDB 容器。

sudo docker stop mymongo
sudo docker stop container-ID

3. 重新執行 docker ps 命令,如之前所做(第一步),檢查容器是否已關閉。

sudo docker ps

如下所示,容器不在運行中的容器列表中,這表示你已成功停止了容器。

Listing all Containers

4. 如果您决定重新启动容器,请运行以下任一docker start命令。

sudo docker start mymongo
sudo docker start container-ID

5. 最后,重新运行docker ps命令,以查看容器是否正在运行。

sudo docker ps

也许您不再需要一个容器。如果是这样,请先停止容器,然后运行rm命令删除容器,如下所示:sudo docker container rm mongodb。与前面的示例类似,将mongodb替换为容器名称或容器ID。

结论

在本教程中,您学会了如何通过创建管理员用户来部署和管理Docker MongoDB容器,以创建数据库并将数据存储其中。您已经意识到,您可以停止、重新启动和删除不再需要的容器,以保持Docker镜像的清洁。

使用Docker部署和管理MongoDB是利用容器化技术和减少开销的第一步。为什么不利用这一步骤来进一步探索MongoDB,并了解Docker MongoDB容器如何帮助您的项目呢?

Source:
https://adamtheautomator.com/docker-mongodb/