在現代雲端原生與 DevOps 開發流程中,Docker 容器化已成為應用程式封裝與部署的標準。然而,如何有效管理與分發這些被稱為「映像」的構建成品,是確保開發、測試到生產環境一致性的關鍵挑戰。映像倉庫(Image Registry)因此扮演著核心角色,它不僅是儲存映像的中心,更是協作與自動化部署的起點。根據專案性質與安全需求,開發團隊需在公開倉庫如 Docker Hub 與私有倉庫如 Azure Container Registry 之間做出選擇,前者促進社群共享,後者則保障企業資產的機密性與存取控制。理解這兩種倉庫的操作與應用情境,是實踐高效容器化策略的基礎。
驗證本地映像與推送至 Docker Hub
本節將延續前述內容,首先驗證本地構建的 Docker 映像,並從中啟動容器進行測試。隨後,我們將學習如何將此映像推送到 Docker Hub,使其能夠被共享和部署到其他環境。
驗證本地 Docker 映像
在本地構建映像後,可以使用 docker images 命令來查看所有已存在的本地映像列表,確認我們創建的 demobook:v1 映像是否成功生成。
- 命令:
docker images - 說明: 此命令會列出所有本地 Docker 映像,包括其映像 ID、名稱、標籤、創建時間和大小。這有助於確認映像已正確創建,並為後續操作提供映像 ID。
從映像啟動並測試容器
啟動容器: 使用
docker run命令從demobook:v1映像啟動一個新容器。docker run -d --name demoapp -p 8080:80 demobook:v1-d: 在後台(分離模式)運行容器。--name demoapp: 為容器指定一個易於識別的名稱「demoapp」。-p 8080:80: 將宿主機的 8080 端口映射到容器的 80 端口,以便從外部訪問。demobook:v1: 指定用於創建容器的映像名稱和標籤。
檢查運行中的容器: 可以使用
docker ps命令查看當前正在運行的容器列表。docker ps- 說明: 此命令會顯示運行中容器的詳細信息,包括容器 ID、使用的映像、名稱、啟動命令、運行時間以及端口映射等。
本地應用程式測試: 容器啟動並運行後,可以通過訪問宿主機的映射端口來測試應用程式。打開網頁瀏覽器,輸入
http://localhost:8080。如果一切正常,您應該能看到index.html頁面顯示的內容。這驗證了容器的隔離性以及端口映射的正確性。
將映像推送到 Docker Hub
將本地構建的 Docker 映像發布到 Docker Hub,可以使其在任何地方都能被訪問和使用。
登錄 Docker Hub: 首先,需要使用您的 Docker Hub 帳戶登錄。
docker login -u <your_dockerhub_username>系統會提示您輸入 Docker Hub 的密碼。成功登錄後,您將能夠與 Docker Hub 進行交互。
標記映像: 為了將本地映像推送到 Docker Hub,需要為其打上一個包含您的 Docker Hub 用戶名的標籤。
docker tag <image_id> <your_dockerhub_username>/demobook:v1<image_id>: 是通過docker images命令獲取的映像 ID。<your_dockerhub_username>/demobook:v1: 新的標籤格式,將映像與您的 Docker Hub 用戶名關聯起來。
推送映像: 使用
docker push命令將標記好的映像上傳到 Docker Hub。docker push <your_dockerhub_username>/demobook:v1此命令會將映像的所有層上傳到 Docker Hub。上傳完成後,您的映像就可以在 Docker Hub 上被公開訪問(或設置為私有)。
在 Docker Hub 上查看: 登錄 Docker Hub 的網頁界面,您可以在您的帳戶下找到剛剛推送的
demobook:v1映像。您可以選擇將其設為公開或私有。
視覺化映像推送流程
以下圖示展示了將本地 Docker 映像推送到 Docker Hub 的流程。
@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
title Pushing Docker Image to Docker Hub
start
component "Local Machine" {
artifact "Local Docker Image:\ndemobook:v1" as LOCAL_IMG
artifact "docker login command" as LOGIN_CMD
artifact "docker tag command" as TAG_CMD
artifact "docker push command" as PUSH_CMD
}
component "Docker Hub Registry" {
artifact "User Account & Authentication" as AUTH
artifact "Public/Private Image Repository" as REPO
}
LOGIN_CMD --> AUTH : Authenticates User
LOCAL_IMG --> TAG_CMD : Gets Image ID
TAG_CMD --> LOCAL_IMG : Adds Docker Hub Username Tag
PUSH_CMD --> LOCAL_IMG : Uploads Tagged Image
PUSH_CMD --> REPO : Stores Image in Repository
Docker Hub Registry --> "Any Machine with Docker" : Allows Image Pull
stop
@enduml
看圖說話:
此圖示描繪了將本地 Docker 映像推送到 Docker Hub 的完整流程。首先,「Local Machine」上的用戶執行 docker login 命令,通過「User Account & Authentication」與「Docker Hub Registry」進行身份驗證。
接著,用戶使用 docker tag 命令為本地的 Docker 映像 (demobook:v1) 添加一個包含其 Docker Hub 用戶名的標籤。這個標記過程是為了讓 Docker Hub 知道映像應該存儲在哪個用戶的倉庫下。
最後,docker push 命令被執行,它將標記好的映像上傳到 Docker Hub 的「Public/Private Image Repository」中。一旦映像被成功推送,任何配置了 Docker 的機器都可以通過 Docker Hub 搜索並下載這個映像,實現了映像的共享和分發。
將 Docker 映像推送到私有倉庫 (ACR)
在前一節中,我們學習了如何將 Docker 映像推送到公共倉庫 Docker Hub。本節將重點介紹如何將 Docker 映像推送到私有倉庫,並以 Azure Container Registry (ACR) 為例進行詳細說明。私有倉庫對於保護敏感應用程式映像、控制訪問權限以及在企業環境中進行部署至關重要。
私有 Docker 倉庫選項
市面上有許多解決方案可以搭建私有的 Docker 倉庫,包括:
- 自建 Docker Registry Server: 可以部署一個獨立的 Docker Registry 服務器。
- 雲端託管服務: 如 Azure Container Registry (ACR)、Amazon Elastic Container Registry (ECR) 等,提供託管的私有倉庫服務。
本節將聚焦於使用 ACR。
推送映像至 Azure Container Registry (ACR) 的步驟
創建 ACR 資源: 在推送映像之前,需要先在 Azure 中創建一個 ACR 實例。這可以通過 Azure CLI、Azure PowerShell 或 Azure 入口網站完成。
使用 Azure CLI: 首先,創建一個資源組(如果尚未存在),然後在該資源組中創建 ACR 實例。
# 創建資源組 az group create --name RG-ACR --location eastus # 創建 ACR 實例 (使用 Basic SKU) az acr create --resource-group RG-ACR --name acrdemo --sku Basic(注意:為簡潔起見,我們將使用名為
acrdemo的 ACR 實例進行演示。在實際操作中,請替換為您自己的 ACR 名稱。)使用 Azure PowerShell:
# 創建資源組 New-AzResourceGroup -Name RG-ACR -Location EastUS # 創建 ACR 實例 (啟用管理員用戶,使用 Basic SKU) $registry = New-AzContainerRegistry -ResourceGroupName "RG-ACR" -Name "acrdemo" -EnableAdminUser -Sku Basic
連接到 Azure 帳戶: 使用 Azure CLI 登錄您的 Azure 帳戶。
az login這將打開一個瀏覽器窗口,引導您完成 Azure 帳戶的身份驗證過程。
連接到 ACR 實例: 使用
az acr login命令連接到您創建的 ACR 實例。az acr login --name acrdemo此命令實際上會在後台執行
docker login,使用 ACR 的憑證來驗證您的 Docker 客戶端,使其能夠與該 ACR 進行交互。標記與推送映像: 與推送到 Docker Hub 類似,也需要先為本地映像打上指向 ACR 的標籤,然後再推送。
標記映像:
docker tag demobook:v1 acrdemo.azurecr.io/demobook:v1這裡,
acrdemo.azurecr.io是您的 ACR 實例的登錄服務器 URL。映像名稱demobook:v1被附加到此 URL 後面。推送映像:
docker push acrdemo.azurecr.io/demobook:v1此命令將標記好的映像上傳到您的 ACR 實例。
視覺化推送映像至 ACR 的流程
以下圖示詳細展示了將 Docker 映像推送到 Azure Container Registry (ACR) 的步驟。
@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
title Pushing Docker Image to Azure Container Registry (ACR)
start
component "Local Machine" {
artifact "Local Docker Image:\ndemobook:v1" as LOCAL_IMG
artifact "Azure CLI Commands:\naz login\naz acr login --name acrdemo" as AZ_LOGIN_CMDS
artifact "Docker Tag Command:\ndocker tag demobook:v1 acrdemo.azurecr.io/demobook:v1" as TAG_CMD
artifact "Docker Push Command:\ndocker push acrdemo.azurecr.io/demobook:v1" as PUSH_CMD
}
component "Azure Cloud" {
artifact "Azure Account Authentication" as AZ_AUTH
artifact "ACR Instance:\nacrdemo.azurecr.io" as ACR_INSTANCE
}
AZ_LOGIN_CMDS --> AZ_AUTH : Authenticates to Azure
AZ_LOGIN_CMDS --> ACR_INSTANCE : Establishes Docker Login to ACR
LOCAL_IMG --> TAG_CMD : Uses Image ID
TAG_CMD --> LOCAL_IMG : Adds ACR Registry URL Tag
PUSH_CMD --> LOCAL_IMG : Uploads Tagged Image
PUSH_CMD --> ACR_INSTANCE : Stores Image in ACR Repository
ACR_INSTANCE --> "Any Authorized Machine" : Allows Image Pull
stop
@enduml
看圖說話:
此圖示詳細說明了將 Docker 映像推送到 Azure Container Registry (ACR) 的過程。首先,用戶在「Local Machine」上執行 Azure CLI 命令,如 az login 和 az acr login,這會完成「Azure Account Authentication」,並使 Docker 客戶端能夠連接到指定的「ACR Instance」(例如 acrdemo.azurecr.io)。
接著,docker tag 命令被用於為本地映像 (demobook:v1) 添加 ACR 的登錄服務器 URL 作為前綴,生成一個指向 ACR 的新標籤。然後,docker push 命令被執行,將這個帶有 ACR URL 的映像上傳到「ACR Instance」的倉庫中。
一旦映像成功推送到 ACR,任何經過授權的機器都可以通過 Docker 客戶端從該 ACR 實例拉取映像,實現了私有映像的安全存儲和分發。
結論:從技術操作到策略佈局的躍升
權衡開放協作與資產控管的策略天秤後,從映像檔的本地驗證到遠端推送的完整流程,不僅是技術操作的展演,更是組織數位資產治理成熟度的試金石。公共倉庫(如 Docker Hub)提供了無與倫比的便利性與社群協作潛力,適合開源專案與快速原型驗證;然而,其開放性也帶來了智慧財產權與安全控管的隱憂。相對地,私有倉庫(如 ACR)雖增加了初期建置與管理的複雜度,卻構建了一道關鍵的資安防線,確保了企業核心應用的合規性與部署一致性。此二元選擇的關鍵挑戰,不在於技術執行本身,而在於決策者能否清晰辨識專案生命週期階段、安全需求與商業價值間的權衡點。
展望未來,單一倉庫策略將逐漸式微,取而代之的是混合式佈局。高成熟度的團隊將靈活運用公共倉庫進行外部協作與品牌展示,同時以私有倉庫作為內部安全開發維運(DevSecOps)流程的核心樞紐,形成一個兼具彈性與韌性的數位供應鏈。
玄貓認為,映像檔倉庫的選擇,應被提升至數位治理的策略層級。它不僅定義了程式碼的終點,更塑造了團隊協作的模式與組織創新的安全邊界,是高階管理者在建構技術領導力時,不可忽視的基礎建設決策。