Azure Learn AZ-204 The Hard Way | 實作 AZ-204 Lab 05 Azure Container

2022-03-18

實作 AZ-204 證照測驗準備的實驗課程,從實驗課程中精熟 AZ-204 的測驗重點以及工具操作。本次要實驗的是如何使用 Azure Container。

logo

Lab05 - Azure Container

詳細的實驗流程可以參考微軟在 GitHub上的專案

圖片來源:微軟

Pre Setting

先建立本次 Lab 要使用的 ResourceGroup ContainerCompute,接著使用 Azure Cloud Shell 進行後續的操作。

az --version

使用 Azure Cloud Shell 建立 VM

az vm create 
  --resource-group ContainerCompute 
  --name quickvm 
  --image Debian 
  --admin-username student 
  --admin-password password

確認安裝的 VM

az vm show --resource-group ContainerCompute --name quickvm

確認 VM 使用的 IP

az vm list-ip-addresses --resource-group ContainerCompute --name quickvm
[
  {
    "virtualMachine": {
      "name": "quickvm",
      "network": {
        "privateIpAddresses": [
          "10.0.0.4"
        ],
        "publicIpAddresses": [
          {
            "id": "/providers/Microsoft.Network/publicIPAddresses/quickvmPublicIP",
            "ipAddress": "20.228.253.149",
            "ipAllocationMethod": "Dynamic",
            "name": "quickvmPublicIP",
            "resourceGroup": "ContainerCompute"
          }
        ]
      },
      "resourceGroup": "ContainerCompute"
    }
  }
]

使用 SSH 連線到伺服器

ssh student@20.228.253.149

確認目前的身分,完成後離開 SSH Session

uname -a
exit

建立 Docker Container Image

使用 Azure Cloud Shell 建立專案資料夾後,使用 dotnet 建立專案

cd ~/clouddrive
mkdir ipcheck
cd ~/clouddrive/ipcheck
dotnet new console --output . --name ipcheck

建立 Dockerfile 並且使用 code 進行編輯

touch Dockerfile
code .

Program.cs

編輯 Program.cs,調整為下列內容:

public class Program
{
    public static void Main(string[] args)
    {        
        // Check if network is available
        if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        {
            System.Console.WriteLine("Current IP Addresses:");

            // Get host entry for current hostname
            string hostname = System.Net.Dns.GetHostName();
            System.Net.IPHostEntry host = System.Net.Dns.GetHostEntry(hostname);
            
            // Iterate over each IP address and render their values
            foreach(System.Net.IPAddress address in host.AddressList)
            {
                System.Console.WriteLine($"\t{address}");
            }
        }
        else
        {
            System.Console.WriteLine("No Network Connection");
        }
    }
}

得到回應結果,顯示虛擬機的內部 IP

10.244.171.191

接著編輯 Dockerfile 調整為下列內容:

# Start using the .NET Core 3.1 SDK container image
FROM mcr.microsoft.com/dotnet/sdk:3.1-alpine AS build

# Change current working directory
WORKDIR /app

# Copy existing files from host machine
COPY . ./

# Publish application to the "out" folder
RUN dotnet publish --configuration Release --output out

# Start container by running application DLL
ENTRYPOINT ["dotnet", "out/ipcheck.dll"]

建立 Azure Container Registry

取得一個隨機的 Registry 名稱,並檢查是否可用:

registryName=conRegistry$RANDOM
az acr check-name --name $registryName

沒有問題的話就開始執行建立 Azure Container Registry 😄

az acr create --resource-group ContainerCompute --name $registryName --sku Basic

將建立好的 Azure Container Registry 保存為變數 arcName

acrName=$(az acr list --query "max_by([], &creationDate).name" --output tsv)

進行 Compile,將之前完成的 ipcheck 作為 image 上傳至 Azure Container Registry

az acr build --registry $acrName --image ipcheck:latest .

從 Azure Portal 驗證已經上傳成功的 Image 會存在於 Azure Container Registry


部署到 Azure Container Instance

從 Container Registry 將 Admin user 啟用,並進行儲存

接著將目前已建立好的 Image 發佈到 Azure Container Instance,首先以 Images to Instance 的方式進行 (managed)


此外也可以從建立 Instance 再指定 Images 的方式 (manual)

可以從 Azure Container Instance 確認結果,首先確認 Managed Container Instance

接著確認 Manual Container Instance

本次所使用到的相關虛擬機資源

Azure IaaS 相關知識

Availability Sets

Fault Domains
實體不同機櫃、不同的實體機
Update Domains
不同軟體更新機器、不同的虛擬機

Azure Resource Manager

  • 各別 Resource 需要在 Subscription 層級註冊 Provider
  • 支持 Nested ARM
  • 更全面的部署層級使用 Blueprints

實戰 Azure Container Registry & Instance 心得

相對於 Docker Hub 提供的公開的 Registry 服務,Azure Container Registry 可以用於建立 Private 的 Registry,讓團隊保存 Images。在費用計算上,Azure Container Registry 會根據儲存容量、容器 Build 所使用的時間來計價。

當開發團隊轉往容器的部署模式上,除了自建維護 Container Registry 外,使用 Azure Container Registry 是一個解決方案。

隨著容器化的開發部署方式盛行,在雲端上使用 Container Instance 也成為了部署選項之一。而陸續學習 App Service、Azure Function 到目前的 Azure Container Instance,
同樣都可以作為服務的載體,到底彼此之間有什麼樣的差異?

關於這個疑問,可以參考微軟在 Comparing Container Apps with other Azure container options當中的說明:

Azure App Service
完全受控 (Fully Managed) 的平台,適合用於 Web App 或者 Web API 的載體,支援使用 Code 或者是 Container 的部署方式,支援 Scale Out 與 Load Balance 機制
Azure Functions
Serverless 的架構,適用於將功能以函式實踐的開發服務方式
Azure Container Instances
負責作為 Image 的載體,可以視作 Azure Container Apps 的底層架構元件。相當於 Hyper-V 中的單一 Pod,不支援 Scale Out、Load balace 等機制

此外目前還沒學習到的選項介紹如下:

Azure Container Apps
適合用於微服務的開發架構,但不提供原生的 Kubernetes API 支援
Azure Kubernetes Service
適合微服務的開發架構,支援原生 Kubernetes API

目前對容器化的開發方式還相當陌生,只是初淺的整理相關的心得,但 Azure Container Registry 以及 Container Instance 提供了如果採用上雲且搭配容器化開發方式的一個選項 🤔