The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

使用 Azure CLI 快速建立 Azure Container Instances 並連線到容器中測試

我們最近有一個客戶的網站功能出了一些小狀況,由於程式是用「容器」的方式執行,跑在 Azure Container Instances (ACI) 上,因此需要連到容器中查看一下狀況,有鑑於公司許多同事都沒有玩過 ACI 容器執行個體,所以我打算用這篇文章帶大家入門,一起來看看如何使用 Azure CLI 來操作 ACI 中的容器。

image

以下所有 Azure CLI 命令都是在 PowerShell 環境下執行。

登入 Azure CLI 並取得授權

  1. 登入 Azure CLI

    az login --use-device-code
    
  2. 切換到正確的 Azure 訂用帳戶

    az account set -s "Microsoft Azure Sponsorship"
    

建立資源群組

  1. 建立資源群組

    az group create -l 'eastasia' -n 'group1'
    
  2. 建立資源群組標籤

    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 網頁的內容回來,然後計算這個網頁中出現次數最多的前幾名英文單字。

  1. 執行容器

    這裡我們需要傳入兩個環境變數,NumWordsMinLength,分別代表要計算前幾名的單字數量,以及單字最小長度。

    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 參數,所以執行完畢後容器就會自動刪除。

  2. 偵錯容器

    通常我們會透過 --entrypoint 參數,去覆蓋容器中的預設進入點,這樣我們就可以進入容器中偵錯。

    docker run -it --rm `
      -e NumWords=5 `
      -e MinLength=8 `
      --entrypoint /bin/bash `
      mcr.microsoft.com/azuredocs/aci-wordcount:latest
    

    進入容器後,你就可以看到容器中的主程式 wordcount.py

    image

    接著你就可以手動執行這支程式,來測試他的執行狀況或訊息:

    python ./wordcount.py https://edition.cnn.com/
    

建立 Azure Container Instances 服務

在本機都測試過了,那我們就把容器上雲吧!

  1. 建立 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
    
  2. 查看執行記錄

    az container logs -g 'group1' -n 'myapp'
    
  3. 連線到容器中偵錯

    由於我們在執行 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 進入容器中中的「主程式」查看所有 STDOUTSTDERR 的內容:

    az container attach -g 'group1' -n 'myapp'
    

查看容器執行狀態

  1. 列出有多少容器正在執行

    az container list -g 'group1'
    
  2. 查看容器詳細資訊

    az container show -g 'group1' -n 'myapp' -o jsonc
    
  3. 停止容器

    az container stop -g 'group1' -n 'myapp'
    
  4. 啟動容器

    az container start -g 'group1' -n 'myapp'
    
  5. 重新啟動容器

    az container restart -g 'group1' -n 'myapp'
    

透過 YAML 建立容器

有時候容器執行的環境比較複雜,例如你想建立「多容器」執行的服務,或是會傳入一大堆環境變數才能執行,這時候你就可以透過 YAML 設定檔來建立容器。

  1. 匯出容器 YAML 設定檔

    我們可以將執行成功的容器匯出成 YAML 設定檔,然後稍微修改一下,就可以用來建立新的容器。

    az container export -g 'group1' -n 'myapp' --file 'myapp.yaml'
    
  2. 透過 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 來部署這部分的功能,而且事後也證明成效相當卓越,也幫客戶節省了大量成本!

相關連結

留言評論