應用程式容器化技術已成為現代軟體開發與部署的標準實踐,其核心在於透過 Docker 等工具將應用程式及其所有依賴項打包成一個輕量、可移植的標準化單元。此方法不僅確保了開發、測試與生產環境的一致性,也大幅簡化了部署流程。本文將從技術理論層面切入,解析如何編寫高效能的 Dockerfile 以優化映像檔,並探討將映像檔儲存於 Azure Container Registry (ACR) 等容器註冊中心的管理策略。接著,將闡述如何整合持續整合與部署(CI/CD)管道,並利用 Terraform 實現基礎設施即程式碼(IaC),最終將容器自動部署至 Azure Container Instances (ACI) 這類無伺服器容器平台,完整勾勒出從程式碼到雲端運行的自動化路徑。

應用程式容器化與雲端部署:Docker 實踐與 CI/CD 自動化

深入探討 Docker 映像檔的編寫、構建與本地測試,以及如何將映像檔推送到 Docker Hub 或 Azure Container Registry (ACR),並透過 CI/CD 管道實現將容器部署到 Azure Container Instances (ACI) 的自動化流程

本節將聚焦於應用程式容器化的核心技術——Docker。我們將詳細解析如何編寫高效的 Dockerfile,構建 Docker 映像檔,並在本地進行測試。隨後,我們將學習如何將構建好的映像檔推送到 Docker Hub 或 Azure Container Registry (ACR) 等容器註冊中心。最終,我們將結合 CI/CD 管道,實現將容器化應用程式自動部署到 Azure Container Instances (ACI) 的完整流程,並探討所需的 Terraform 配置。

Dockerfile 編寫與映像檔構建

Dockerfile 是定義 Docker 映像檔構建步驟的藍圖。編寫一個優化的 Dockerfile 對於構建高效、安全的映像檔至關重要。

  1. Dockerfile 指令概覽:

    • FROM: 指定基礎映像檔,是 Dockerfile 的第一條指令。
    • RUN: 在映像檔構建過程中執行命令,例如安裝套件。
    • COPY / ADD: 將文件或目錄從主機複製到映像檔中。COPY 更為常用和推薦,因為它更明確。
    • WORKDIR: 設定後續指令的工作目錄。
    • EXPOSE: 聲明容器運行時監聽的端口,這是一個文檔說明,並不實際發布端口。
    • CMD: 為容器提供預設的執行命令。在一個 Dockerfile 中只能有一個 CMD 指令,如果有多個,只有最後一個生效。
    • ENTRYPOINT: 也用於指定容器啟動時執行的命令,但它與 CMD 的結合方式不同,通常用於設置容器的可執行文件。
    • ENV: 設定環境變數。
    • ARG: 定義構建時使用的變數。
    • VOLUME: 創建一個掛載點,用於持久化容器中的數據。
  2. 編寫優化 Dockerfile 的技巧:

    • 使用較小的基礎映像檔: 例如,使用 alpineslim 版本,可以顯著減小映像檔大小。
    • 合併 RUN 指令: 將多個 RUN 指令合併成一個,以減少映像檔層的數量。例如,使用 && 連接多個命令,並在最後清理緩存。
    • 利用快取: Docker 會快取映像檔層。將不經常變動的指令(如安裝依賴)放在前面,將經常變動的指令(如複製程式碼)放在後面,可以加速構建。
    • 指定明確的標籤: 避免使用 latest 標籤,而是指定具體的版本標籤,以確保構建的可重複性。
  3. 構建 Docker 映像檔:

    • 在包含 Dockerfile 的目錄下,執行以下命令:
      docker build -t your-image-name:tag .
      
      • -t: 為映像檔指定名稱和標籤。
      • .: 表示 Dockerfile 所在的目錄。

在本地測試 Docker 容器

構建映像檔後,需要在本地進行測試,確保應用程式在容器中能夠正常運行。

  1. 實例化容器:

    • 使用 docker run 命令基於映像檔創建並啟動一個容器:
      docker run -d -p 8080:80 your-image-name:tag
      
      • -d: 在後台(detached 模式)運行容器。
      • -p 8080:80: 將主機的 8080 端口映射到容器的 80 端口。
      • your-image-name:tag: 要使用的映像檔名稱和標籤。
  2. 測試容器:

    • 訪問應用程式: 打開瀏覽器,訪問 http://localhost:8080(如果端口映射設置為 8080)。
    • 查看容器日誌: 使用 docker logs <container_id_or_name> 查看容器的輸出。
    • 進入容器: 使用 docker exec -it <container_id_or_name> /bin/bash(或 /bin/sh)進入容器內部進行調試。
    • 停止和刪除容器: 使用 docker stop <container_id_or_name>docker rm <container_id_or_name>

將映像檔推送到容器註冊中心

為了讓其他環境(如 CI/CD 管道、雲端服務)能夠訪問您的 Docker 映像檔,需要將其推送到容器註冊中心。

  1. 推送到 Docker Hub:

    • 登錄: docker login
    • 標籤映像檔: 為映像檔打上 Docker Hub 用戶名和倉庫名稱的標籤:
      docker tag your-image-name:tag your-dockerhub-username/your-repo-name:tag
      
    • 推送:
      docker push your-dockerhub-username/your-repo-name:tag
      
  2. 推送到 Azure Container Registry (ACR):

    • 創建 ACR: 在 Azure Portal 或使用 Azure CLI 創建一個 ACR 實例。
    • 登錄 ACR:
      az acr login --name your-acr-name
      
    • 為映像檔打標籤:
      docker tag your-image-name:tag your-acr-name.azurecr.io/your-repo-name:tag
      
    • 推送:
      docker push your-acr-name.azurecr.io/your-repo-name:tag
      

CI/CD 管道部署容器到 ACI

Azure Container Instances (ACI) 提供了一種快速、簡單的方式來運行 Docker 容器,無需管理底層的虛擬機器。

  1. Terraform 配置 ACI:

    • 使用 Terraform 定義 ACI 資源,包括容器組 (Container Group)、容器實例 (Container Instance)、映像檔引用、端口映射、資源限制等。
    • 關鍵資源: azurerm_container_group
    • 映像檔來源: 在 azurerm_container_group 中,通過 image_registry_credentials 指定 ACR 的登錄信息,並在 container 塊中引用 ACR 中的映像檔。
  2. CI/CD 管道實現:

    • CI 階段:
      • 構建 Docker 映像檔 (docker build)。
      • 將映像檔推送到 Docker Hub 或 ACR (docker push)。
    • CD 階段:
      • 觸發 Terraform 管道。
      • Terraform 執行 init, plan
      • 手動批准後,執行 terraform apply,根據 Terraform 配置創建或更新 ACI 實例。

ACI 部署 CI/CD 流程圖示

@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 "容器化應用程式的 CI/CD 部署至 ACI" {
  partition "應用程式開發與容器化" {
    :1. 編寫應用程式程式碼;
    :2. 編寫 Dockerfile;
    :3. 在本地構建 Docker 映像檔 (`docker build`);
    :4. 在本地測試容器 (`docker run`, `docker exec`);
  }

  partition "映像檔推送" {
    :5. 登錄容器註冊中心 (Docker Hub / ACR);
    :6. 為映像檔打標籤;
    :7. 推送映像檔 (`docker push`);
  }

  partition "CI/CD 管道" {
    partition "CI 階段" {
      :8. 程式碼變更觸發 CI 管道;
      :9. 執行 Docker 構建與推送任務;
    }
    partition "CD 階段" {
      :10. 觸發 Terraform 部署管道;
      :11. 執行 `terraform plan` 驗證 ACI 配置;
      :12. 手動批准後,執行 `terraform apply`;
      :13. Terraform 創建/更新 ACI 實例,引用已推送的映像檔;
    }
  }

  partition "雲端運行" {
    :14. ACI 實例運行容器化應用程式;
    :15. 透過 ACI 暴露的端口訪問應用程式;
  }
}

stop

@enduml

看圖說話:

此圖示詳細描繪了將容器化應用程式部署到 Azure Container Instances (ACI) 的完整 CI/CD 流程。圖的開頭部分展示了從應用程式開發到本地容器測試的過程。接著,「映像檔推送」部分說明了如何將構建好的映像檔發布到 Docker Hub 或 ACR。核心的「CI/CD 管道」部分,則將流程分解為 CI 和 CD 兩個階段:CI 階段負責構建和推送映像檔,而 CD 階段則利用 Terraform 自動化 ACI 實例的創建與更新,並引用推送的映像檔。最後,「雲端運行」部分展示了應用程式如何在 ACI 中運行並可供訪問。這張圖清晰地呈現了從程式碼到雲端運行的端到端自動化路徑。

縱觀這套從源碼到雲端部署的完整實踐,其價值遠超過單純的技術堆疊。它透過 Docker 的標準化封裝、CI/CD 的流程自動化,以及 Terraform 的基礎設施即程式碼(IaC),三者協同運作,將開發、測試與維運的邊界有效模糊化,大幅提升了交付速度與一致性。然而,真正的挑戰並非工具的導入,而是團隊在思維模式上的轉變——從手動部署的慣性,轉向對自動化流程的全然信任與持續優化。未來,此自動化管線將成為高效能團隊的基礎設施,其發展重點將朝向整合安全性掃描(DevSecOps)與可觀測性(Observability),建構更具韌性的交付生命週期。因此,對追求敏捷與快速交付的組織而言,掌握這套端到端的容器化部署流程,已非技術選項,而是維持市場競爭力的核心策略。