在現代軟體開發生命週期中,容器化技術已成為實現環境一致性與快速部署的關鍵。開發初期,工程師常利用 Docker Compose 建立輕量級、可複製的本地開發環境,有效管理多個相依服務。然而,當應用程式進入生產階段並面臨流量增長與高可用性挑戰時,單純的容器啟動工具便顯得不足。此時,容器編排系統的重要性便突顯出來。本文將從 Docker Compose 在本地開發的角色出發,逐步過渡到功能更強大的 Kubernetes 平台。我們將深入探討 Kubernetes 如何透過其精密的架構與自動化機制,解決大規模微服務部署、擴展與管理的複雜問題,為企業建構穩健且具彈性的雲端原生應用奠定基礎。

容器編排的演進:Docker Compose 與 Kubernetes 的應用與對比

深入解析 Docker Compose 在本地開發與測試中的應用,學習其配置文件的編寫與執行,並探討如何將 Docker Compose 應用部署至 Azure Container Instances (ACI)。同時,為迎接更複雜的容器化部署需求,將引入 Kubernetes 的核心概念與架構,為後續的微服務管理奠定基礎

本節將聚焦於容器化應用程式的部署與管理。我們將首先深入探討 Docker Compose 的作用,學習如何使用它來定義和運行多容器 Docker 應用程式,這對於本地開發和測試環境的搭建尤為重要。我們將解析 Docker Compose 配置文件的編寫,以及如何執行 Compose 命令來啟動、停止和管理服務。隨後,我們將探討如何將 Docker Compose 應用部署到 Azure Container Instances (ACI),實現雲端環境的簡易容器部署。最後,為了應對大規模、複雜的微服務架構,我們將引入 Kubernetes 的核心概念與架構,為後續更高級的容器編排實踐鋪平道路。

Docker Compose:本地多容器應用管理

Docker Compose 是一個用於定義和運行多容器 Docker 應用程式的工具。它使用 YAML 文件來配置應用程式的服務、網路和卷,從而簡化了複雜應用程式的部署。

  1. Docker Compose 的用途:

    • 本地開發環境: 快速搭建包含多個服務(如 Web 伺服器、資料庫、緩存)的開發環境。
    • 測試: 方便地啟動和停止測試所需的整個應用程式堆棧。
    • 簡單部署: 對於規模較小的應用程式,也可以直接使用 Docker Compose 進行部署。
  2. 安裝 Docker Compose:

    • Docker Compose 通常作為 Docker Desktop 的一部分提供,無需單獨安裝。
    • 在 Linux 上,可以通過包管理器或下載獨立的可執行文件進行安裝。
  3. 編寫 Docker Compose 配置文件 (docker-compose.yml):

    • 基本結構:
      version: '3.8' # 指定 Compose 文件格式版本
      
      services: # 定義應用程式中的各個服務
        web: # 服務名稱,例如 web 應用
          build: . # 指定 Dockerfile 的路徑,或使用 image 指定已有的映像檔
          ports:
            - "8000:5000" # 映射主機端口到容器端口
          volumes:
            - .:/code # 映射本地目錄到容器,實現熱重載
          depends_on:
            - db # 指定服務依賴關係,確保 db 先啟動
          environment:
            - FLASK_ENV=development
      
        db: # 服務名稱,例如資料庫
          image: postgres:13 # 使用已有的 PostgreSQL 映像檔
          volumes:
            - db_data:/var/lib/postgresql/data # 持久化資料庫數據
          environment:
            - POSTGRES_DB=mydatabase
            - POSTGRES_USER=user
            - POSTGRES_PASSWORD=password
      
      volumes: # 定義命名卷,用於持久化數據
        db_data:
      
    • 關鍵元素:
      • version: 指定 Compose 文件格式的版本。
      • services: 定義應用程式中的各個獨立服務(容器)。
      • image: 指定要使用的 Docker 映像檔。
      • build: 指定構建映像檔的上下文路徑(包含 Dockerfile)。
      • ports: 端口映射。
      • volumes: 卷掛載,用於數據持久化或共享文件。
      • depends_on: 設定服務之間的啟動順序。
      • environment: 設定容器內的環境變數。
  4. 執行 Docker Compose:

    • 在包含 docker-compose.yml 文件的目錄下,執行以下命令:
      • docker-compose up: 構建(如果需要)並啟動所有服務。
      • docker-compose up -d: 在後台啟動服務。
      • docker-compose down: 停止並移除所有服務、容器、網絡和卷。
      • docker-compose ps: 顯示運行中的服務。
      • docker-compose logs: 查看所有服務的日誌。

將 Docker Compose 部署到 ACI

雖然 Docker Compose 主要用於本地開發,但也可以結合 CI/CD 管道將其部署到雲端環境,如 Azure Container Instances (ACI)。

  1. 部署策略:

    • 方法: 通常是將 Docker Compose 文件轉換為 ACI 的配置,或者使用工具來實現。
    • Azure CLI 擴展: Azure CLI 提供了一個 aci-compose 擴展,可以將 docker-compose.yml 文件轉換為 ACI 的部署配置。
    • CI/CD 整合: 在 CI/CD 管道中,可以執行 aci-compose up 命令來部署應用程式到 ACI。
  2. aci-compose 工作流程:

    • 安裝擴展: az extension add --name aci-compose
    • 部署: aci-compose up -f docker-compose.yml --resource-group <resource_group_name> --location <azure_region>
    • 移除: aci-compose down -g <resource_group_name>
    • 注意: aci-compose 主要用於將 Compose 文件中的服務映射到 ACI 的容器組,但對於複雜的網絡配置或卷管理,可能需要額外的 Terraform 或 Azure CLI 配置。

Kubernetes 核心概念介紹

Kubernetes (K8s) 是一個開源的容器編排系統,用於自動化容器化應用程式的部署、擴展和管理。它提供了強大的功能來處理大規模、分佈式的應用程式。

  1. Kubernetes 的核心組件:

    • Master Node (控制平面):
      • API Server: Kubernetes API 的入口點,處理所有 REST 請求。
      • etcd: 分佈式鍵值存儲,用於儲存 Kubernetes 的所有配置數據和狀態。
      • Scheduler: 負責將 Pod 分配到合適的節點上。
      • Controller Manager: 運行各種控制器,如節點控制器、副本控制器等,維護叢集的期望狀態。
    • Worker Node (節點):
      • Kubelet: 在每個節點上運行,確保容器在 Pod 中運行並與 API Server 通信。
      • Kube-proxy: 在每個節點上運行,維護網絡規則,實現服務的網絡通信。
      • Container Runtime: 運行容器的軟件,如 Docker, containerd, CRI-O。
  2. Kubernetes 的核心對象:

    • Pod: Kubernetes 中最小的可部署單元,可以包含一個或多個緊密關聯的容器,共享網絡和存儲。
    • Service: 為一組 Pod 提供一個穩定的訪問入口(IP 地址和 DNS 名稱),並負責負載均衡。
    • Deployment: 聲明式地描述應用程式的期望狀態,負責管理 Pod 的創建、更新和擴展。
    • Namespace: 將叢集資源劃分為邏輯上的獨立組,用於多租戶或項目隔離。
    • ReplicaSet: 確保指定數量的 Pod 副本正在運行。Deployment 通常會管理 ReplicaSet。
    • Ingress: 管理外部訪問叢集內 Services 的規則,通常用於 HTTP/HTTPS 路由。

Docker Compose 與 Kubernetes 的對比

| 特性 | Docker Compose | Kubernetes | | :



– | :











  • | :












– | | 主要用途 | 本地開發、測試、小型部署 | 生產環境、大規模容器編排、高可用性、自動擴展 | | 複雜性 | 簡單易用,配置直觀 | 複雜,學習曲線較陡峭 | | 擴展性 | 有限,主要用於單機或少量節點 | 極高,設計用於大規模分佈式環境 | | 高可用性 | 有限,依賴於 Docker 主機的可用性 | 內建高可用性機制(多個 Master 節點,Pod 副本) | | 自動化 | 啟動/停止服務 | 自動化部署、擴展、自癒、滾動更新、回滾 | | 網絡 | 基於 Docker 網絡,相對簡單 | 強大且靈活的網絡模型(CNI),支持多種網絡策略 | | 狀態管理 | 有限,主要基於容器狀態 | 強大的狀態管理,通過 API Server 和 etcd 維護叢集狀態 | | 適用場景 | 單體應用、微服務的本地開發測試 | 微服務架構、大規模 Web 應用、需要高可用和彈性的系統 |

Docker Compose 部署與 Kubernetes 架構圖示

@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

start

partition "容器部署與管理" {
  partition "本地開發與測試 (Docker Compose)" {
    :1. 編寫 docker-compose.yml 文件;
    :2. 定義多個服務 (Web, DB, Cache);
    :3. 執行 `docker-compose up` 啟動應用;
    :4. 實現快速迭代與調試;
  }

  partition "簡易雲端部署 (ACI + Compose)" {
    :5. 使用 `aci-compose` 工具;
    :6. 將 Compose 文件部署到 ACI;
    :7. 適用於簡單的雲端應用;
  }

  partition "大規模容器編排 (Kubernetes)" {
    partition "控制平面 (Master Node)" {
      :API Server;
      :etcd;
      :Scheduler;
      :Controller Manager;
    }
    partition "節點 (Worker Node)" {
      :Kubelet;
      :Kube-proxy;
      :Container Runtime (Docker);
    }
    partition "核心資源" {
      :Pod (容器集合);
      :Service (服務發現與負載均衡);
      :Deployment (聲明式部署);
      :Ingress (外部訪問);
    }
    :8. 聲明式管理複雜應用狀態;
    :9. 自動化擴展、自癒、滾動更新;
  }
}

stop

@enduml

看圖說話:

此圖示清晰地展示了容器部署與管理的不同層級和工具。開頭的「本地開發與測試 (Docker Compose)」部分,說明了 Docker Compose 如何簡化本地多服務應用程式的搭建與運行。接著,「簡易雲端部署 (ACI + Compose)」部分,介紹了如何利用 aci-compose 工具將 Docker Compose 應用部署到 Azure Container Instances,這是一種輕量級的雲端部署方式。圖示的核心部分是「大規模容器編排 (Kubernetes)」,它詳細列出了 Kubernetes 的控制平面和節點組件,以及 Pod、Service、Deployment 等核心資源,突顯了 Kubernetes 在處理複雜、大規模分佈式系統時的強大能力和自動化特性。這張圖有效地對比了 Docker Compose 和 Kubernetes 在應用場景、複雜度和功能上的差異。

縱觀現代容器化技術的演進光譜,從單機開發到叢集部署的歷程,清晰地揭示了工具選擇背後的策略性權衡。Docker Compose 以其直觀配置與快速啟動的優勢,在本地開發與測試階段扮演了不可或缺的效率加速器角色。然而,其單機架構的內在限制,使其難以應對生產環境對高可用性與彈性擴展的嚴苛要求,這正是技術團隊必須突破的規模化瓶頸。

相較之下,Kubernetes 雖然帶來了陡峭的學習曲線與更高的管理複雜度,但其為大規模微服務架構提供了無可比擬的韌性、自癒能力與自動化編排。這種從「管理容器」到「管理應用狀態」的哲學轉變,是兩者最根本的區別,也是技術領導者在架構選型時必須深思的核心。展望未來,兩者的界線將趨於模糊,整合性工具鏈的發展將致力於弭平從開發到生產的鴻溝,使開發者能在熟悉的 Compose 環境中無縫過渡至 Kubernetes 的聲明式部署。

玄貓認為,精通 Docker Compose 是提升開發敏捷度的基礎修煉,而掌握 Kubernetes 則是確保商業應用規模化與持續運營的關鍵能力。對於追求高效能與高可用性的技術團隊而言,兩者並非零和競爭,而是現代雲原生技術棧中相輔相成的兩端,是建構技術護城河的務實路徑。