Documentație Azure Container Apps
Introducere
Azure Container Apps este un serviciu serverless complet gestionat de Microsoft Azure pentru implementarea aplicațiilor containerizate. Acest serviciu elimină necesitatea gestionării infrastructurii subiacente sau a orchestrării containerelor, permițând dezvoltatorilor să se concentreze pe codul aplicației.
Caracteristici principale
- Arhitectură serverless - scalare automată de la 0 la N instanțe, plătind doar pentru resursele utilizate efectiv
- Integrare cu tehnologii open-source - KEDA pentru scalare bazată pe evenimente, Dapr pentru microservicii
- Revizii multiple - posibilitatea de a rula versiuni diferite ale aplicației simultan
- Rețelistică avansată - suport pentru rețele virtuale personalizate și service discovery
- Monitorizare integrată - cu Azure Log Analytics pentru diagnosticare și depanare
Implementarea aplicațiilor în Azure Container Apps
În secțiunile următoare, vom prezenta abordarea pentru implementarea unei aplicații în Azure Container Apps utilizând GitHub Actions pentru CI/CD și Docker pentru containerizare. Vom analiza un exemplu concret al unei aplicații de tip quiz, detaliind fluxul complet de la build până la deploy în Azure.
Aplicația este disponibilă și pe GitHub.
Cerințe preliminare
Implementarea descrisă mai jos se bazează pe următoarele dependențe și presupuneri:
- Aplicația este încărcată într-un repository GitHub public (funcționează și în varianta cu repository privat, dar în acest caz intervin mici modificări în comanda de lansare în execuție a containerului)
- Utilizatorul are un cont Azure activ cu o subscriere activă (pentru Universitatea Tehnică din Cluj-Napoca, contul Azure este disponibil pentru studenți)
- Utilizatorul are instalat Azure CLI pe calculatorul local
Dacă doriți să replicați pașii, puteți crea un fork al repository-ului în contul vostru de GitHub. Atenție la eventuale “hardcodări” prezente în repository-ul original cu referire la contul ‘automatica-cluj’.
Arhitectura aplicației
Aplicația de exemplu este un joc de tip quiz unde utilizatorul are un timp limitat pentru a răspunde la întrebări. Jocul se încheie când utilizatorul greșește sau când timpul expiră.
Notă privind persistența datelor
Aplicația de quiz prezentată este în mod intenționat simplificată din perspectiva persistenței datelor. În loc să utilizeze un sistem de persistență complex și scalabil, cum ar fi o bază de date relațională (MySQL, PostgreSQL) sau NoSQL (MongoDB, Cosmos DB), aplicația folosește fișiere text simple pentru stocarea informațiilor:
- Întrebările quiz-ului sunt încărcate din fișierul
questions.txt
amplasat în resursele aplicației - Clasamentul jucătorilor este stocat în fișierul
leaderboard_data.txt
- Datele completate ale quiz-urilor finalizate sunt gestionate în memorie cu backup în fișierele text
Această simplificare a fost aleasă pentru a păstra focusul pe demonstrarea conceptelor de containerizare, CI/CD și deployment în Azure Container Apps, fără a complica arhitectura cu aspecte ce țin de persistența datelor. Într-un scenariu real de producție, ar fi necesare soluții de persistență mai robuste.
Structura generală
- Backend: Aplicația este construită cu Java 21 utilizând framework-ul Spring Boot, punctul principal de intrare fiind clasa
QuizApplication.java
- Pattern MVC: Proiectul urmează modelul Model-View-Controller:
- Model: Clase precum
Question
,QuizGame
șiUser
reprezintă structurile de date principale - View: Template-uri HTML (ex.
index.html
,quiz.html
,gameOver.html
) pentru interfața utilizator - Controller:
QuizWebController
gestionează cererile HTTP și navigarea între pagini
- Model: Clase precum
- Servicii: Componente precum
QuizSessionService
,Leaderboard
șiQuestionLoader
încapsulează logica de business - Persistență: Întrebările și datele clasamentului sunt stocate în fișiere text
Tehnologii de construcție și deployment
- Maven: Utilizat pentru construirea proiectului și gestionarea dependențelor
- Docker: Folosit pentru containerizare
- GitHub Actions: Configurate pentru CI/CD
- Azure Container Apps: Pentru găzduirea aplicației în cloud
Proces de implementare în Azure Container Apps
Pentru inceput compilam si rula aplicatia local pentru a o testa.
1. Construirea aplicației cu Maven
Primul pas este compilarea aplicației Java folosind Maven:
./mvnw clean package
2. Construirea și rularea containerului Docker
Aplicația poate fi containerizată și rulată local folosind Docker Compose:
docker compose up --build
După executarea acestei comenzi, aplicația este disponibilă la adresa http://localhost:8888.
In continuare vom instala aplicatia in Azure Container Apps.
3. Automatizare CI/CD cu GitHub Actions
Proiectul utilizează GitHub Actions pentru a construi automat o imagine Docker și a o publica în GitHub Container Registry (GHCR).
Funcționare
- La fiecare push în branch-ul
main
, GitHub Actions execută un workflow definit în.github/workflows/docker-ghcr.yml
- Workflow-ul:
- Construiește imaginea Docker utilizând
Dockerfile
-ul proiectului - Se autentifică la GHCR folosind credențialele GitHub
- Publică imaginea la
ghcr.io/<OWNER>/<REPO>:<TAG>
- Construiește imaginea Docker utilizând
După finalizarea cu succes a build-ului, imaginea este disponibilă la ghcr.io/<OWNER>/<REPO>:latest
și poate fi vizualizată în interfața GHCR.
4. Deployment în Azure Container Apps (CLI)
Pentru a rula aplicația în Azure folosind Container Apps, se execută următoarele comenzi:
Crearea Grupului de Resurse
az group create --name cursIsp2025 --location westeurope
Crearea Mediului Container App
az containerapp env create --name my-quiz-env --resource-group cursIsp2025 --location westeurope
Crearea Aplicației Container
az containerapp create --name isp-quiz-app --resource-group cursIsp2025 --environment my-quiz-env --image ghcr.io/automatica-cluj/isp-quiz:latest --target-port 8888 --ingress external --transport http
Actualizarea Aplicației Container
Pentru a implementa o nouă versiune a imaginii container:
az containerapp update --name isp-quiz-app --resource-group cursIsp2025 --image ghcr.io/automatica-cluj/isp-quiz:latest
Alternativ, imaginea poate fi actualizată și aplicația repornită din portalul Azure folosind butonul de reîmprospătare.
Oprirea Aplicației Container
Oprirea și pornirea aplicației pot fi realizate prin intermediul dashboard-ului portalului Azure.
5. Economisirea costurilor
Pentru a evita generarea de costuri pentru resursele create, aplicația container poate fi oprită și grupul de resurse poate fi șters. Acest lucru se poate face din portalul Azure sau prin CLI.