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

我們最近有一個客戶的網站功能出了一些小狀況，由於程式是用「容器」的方式執行，跑在 [Azure Container Instances](https://azure.microsoft.com/zh-tw/products/container-instances?WT.mc_id=DT-MVP-4015686) (ACI) 上，因此需要連到容器中查看一下狀況，有鑑於公司許多同事都沒有玩過 ACI 容器執行個體，所以我打算用這篇文章帶大家入門，一起來看看如何使用 [Azure CLI](https://docs.microsoft.com/zh-tw/cli/azure/?WT.mc_id=DT-MVP-4015686) 來操作 ACI 中的容器。

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9f20e84329398d8b0f26-cbf22297-a659-42e5-b416-201004cda1ac.jpg)

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

### 登入 Azure CLI 並取得授權

1.  登入 Azure CLI
    
    ```powershell
    az login --use-device-code
    ```
    
2.  切換到正確的 Azure 訂用帳戶
    
    ```powershell
    az account set -s "Microsoft Azure Sponsorship"
    ```
    

### 建立資源群組

1.  建立資源群組
    
    ```powershell
    az group create -l 'eastasia' -n 'group1'
    ```
    
2.  建立資源群組標籤
    
    ```powershell
    az group update -g 'group1' \
        --set tags.申請人員='黃OO' \
        --set tags.客戶名稱='台灣微軟' \
        --set tags.環境名稱='Testing' \
        --set tags.專案名稱='神奇的系統'
    ```
    

### 先在本機用 Docker 測試容器執行

在建立 ACI 容器之前，我們通常都一定會先在本機測試一下容器是否可以正常執行！

這裡我們以 [ACI Word Count](https://mcr.microsoft.com/en-us/artifact/mar/azuredocs/aci-wordcount) 這個容器為例，其用法很簡單，這個容器執行時會自動從容器中下載 [http://shakespeare.mit.edu/hamlet/full.html](http://shakespeare.mit.edu/hamlet/full.html) 網頁的內容回來，然後計算這個網頁中出現次數最多的前幾名英文單字。

1.  執行容器
    
    這裡我們需要傳入兩個環境變數，`NumWords` 與 `MinLength`，分別代表要計算前幾名的單字數量，以及單字最小長度。
    
    ```powershell
    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` 參數，去覆蓋容器中的預設進入點，這樣我們就可以進入容器中偵錯。
    
    ```powershell
    docker run -it --rm `
      -e NumWords=5 `
      -e MinLength=8 `
      --entrypoint /bin/bash `
      mcr.microsoft.com/azuredocs/aci-wordcount:latest
    ```
    
    進入容器後，你就可以看到容器中的主程式 `wordcount.py`：
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/f3c64da4472e7a2185fb-18e1849b-8c11-4acb-a5e6-f8055db91057.png)
    
    接著你就可以手動執行這支程式，來測試他的執行狀況或訊息：
    
    ```powershell
    python ./wordcount.py https://edition.cnn.com/
    ```
    

### 建立 Azure Container Instances 服務

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

1.  建立 Azure Container Instances 服務
    
    執行的命令跟 `docker run` 稍微有點不太一樣，但基本上不會差太多，在 [GitHub Copilot in the CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli) 的幫助下，也可以很容易寫出來！
    
    ```powershell
    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](https://azure.microsoft.com/zh-tw/products/container-registry?WT.mc_id=DT-MVP-4015686) (ACR) 上面，所以在建立容器時需要輸入 Registry 伺服器的認證資訊。
    
    ```powershell
    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.  查看執行記錄
    
    ```powershell
    az container logs -g 'group1' -n 'myapp'
    ```
    
3.  連線到容器中偵錯
    
    由於我們在執行 `aci-wordcount:latest` 的時候，程式執行完容器就會自動停止，所以我們必須調整執行容器時的**進入點**(`--entrypont`)，避免容器自動關閉。
    
    先刪除容器：
    
    ```powershell
    az container delete -g 'group1' -n 'myapp' --yes
    ```
    
    重新執行容器並指定啟動命令：`tail -f /dev/null`，這樣容器就會一直執行，不會自動關閉。
    
    ```powershell
    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` 進入容器中偵錯：
    
    ```powershell
    az container exec -g 'group1' -n 'myapp' --exec-command '/bin/bash'
    ```
    
    你也可以利用 `az container attach` 進入容器中中的「主程式」查看所有 `STDOUT` 與 `STDERR` 的內容：
    
    ```powershell
    az container attach -g 'group1' -n 'myapp'
    ```
    

### 查看容器執行狀態

1.  列出有多少容器正在執行
    
    ```powershell
    az container list -g 'group1'
    ```
    
2.  查看容器詳細資訊
    
    ```powershell
    az container show -g 'group1' -n 'myapp' -o jsonc
    ```
    
3.  停止容器
    
    ```powershell
    az container stop -g 'group1' -n 'myapp'
    ```
    
4.  啟動容器
    
    ```powershell
    az container start -g 'group1' -n 'myapp'
    ```
    
5.  重新啟動容器
    
    ```powershell
    az container restart -g 'group1' -n 'myapp'
    ```
    

### 透過 YAML 建立容器

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

1.  匯出容器 YAML 設定檔
    
    我們可以將執行成功的容器匯出成 YAML 設定檔，然後稍微修改一下，就可以用來建立新的容器。
    
    ```powershell
    az container export -g 'group1' -n 'myapp' --file 'myapp.yaml'
    ```
    
2.  透過 YAML 設定檔建立容器
    
    ```powershell
    az container create -g 'group1' -n 'myapp' --file 'myapp.yaml' -o json
    ```
    
    > 加上 `--debug` 可以看見非常詳細的執行過程記錄。
    

### 總結

其實 [az container](https://learn.microsoft.com/en-us/cli/azure/container?view=azure-cli-latest&WT.mc_id=DT-MVP-4015686) 的參數還蠻多的，如果想深入研究，還是建議多看一下官網文件。

我覺得 [Azure Container Instances](https://azure.microsoft.com/zh-tw/products/container-instances?WT.mc_id=DT-MVP-4015686) (ACI) 是一套非常輕量的容器平台解決方案，可以應付許多不同的應用情境，例如：背景排程處理、服務監控任務、...等等，而且它的價格也非常便宜，只要你不是 24 小時都要跑這個容器，其實都可以考慮使用 ACI 來部署應用程式。

就我們的專案來說，當時就是因為需要一支背景排程處理的程式，執行的時間並不固定，只有活動要開始的時候才需要執行，每次執行大約只要兩三個小時左右。不過，程式執行的時候，相當耗費 CPU 與記憶體資源，所以我們不想要放在 App Service 上面執行，一來怕會影響到其他服務，而來也不想為了這個短暫的服務建立獨立的 App Service Plan，所以我們才決定用 ACI 來部署這部分的功能，而且事後也證明成效相當卓越，也幫客戶節省了大量成本！

### 相關連結

-   [Azure Container Instances documentation](https://learn.microsoft.com/en-us/azure/container-instances/?WT.mc_id=DT-MVP-4015686)
    -   [Tutorial: Create a container image for deployment to Azure Container Instances](https://learn.microsoft.com/en-us/azure/container-instances/container-instances-tutorial-prepare-app?WT.mc_id=DT-MVP-4015686)
-   [az container | Microsoft Learn](https://learn.microsoft.com/en-us/cli/azure/container?view=azure-cli-latest&WT.mc_id=DT-MVP-4015686)
-   [ACI Word Count by Microsoft | Docker Hub](https://mcr.microsoft.com/en-us/artifact/mar/azuredocs/aci-wordcount)
-   [Azure Command-Line 介面 (CLI) 總覽 | Microsoft Docs](https://learn.microsoft.com/zh-tw/cli/azure/?WT.mc_id=DT-MVP-4015686)
