應用程式容器化技術已成為現代軟體開發與部署的標準實踐,其核心在於透過 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 對於構建高效、安全的映像檔至關重要。
Dockerfile 指令概覽:
FROM: 指定基礎映像檔,是 Dockerfile 的第一條指令。RUN: 在映像檔構建過程中執行命令,例如安裝套件。COPY/ADD: 將文件或目錄從主機複製到映像檔中。COPY更為常用和推薦,因為它更明確。WORKDIR: 設定後續指令的工作目錄。EXPOSE: 聲明容器運行時監聽的端口,這是一個文檔說明,並不實際發布端口。CMD: 為容器提供預設的執行命令。在一個 Dockerfile 中只能有一個CMD指令,如果有多個,只有最後一個生效。ENTRYPOINT: 也用於指定容器啟動時執行的命令,但它與CMD的結合方式不同,通常用於設置容器的可執行文件。ENV: 設定環境變數。ARG: 定義構建時使用的變數。VOLUME: 創建一個掛載點,用於持久化容器中的數據。
編寫優化 Dockerfile 的技巧:
- 使用較小的基礎映像檔: 例如,使用
alpine或slim版本,可以顯著減小映像檔大小。 - 合併
RUN指令: 將多個RUN指令合併成一個,以減少映像檔層的數量。例如,使用&&連接多個命令,並在最後清理緩存。 - 利用快取: Docker 會快取映像檔層。將不經常變動的指令(如安裝依賴)放在前面,將經常變動的指令(如複製程式碼)放在後面,可以加速構建。
- 指定明確的標籤: 避免使用
latest標籤,而是指定具體的版本標籤,以確保構建的可重複性。
- 使用較小的基礎映像檔: 例如,使用
構建 Docker 映像檔:
- 在包含 Dockerfile 的目錄下,執行以下命令:
docker build -t your-image-name:tag .-t: 為映像檔指定名稱和標籤。.: 表示 Dockerfile 所在的目錄。
- 在包含 Dockerfile 的目錄下,執行以下命令:
在本地測試 Docker 容器
構建映像檔後,需要在本地進行測試,確保應用程式在容器中能夠正常運行。
實例化容器:
- 使用
docker run命令基於映像檔創建並啟動一個容器:docker run -d -p 8080:80 your-image-name:tag-d: 在後台(detached 模式)運行容器。-p 8080:80: 將主機的 8080 端口映射到容器的 80 端口。your-image-name:tag: 要使用的映像檔名稱和標籤。
- 使用
測試容器:
- 訪問應用程式: 打開瀏覽器,訪問
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 映像檔,需要將其推送到容器註冊中心。
推送到 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
- 登錄:
推送到 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 容器,無需管理底層的虛擬機器。
Terraform 配置 ACI:
- 使用 Terraform 定義 ACI 資源,包括容器組 (Container Group)、容器實例 (Container Instance)、映像檔引用、端口映射、資源限制等。
- 關鍵資源:
azurerm_container_group。 - 映像檔來源: 在
azurerm_container_group中,通過image_registry_credentials指定 ACR 的登錄信息,並在container塊中引用 ACR 中的映像檔。
CI/CD 管道實現:
- CI 階段:
- 構建 Docker 映像檔 (
docker build)。 - 將映像檔推送到 Docker Hub 或 ACR (
docker push)。
- 構建 Docker 映像檔 (
- CD 階段:
- 觸發 Terraform 管道。
- Terraform 執行
init,plan。 - 手動批准後,執行
terraform apply,根據 Terraform 配置創建或更新 ACI 實例。
- CI 階段:
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),建構更具韌性的交付生命週期。因此,對追求敏捷與快速交付的組織而言,掌握這套端到端的容器化部署流程,已非技術選項,而是維持市場競爭力的核心策略。