返回文章列表

Docker 映像推送實務:從公共到私有倉庫管理

本文闡述 Docker 映像的生命週期管理,從本地驗證、啟動容器測試,到推送至公開與私有倉庫的完整流程。內容涵蓋將映像發布至 Docker Hub 的標準步驟,並進一步探討如何利用 Azure Container

DevOps 容器化技術

在現代雲端原生與 DevOps 開發流程中,Docker 容器化已成為應用程式封裝與部署的標準。然而,如何有效管理與分發這些被稱為「映像」的構建成品,是確保開發、測試到生產環境一致性的關鍵挑戰。映像倉庫(Image Registry)因此扮演著核心角色,它不僅是儲存映像的中心,更是協作與自動化部署的起點。根據專案性質與安全需求,開發團隊需在公開倉庫如 Docker Hub 與私有倉庫如 Azure Container Registry 之間做出選擇,前者促進社群共享,後者則保障企業資產的機密性與存取控制。理解這兩種倉庫的操作與應用情境,是實踐高效容器化策略的基礎。

驗證本地映像與推送至 Docker Hub

本節將延續前述內容,首先驗證本地構建的 Docker 映像,並從中啟動容器進行測試。隨後,我們將學習如何將此映像推送到 Docker Hub,使其能夠被共享和部署到其他環境。

驗證本地 Docker 映像

在本地構建映像後,可以使用 docker images 命令來查看所有已存在的本地映像列表,確認我們創建的 demobook:v1 映像是否成功生成。

  • 命令: docker images
  • 說明: 此命令會列出所有本地 Docker 映像,包括其映像 ID、名稱、標籤、創建時間和大小。這有助於確認映像已正確創建,並為後續操作提供映像 ID。

從映像啟動並測試容器

  1. 啟動容器: 使用 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: 指定用於創建容器的映像名稱和標籤。
  2. 檢查運行中的容器: 可以使用 docker ps 命令查看當前正在運行的容器列表。

    docker ps
    
    • 說明: 此命令會顯示運行中容器的詳細信息,包括容器 ID、使用的映像、名稱、啟動命令、運行時間以及端口映射等。
  3. 本地應用程式測試: 容器啟動並運行後,可以通過訪問宿主機的映射端口來測試應用程式。打開網頁瀏覽器,輸入 http://localhost:8080。如果一切正常,您應該能看到 index.html 頁面顯示的內容。這驗證了容器的隔離性以及端口映射的正確性。

將映像推送到 Docker Hub

將本地構建的 Docker 映像發布到 Docker Hub,可以使其在任何地方都能被訪問和使用。

  1. 登錄 Docker Hub: 首先,需要使用您的 Docker Hub 帳戶登錄。

    docker login -u <your_dockerhub_username>
    

    系統會提示您輸入 Docker Hub 的密碼。成功登錄後,您將能夠與 Docker Hub 進行交互。

  2. 標記映像: 為了將本地映像推送到 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 用戶名關聯起來。
  3. 推送映像: 使用 docker push 命令將標記好的映像上傳到 Docker Hub。

    docker push <your_dockerhub_username>/demobook:v1
    

    此命令會將映像的所有層上傳到 Docker Hub。上傳完成後,您的映像就可以在 Docker Hub 上被公開訪問(或設置為私有)。

  4. 在 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) 的步驟

  1. 創建 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
      
  2. 連接到 Azure 帳戶: 使用 Azure CLI 登錄您的 Azure 帳戶。

    az login
    

    這將打開一個瀏覽器窗口,引導您完成 Azure 帳戶的身份驗證過程。

  3. 連接到 ACR 實例: 使用 az acr login 命令連接到您創建的 ACR 實例。

    az acr login --name acrdemo
    

    此命令實際上會在後台執行 docker login,使用 ACR 的憑證來驗證您的 Docker 客戶端,使其能夠與該 ACR 進行交互。

  4. 標記與推送映像: 與推送到 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 loginaz 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)流程的核心樞紐,形成一個兼具彈性與韌性的數位供應鏈。

玄貓認為,映像檔倉庫的選擇,應被提升至數位治理的策略層級。它不僅定義了程式碼的終點,更塑造了團隊協作的模式與組織創新的安全邊界,是高階管理者在建構技術領導力時,不可忽視的基礎建設決策。