Azure Learn AZ-204 The Hard Way | 實作 AZ-204 Lab 05 Azure Container
2022-03-18
實作 AZ-204 證照測驗準備的實驗課程,從實驗課程中精熟 AZ-204 的測驗重點以及工具操作。本次要實驗的是如何使用 Azure Container。
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 提供了如果採用上雲且搭配容器化開發方式的一個選項 🤔