在現代雲原生應用架構中,將數據庫服務容器化已是提升開發與維運效率的標準實踐。透過 Docker 部署 MongoDB,開發者能確保在不同環境中擁有一致的運行配置,大幅減少因環境差異引發的問題。容器化不僅簡化了部署流程,更提供了快速擴展、資源隔離與版本控制的彈性。本篇教學聚焦於此實務操作,從基礎的 Docker 環境準備開始,逐步引導讀者完成映像檔獲取、數據持久化配置,以及最終啟動一個功能完整的 MongoDB 服務容器。此流程是 DevOps 工作流中實現自動化部署的基礎,對於建立可擴展且易於管理的後端服務至關重要。

MongoDB 容器化部署:環境準備與服務啟動

本章節將引導您完成在 Docker 中部署 MongoDB 的初始階段。我們將聚焦於準備必要的軟體環境,並成功啟動 Docker 服務,為後續運行 MongoDB 容器打下基礎。

必要軟體與環境要求

要在本地或雲端環境中按照本章節的步驟操作,您需要具備以下條件:

  • Docker Engine:建議使用版本 1.8 或更高版本。Docker 是運行和管理容器的關鍵平台。
  • MongoDB Docker 映像檔:這是創建 MongoDB 容器的藍圖。我們將從 Docker Hub 拉取官方映像檔。

雲端環境設置(以 Amazon EC2 為例)

本範例採用 Amazon EC2 實例作為部署環境。具體配置如下:

  • 操作系統:Amazon Machine Image (AMI) Red Hat Enterprise Linux 7.1 (HVM),SSD Volume Type。
  • SSH 登錄:通過 SSH 客戶端連接到 EC2 實例。您需要準備相應的私鑰文件(例如 docker.pem)。
    ssh -i "docker.pem" ec2-user@54.174.254.96
    
    請將 "docker.pem"54.174.254.96 替換為您實際的密鑰文件路徑和 EC2 實例的公網 IP 地址。

啟動與驗證 Docker 服務

在 EC2 實例上成功登錄後,首要任務是確保 Docker 服務正在運行。

  1. 啟動 Docker 服務: 如果 Docker 服務尚未運行,您需要手動啟動它。

    sudo service docker start
    

    這個命令會向系統發送指令,啟動 Docker守護進程(daemon)。

  2. 驗證 Docker 服務狀態: 為了確認 Docker 服務是否已成功啟動並處於運行狀態,請執行狀態檢查命令。

    sudo service docker status
    

    如果 Docker 服務運行正常,您將看到類似於「Docker service is active (running)」的輸出。這表明 Docker 守護進程已經啟動,可以開始處理 Docker 命令,例如拉取映像檔和創建容器。

看圖說話:

此圖示詳細描繪了為部署 MongoDB 容器所做的環境準備工作,特別是啟動和驗證 Docker 服務的過程。首先,使用者透過 SSH 客戶端連接到 Amazon EC2 實例,該實例運行著 Red Hat Enterprise Linux 7.1 操作系統。在進入實例後,使用者執行 sudo service docker start 命令,這會啟動 Docker 服務進程,進而啟動 Docker 守護進程(Docker Daemon)。為了確認服務是否成功啟動,使用者接著執行 sudo service docker status 命令。操作系統會檢查 Docker 服務的狀態,並向使用者回報其運行情況,理想情況下會顯示為「active (running)」。一旦 Docker 服務確認運行正常,Docker Daemon 就可以開始響應使用者的 Docker 命令,例如拉取映像檔、創建和管理容器,為後續部署 MongoDB 奠定基礎。這整個流程強調了在開始任何容器化部署之前,確保基礎設施(如 Docker 服務)就緒的重要性。

MongoDB 容器化部署:映像檔下載、容器啟動與 Shell 連接

在本節中,我們將進一步深入 MongoDB 的 Docker 部署流程。這包括從 Docker Hub 下載官方映像檔、配置數據持久化來啟動 MongoDB 容器,以及如何連接到 MongoDB 的交互式 Shell。

下載 MongoDB Docker 映像檔

在啟動容器之前,我們需要獲取運行 MongoDB 所需的映像檔。

  1. 拉取官方映像檔: 使用 docker pull 命令從 Docker Hub 下載最新的 MongoDB 映像檔。

    sudo docker pull mongo:latest
    

    此命令會下載名為 mongo,標籤為 latest 的映像檔。

  2. 列出本地映像檔: 執行 docker images 命令來查看本地已下載的 Docker 映像檔列表,確認 mongo 映像檔是否已成功下載。

    sudo docker images
    

    您應該能在列表中看到 mongo 映像檔及其相關信息。

啟動 MongoDB 容器與數據持久化

MongoDB 在容器內部的默認數據存儲路徑是 /data/db。為了確保數據不會因為容器的刪除而丟失,我們需要將主機上的目錄掛載到容器的數據目錄。

  1. 創建主機數據目錄: 在主機上創建一個目錄,用於存放 MongoDB 的數據。

    sudo mkdir -p /data
    

    -p 選項確保如果父目錄不存在,也會一併創建。

  2. 啟動 MongoDB 容器: 使用 docker run 命令啟動一個新的 MongoDB 容器。

    • -v /data:/data:將主機上的 /data 目錄掛載到容器內的 /data 目錄。這實現了數據的持久化。
    • --name mongodb:為容器指定一個名稱,方便後續管理。
    • -d:讓容器在後台運行。
    • mongo:指定使用的 Docker 映像檔名稱。
    sudo docker run -d -v /data:/data --name mongodb mongo
    

    (註:原文中的 -t -i 參數通常用於啟動交互式終端,在此處後台運行時可能不是必需的,但保留也無妨。)

  3. 指定端口(可選但推薦): MongoDB 默認使用端口 27017。如果需要顯式地將容器的 27017 端口映射到主機的 27017 端口,可以使用 -p 選項:

    docker run -d -v /data:/data -p 27017:27017 --name mongodb mongo
    

    這確保了從主機或其他網絡環境可以訪問到 MongoDB 服務。

  4. 驗證容器運行狀態: 執行 docker ps 命令來查看正在運行的 Docker 容器。

    sudo docker ps
    

    您應該能看到名為 mongodb 的容器正在運行,並且映射了端口 27017

  5. 查看容器日誌: 使用 docker logs 命令可以查看容器的啟動日誌,這對於排查啟動問題非常有用。

    sudo docker logs mongodb
    

連接至 MongoDB Shell

在容器啟動並運行後,我們需要連接到 MongoDB 服務來執行數據操作。

  1. 啟動交互式終端(TTY): 首先,需要進入 MongoDB 容器的 Shell 環境。

    sudo docker exec -it mongodb bash
    

    這會為您打開一個容器內的終端會話。

  2. 啟動 Mongo Shell: 在容器的 Shell 中,執行 mongo 命令來啟動 MongoDB 的交互式客戶端(Mongo Shell)。

    mongo
    

    成功後,您將看到 MongoDB 的版本信息和 > 提示符,表示已成功連接到默認主機 (localhost) 和端口 (27017) 上的 MongoDB 實例。

  3. 指定主機和端口連接: 有時,您可能需要顯式指定連接的主機和端口,尤其是在 Docker 網絡配置較複雜時。

    • 指定主機和端口
      mongo --host localhost --port 27017
      
      或者簡寫為:
      mongo -host localhost -port 27017
      
      這會連接到本地主機的 27017 端口。
    • 僅指定端口: 如果 MongoDB 運行在本地默認端口,僅指定端口也可以。
      mongo --port 27017
      
      或者簡寫為:
      mongo -port 27017
      
    • 主機:端口格式: 另一種常見的指定方式是直接在命令後跟上 host:port
      mongo localhost:27017
      

    無論哪種方式,當連接成功後,Mongo Shell 通常會自動連接到一個名為 test 的數據庫(如果該數據庫存在或默認創建)。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "Host Machine" as HostMachine
object "MongoDB Container (mongodb)" as MongoContainer
object "MongoDB Server" as MongoServer
object "Mongo Shell (CLI)" as MongoShell

partition "MongoDB 映像檔與容器啟動" {
  User --> DockerCLI : 執行 docker pull mongo:latest
  DockerCLI --> DockerDaemon : 拉取 mongo:latest 映像檔
  DockerDaemon --> User : 下載完成
  User --> DockerCLI : 執行 sudo mkdir -p /data
  HostMachine --> User : 創建數據目錄
  User --> DockerCLI : 執行 docker run -d -v /data:/data --name mongodb mongo
  DockerCLI --> DockerDaemon : 請求創建並運行容器
  DockerDaemon --> MongoContainer : 創建 mongodb 容器
  HostMachine --> MongoContainer : 掛載 /data 到 /data/db (數據持久化)
  MongoContainer --> MongoServer : 啟動 MongoDB 伺服器
  DockerDaemon --> User : 容器運行中 (mongodb)
  User --> DockerCLI : 執行 docker logs mongodb
  DockerCLI --> DockerDaemon : 請求容器日誌
  DockerDaemon --> MongoContainer : 獲取日誌
  DockerDaemon --> User : 顯示容器啟動日誌
}

partition "連接 MongoDB Shell" {
  User --> DockerCLI : 執行 docker exec -it mongodb bash
  DockerCLI --> MongoContainer : 進入容器 Shell
  MongoContainer --> User : 提供容器 Shell 提示符
  User --> MongoShell : 執行 mongo 命令
  MongoShell --> MongoServer : 連接至 MongoDB 伺服器 (默認 localhost:27017)
  MongoServer --> User : 顯示 > 提示符 (已連接)
  User --> MongoShell : 執行 mongo -host localhost -port 27017
  MongoShell --> MongoServer : 顯式連接至 localhost:27017
  MongoServer --> User : 顯示 > 提示符 (已連接)
  User --> MongoShell : 執行 mongo localhost:27017
  MongoShell --> MongoServer : 通過 host:port 格式連接
  MongoServer --> User : 顯示 > 提示符 (已連接, 連接至 test 數據庫)
}

@enduml

看圖說話:

此圖示詳盡地展示了從下載 MongoDB Docker 映像檔到成功連接到 MongoDB Shell 的完整流程。首先,使用者透過 docker pull mongo:latest 命令從 Docker Hub 下載了官方的 MongoDB 映像檔。接著,在主機上創建了 /data 目錄,然後使用 docker run 命令啟動了一個名為 mongodb 的容器,並通過 -v /data:/data 將主機的 /data 目錄掛載到容器內的 /data 目錄,實現了數據的持久化。docker ps 命令用於驗證容器的運行狀態,而 docker logs 則用於查看容器的啟動日誌。在容器啟動並運行後,使用者通過 docker exec -it mongodb bash 命令進入容器的 Shell 環境。在容器內部,使用者執行 mongo 命令啟動了 MongoDB 的交互式 Shell。圖示還展示了幾種不同的連接方式,包括默認連接、顯式指定主機和端口,以及使用 host:port 格式連接,最終都成功連接到 MongoDB 伺服器,並顯示了 > 提示符,表示 Shell 已準備就緒,可以進行後續的數據操作。

權衡部署效率與系統穩定性後,將 MongoDB 進行容器化部署,已不僅是單純的技術選項,而是現代軟體開發流程中,實現敏捷性與標準化不可或缺的一環。這套流程從環境準備到服務啟動,完整體現了 DevOps 精神中對於「可預測性」與「可重複性」的核心追求。

此流程的整合價值,在於將應用程式(MongoDB)、其執行環境與持久化數據(透過 -v 參數)進行了清晰的權責分離。這不僅解決了傳統部署中「環境不一致」的長期痛點,更重要的是,它建立了一套高效率的部署模型。然而,真正的挑戰在於理解數據卷(Volume)管理的深層意涵——它代表了在無狀態容器設計趨勢下,如何妥善處理有狀態服務的關鍵思維轉變,是從技術執行者邁向系統架構師的必經之路。

掌握單一容器的部署與管理,僅是踏入雲原生(Cloud-Native)生態的第一步。未來,技術領導者需將視野擴展至容器編排(Orchestration)工具如 Kubernetes,思考如何將此單點部署模式,演進為具備高可用性、自動擴展與自我修復能力的服務叢集,這將是決定專案長期競爭力的關鍵。

玄貓認為,對於追求高效能開發與維運的團隊而言,精通這套標準化部署流程,不僅是提升個人技術能力,更是建立現代化 DevOps 文化、縮短價值交付週期的基石。其真正效益,體現在思維模式的升級,而非僅止於指令的執行。