我們最近有一個客戶的網站功能出了一些小狀況,由於程式是用「容器」的方式執行,跑在 Azure Container Instances (ACI) 上,因此需要連到容器中查看一下狀況,有鑑於公司許多同事都沒有玩過 ACI 容器執行個體,所以我打算用這篇文章帶大家入門,一起來看看如何使用 Azure CLI 來操作 ACI 中的容器。
以下所有 Azure CLI 命令都是在 PowerShell 環境下執行。
登入 Azure CLI 並取得授權
-
登入 Azure CLI
az login --use-device-code
-
切換到正確的 Azure 訂用帳戶
az account set -s "Microsoft Azure Sponsorship"
建立資源群組
-
建立資源群組
az group create -l 'eastasia' -n 'group1'
-
建立資源群組標籤
az group update -g 'group1' \
--set tags.申請人員='黃OO' \
--set tags.客戶名稱='台灣微軟' \
--set tags.環境名稱='Testing' \
--set tags.專案名稱='神奇的系統'
先在本機用 Docker 測試容器執行
在建立 ACI 容器之前,我們通常都一定會先在本機測試一下容器是否可以正常執行!
這裡我們以 ACI Word Count 這個容器為例,其用法很簡單,這個容器執行時會自動從容器中下載 http://shakespeare.mit.edu/hamlet/full.html 網頁的內容回來,然後計算這個網頁中出現次數最多的前幾名英文單字。
-
執行容器
這裡我們需要傳入兩個環境變數,NumWords
與 MinLength
,分別代表要計算前幾名的單字數量,以及單字最小長度。
docker run -it --rm `
-e NumWords=5 `
-e MinLength=8 `
mcr.microsoft.com/azuredocs/aci-wordcount:latest
執行結果:
[('CLAUDIUS', 120),
('POLONIUS', 113),
('GERTRUDE', 82),
('ROSENCRANTZ', 69),
('GUILDENSTERN', 54)]
容器執行完之後,就會自動停止,由於我們加上了 --rm
參數,所以執行完畢後容器就會自動刪除。
-
偵錯容器
通常我們會透過 --entrypoint
參數,去覆蓋容器中的預設進入點,這樣我們就可以進入容器中偵錯。
docker run -it --rm `
-e NumWords=5 `
-e MinLength=8 `
--entrypoint /bin/bash `
mcr.microsoft.com/azuredocs/aci-wordcount:latest
進入容器後,你就可以看到容器中的主程式 wordcount.py
:
接著你就可以手動執行這支程式,來測試他的執行狀況或訊息:
python ./wordcount.py https://edition.cnn.com/
建立 Azure Container Instances 服務
在本機都測試過了,那我們就把容器上雲吧!
-
建立 Azure Container Instances 服務
執行的命令跟 docker run
稍微有點不太一樣,但基本上不會差太多,在 GitHub Copilot in the CLI 的幫助下,也可以很容易寫出來!
az container create -g 'group1' -n 'myapp' `
--environment-variables NumWords=5 MinLength=8 `
--restart-policy 'OnFailure' `
--image mcr.microsoft.com/azuredocs/aci-wordcount:latest
因為我們工作上所需的 image 都是放在 Azure Container Registry (ACR) 上面,所以在建立容器時需要輸入 Registry 伺服器的認證資訊。
az container create -g 'group1' -n 'myapp' `
--environment-variables NumWords=5 MinLength=8 `
--restart-policy 'OnFailure' `
--registry-login-server 'youracr.azurecr.io' `
--registry-username 'username' `
--registry-password 'your_password' `
--image mcr.microsoft.com/azuredocs/aci-wordcount:latest
-
查看執行記錄
az container logs -g 'group1' -n 'myapp'
-
連線到容器中偵錯
由於我們在執行 aci-wordcount:latest
的時候,程式執行完容器就會自動停止,所以我們必須調整執行容器時的進入點(--entrypont
),避免容器自動關閉。
先刪除容器:
az container delete -g 'group1' -n 'myapp' --yes
重新執行容器並指定啟動命令:tail -f /dev/null
,這樣容器就會一直執行,不會自動關閉。
az container create -g 'group1' -n 'myapp' `
--environment-variables 'NumWords=5' 'MinLength=8' `
--restart-policy 'OnFailure' `
--command-line 'tail -f /dev/null' `
--image mcr.microsoft.com/azuredocs/aci-wordcount:latest
使用 az container exec
進入容器中偵錯:
az container exec -g 'group1' -n 'myapp' --exec-command '/bin/bash'
你也可以利用 az container attach
進入容器中中的「主程式」查看所有 STDOUT
與 STDERR
的內容:
az container attach -g 'group1' -n 'myapp'
查看容器執行狀態
-
列出有多少容器正在執行
az container list -g 'group1'
-
查看容器詳細資訊
az container show -g 'group1' -n 'myapp' -o jsonc
-
停止容器
az container stop -g 'group1' -n 'myapp'
-
啟動容器
az container start -g 'group1' -n 'myapp'
-
重新啟動容器
az container restart -g 'group1' -n 'myapp'
透過 YAML 建立容器
有時候容器執行的環境比較複雜,例如你想建立「多容器」執行的服務,或是會傳入一大堆環境變數才能執行,這時候你就可以透過 YAML 設定檔來建立容器。
-
匯出容器 YAML 設定檔
我們可以將執行成功的容器匯出成 YAML 設定檔,然後稍微修改一下,就可以用來建立新的容器。
az container export -g 'group1' -n 'myapp' --file 'myapp.yaml'
-
透過 YAML 設定檔建立容器
az container create -g 'group1' -n 'myapp' --file 'myapp.yaml' -o json
加上 --debug
可以看見非常詳細的執行過程記錄。
總結
其實 az container 的參數還蠻多的,如果想深入研究,還是建議多看一下官網文件。
我覺得 Azure Container Instances (ACI) 是一套非常輕量的容器平台解決方案,可以應付許多不同的應用情境,例如:背景排程處理、服務監控任務、...等等,而且它的價格也非常便宜,只要你不是 24 小時都要跑這個容器,其實都可以考慮使用 ACI 來部署應用程式。
就我們的專案來說,當時就是因為需要一支背景排程處理的程式,執行的時間並不固定,只有活動要開始的時候才需要執行,每次執行大約只要兩三個小時左右。不過,程式執行的時候,相當耗費 CPU 與記憶體資源,所以我們不想要放在 App Service 上面執行,一來怕會影響到其他服務,而來也不想為了這個短暫的服務建立獨立的 App Service Plan,所以我們才決定用 ACI 來部署這部分的功能,而且事後也證明成效相當卓越,也幫客戶節省了大量成本!
相關連結