From f4764253e454e155e4a523f6731d8f3a9b321f01 Mon Sep 17 00:00:00 2001 From: Luca Sacchi Ricciardi Date: Fri, 10 Apr 2026 13:43:02 +0000 Subject: [PATCH] fix: align lab02 and lab03 student verification flows --- labs/lab-02-network/README.md | 11 ++++- .../how-to-guides/cleanup-networks.md | 6 +-- .../tests/99-final-verification.sh | 31 ++++++------- .../tutorial/01-create-vpc-networks.md | 8 ++++ .../tutorial/02-deploy-containers-networks.md | 13 ++++-- .../tutorial/03-verify-network-isolation.md | 30 ++++++------ labs/lab-03-compute/Dockerfile | 2 +- labs/lab-03-compute/README.md | 11 ++++- .../reference/ec2-instance-mapping.md | 2 +- .../tests/99-final-verification.sh | 46 ++++++++++++------- .../tutorial/01-set-resource-limits.md | 2 + .../tutorial/02-implement-healthchecks.md | 4 +- .../tutorial/03-dependencies-with-health.md | 4 +- 13 files changed, 105 insertions(+), 65 deletions(-) diff --git a/labs/lab-02-network/README.md b/labs/lab-02-network/README.md index b24c53b..05c874e 100644 --- a/labs/lab-02-network/README.md +++ b/labs/lab-02-network/README.md @@ -4,12 +4,19 @@ Crea reti Docker isolate che simulano VPC e Subnets cloud. ## Avvio del Laboratorio +Leggi prima i tutorial nell'ordine indicato sotto. In questo lab il `Dockerfile` e solo un supporto per esempi e test manuali: il flusso principale usa `docker-compose.yml`. + ```bash cd labs/lab-02-network -docker build . docker compose up -d ``` +## Ordine Consigliato + +1. `tutorial/01-create-vpc-networks.md` +2. `tutorial/02-deploy-containers-networks.md` +3. `tutorial/03-verify-network-isolation.md` + ## Verifica Completamento ```bash @@ -21,4 +28,4 @@ bash tests/99-final-verification.sh - [Tutorial](tutorial/) - Guida passo-passo - [How-to Guides](how-to-guides/) - Procedure specifiche - [Reference](reference/) - Documentazione tecnica -- [Explanation](explanation/) - Paralleli cloud \ No newline at end of file +- [Explanation](explanation/) - Paralleli cloud diff --git a/labs/lab-02-network/how-to-guides/cleanup-networks.md b/labs/lab-02-network/how-to-guides/cleanup-networks.md index 131c460..f2c3a52 100644 --- a/labs/lab-02-network/how-to-guides/cleanup-networks.md +++ b/labs/lab-02-network/how-to-guides/cleanup-networks.md @@ -38,7 +38,7 @@ docker network prune ### Lab 02 Network Cleanup ```bash -cd ~/laboratori-cloud/labs/lab-02-network +cd /home/luca/laboratori-cloud/labs/lab-02-network # Ferma e rimuovi container del compose docker compose down @@ -53,7 +53,7 @@ docker volume rm lab02-network_db-data 2>/dev/null || true ### Reset Completo Lab 02 ```bash -cd ~/laboratori-cloud/labs/lab-02-network +cd /home/luca/laboratori-cloud/labs/lab-02-network # Tutto giu docker compose down -v --remove-orphans @@ -99,4 +99,4 @@ docker system prune -a --volumes ## Vedi Anche - [Reference: Docker Network Commands](../reference/docker-network-commands.md) -- [How-To: Reset Ambiente Docker](../../how-to-guides/reset-docker-environment.md) +- [Script reset ambiente](../../../scripts/reset-env.sh) diff --git a/labs/lab-02-network/tests/99-final-verification.sh b/labs/lab-02-network/tests/99-final-verification.sh index 0f7a24d..6967cc5 100755 --- a/labs/lab-02-network/tests/99-final-verification.sh +++ b/labs/lab-02-network/tests/99-final-verification.sh @@ -16,7 +16,7 @@ NC='\033[0m' # Get script directory TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$TEST_DIR/../.." && pwd)" +PROJECT_ROOT="$(cd "$TEST_DIR/../../.." && pwd)" LAB_DIR="$PROJECT_ROOT/labs/lab-02-network" # Counter helpers @@ -61,7 +61,9 @@ print_info() { } # Main header -clear +if command -v clear &> /dev/null; then + clear +fi print_header "Lab 02: Network & VPC - Final Verification" echo "" echo -e "This script verifies your entire Lab 02 implementation." @@ -105,7 +107,7 @@ if [[ "${FAIL_REASON:-}" == "compose_missing" ]]; then print_warn "Skipping network tests - compose file missing" else # Check for custom networks - NETWORKS=$(docker compose -f "$COMPOSE_FILE" config --format json 2>/dev/null | grep -o '"networks"' | wc -l || echo "0") + NETWORKS=$(docker compose -f "$COMPOSE_FILE" config --format json 2>/dev/null | grep -o '"networks"' | wc -l) if [[ $NETWORKS -gt 0 ]]; then print_pass "Custom networks defined in docker-compose.yml" @@ -119,7 +121,7 @@ else fi # Check for VPC-style naming (PARA-02 requirement) - VPC_NAMES=$(grep -E 'vpc-|subnet-|network-' "$COMPOSE_FILE" 2>/dev/null | wc -l || echo "0") + VPC_NAMES=$(grep -E 'vpc-|subnet-|network-' "$COMPOSE_FILE" 2>/dev/null | wc -l) if [[ $VPC_NAMES -gt 0 ]]; then print_pass "Uses VPC-style naming convention (PARA-02 compliant)" else @@ -132,7 +134,7 @@ print_section "3. INF-02 Security Compliance" if [[ -f "$COMPOSE_FILE" ]]; then # Check for 0.0.0.0 bindings - ZERO_BINDINGS=$(grep -c -E '0\.0\.0\.0:[0-9]+' "$COMPOSE_FILE" 2>/dev/null || echo "0") + ZERO_BINDINGS=$(grep -c -E '0\.0\.0\.0:[0-9]+' "$COMPOSE_FILE" 2>/dev/null || true) if [[ $ZERO_BINDINGS -eq 0 ]]; then print_pass "No 0.0.0.0 port bindings found (INF-02 compliant)" else @@ -142,7 +144,7 @@ if [[ -f "$COMPOSE_FILE" ]]; then fi # Check for localhost bindings - LOCALHOST_BINDINGS=$(grep -c -E '127\.0\.0\.1:[0-9]+' "$COMPOSE_FILE" 2>/dev/null || echo "0") + LOCALHOST_BINDINGS=$(grep -c -E '127\.0\.0\.1:[0-9]+' "$COMPOSE_FILE" 2>/dev/null || true) if [[ $LOCALHOST_BINDINGS -gt 0 ]]; then print_pass "Found $LOCALHOST_BINDINGS service(s) with 127.0.0.1 binding (secure)" else @@ -150,7 +152,7 @@ if [[ -f "$COMPOSE_FILE" ]]; then fi # Check for host networking - HOST_NET=$(grep -c -E 'network_mode:\s*host' "$COMPOSE_FILE" 2>/dev/null || echo "0") + HOST_NET=$(grep -c -E 'network_mode:\s*host' "$COMPOSE_FILE" 2>/dev/null || true) if [[ $HOST_NET -eq 0 ]]; then print_pass "No services using host networking mode" else @@ -193,9 +195,9 @@ print_section "5. Documentation Completeness (Diátxis Framework)" DOC_COUNT=0 DOC_FILES=( - "$LAB_DIR/tutorial/01-create-networks.md" - "$LAB_DIR/tutorial/02-deploy-containers.md" - "$LAB_DIR/tutorial/03-verify-isolation.md" + "$LAB_DIR/tutorial/01-create-vpc-networks.md" + "$LAB_DIR/tutorial/02-deploy-containers-networks.md" + "$LAB_DIR/tutorial/03-verify-network-isolation.md" "$LAB_DIR/how-to-guides/*.md" "$LAB_DIR/reference/*.md" "$LAB_DIR/explanation/*.md" @@ -223,10 +225,7 @@ fi print_section "6. Test Infrastructure Verification" TEST_FILES=( - "$TEST_DIR/01-network-creation-test.sh" - "$TEST_DIR/02-isolation-verification-test.sh" - "$TEST_DIR/03-inf02-compliance-test.sh" - "$TEST_DIR/run-all-tests.sh" + "$TEST_DIR/99-final-verification.sh" ) TESTS_FOUND=0 @@ -237,9 +236,9 @@ for test_file in "${TEST_FILES[@]}"; do done if [[ $TESTS_FOUND -eq ${#TEST_FILES[@]} ]]; then - print_pass "All test scripts present and executable" + print_pass "Final verification script present and executable" elif [[ $TESTS_FOUND -gt 0 ]]; then - print_warn "Some test scripts missing: $TESTS_FOUND/${#TEST_FILES[@]} found" + print_warn "Some expected test scripts missing: $TESTS_FOUND/${#TEST_FILES[@]} found" else print_fail "Test infrastructure not found" fi diff --git a/labs/lab-02-network/tutorial/01-create-vpc-networks.md b/labs/lab-02-network/tutorial/01-create-vpc-networks.md index 109b775..6f574de 100644 --- a/labs/lab-02-network/tutorial/01-create-vpc-networks.md +++ b/labs/lab-02-network/tutorial/01-create-vpc-networks.md @@ -8,6 +8,8 @@ Creare due reti isolate che simulano una subnet pubblica e una subnet privata in - **VPC Public Subnet**: `lab02-vpc-public` (10.0.1.0/24) - per servizi accessibili - **VPC Private Subnet**: `lab02-vpc-private` (10.0.2.0/24) - isolata, senza accesso esterno +Nota pratica: il tutorial 2 usa `docker compose` per creare e gestire le stesse reti. Se segui questo tutorial alla lettera con `docker network create`, prima di avviare il compose dovrai rimuovere le reti manuali oppure dichiararle come reti esterne. Nel flusso consigliato per studenti conviene usare questo tutorial per capire i concetti e usare il compose del tutorial 2 come implementazione finale. + ## Prerequisiti - Docker Engine >= 24.0 installato e in esecuzione @@ -261,6 +263,12 @@ Hai completato questo tutorial quando: Nel [prossimo tutorial](./02-deploy-containers-networks.md) imparerai a distribuire container in queste reti usando docker-compose.yml, creando un'architettura multi-tier (web pubblica, database privato). +Prima di passare al tutorial 2, se hai creato le reti manualmente in questo tutorial, puliscile per evitare conflitti con Compose: + +```bash +docker network rm lab02-vpc-public lab02-vpc-private +``` + --- ## Troubleshooting diff --git a/labs/lab-02-network/tutorial/02-deploy-containers-networks.md b/labs/lab-02-network/tutorial/02-deploy-containers-networks.md index d39d9f7..23b9434 100644 --- a/labs/lab-02-network/tutorial/02-deploy-containers-networks.md +++ b/labs/lab-02-network/tutorial/02-deploy-containers-networks.md @@ -20,7 +20,7 @@ Creare un'architettura multi-tier con docker-compose: Esegui: ```bash -cd ~/laboratori-cloud/labs/lab-02-network +cd /home/luca/laboratori-cloud/labs/lab-02-network ``` --- @@ -96,6 +96,8 @@ volumes: Salva il file. +Nota: in questo repository il file `docker-compose.yml` esiste gia. Puoi confrontare il tuo file con quello presente oppure usare direttamente quello del lab. + --- ## Passo 3: Verificare la Configurazione @@ -114,9 +116,12 @@ Se valido, vedrai la configurazione completa. Se ci sono errori, verranno mostra ## Passo 4: Avviare i Servizi +Se nel tutorial 1 hai creato le reti manualmente con gli stessi nomi, rimuovile prima di questo comando. Altrimenti `docker compose up -d` fallisce per conflitto di ownership/label delle reti. + Esegui: ```bash +docker network rm lab02-vpc-public lab02-vpc-private 2>/dev/null || true docker compose up -d ``` @@ -156,7 +161,7 @@ Esegui: ```bash # Verifica container web nella rete pubblica -docker inspect lab02-web --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} in {{.NetworkID}}{{end}}' +docker inspect lab02-web --format '{{range $k, $v := .NetworkSettings.Networks}}{{$v.IPAddress}} in {{$k}}{{end}}' ``` Atteso (IP nella subnet pubblica): @@ -168,7 +173,7 @@ Esegui: ```bash # Verifica database nella rete privata -docker inspect lab02-db --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} in {{.NetworkID}}{{end}}' +docker inspect lab02-db --format '{{range $k, $v := .NetworkSettings.Networks}}{{$v.IPAddress}} in {{$k}}{{end}}' ``` Atteso (IP nella subnet privata): @@ -180,7 +185,7 @@ Esegui: ```bash # Verifica app in entrambe le reti (multi-homed) -docker inspect lab02-app --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} in {{.NetworkID}} | {{end}}' +docker inspect lab02-app --format '{{range $k, $v := .NetworkSettings.Networks}}{{$v.IPAddress}} in {{$k}} | {{end}}' ``` Atteso: diff --git a/labs/lab-02-network/tutorial/03-verify-network-isolation.md b/labs/lab-02-network/tutorial/03-verify-network-isolation.md index c1835cf..0095dda 100644 --- a/labs/lab-02-network/tutorial/03-verify-network-isolation.md +++ b/labs/lab-02-network/tutorial/03-verify-network-isolation.md @@ -13,7 +13,7 @@ Verificare che: ## Prerequisiti - Completati [Tutorial 1](./01-create-vpc-networks.md) e [Tutorial 2](./02-deploy-containers-networks.md) -- Container in esecuzione: `docker compose ps` mostra 3 container attivi +- Container in esecuzione: `docker ps` mostra almeno `lab02-web`, `lab02-app` e `lab02-db` attivi --- @@ -22,11 +22,11 @@ Verificare che: Esegui: ```bash -cd ~/laboratori-cloud/labs/lab-02-network +cd /home/luca/laboratori-cloud/labs/lab-02-network docker compose ps ``` -Assicurati che lab02-web, lab02-app, e lab02-db siano "Up". +Assicurati che `lab02-web`, `lab02-app` e `lab02-db` siano "Up". Se `docker compose ps` non mostra nulla ma `docker compose up -d` e andato a buon fine, verifica con `docker ps | grep '^lab02-'`. Se non lo sono: @@ -44,15 +44,15 @@ Esegui: ```bash # Verifica: app puo raggiungere web (stessa rete pubblica) -docker exec lab02-app ping -c 2 lab02-web +docker exec lab02-app ping -c 2 web ``` Atteso: ``` -PING lab02-web (10.0.1.10): 56 data bytes +PING web (10.0.1.10): 56 data bytes 64 bytes from 10.0.1.10: seq=0 ttl=64 time=0.123 ms 64 bytes from 10.0.1.10: seq=1 ttl=64 time=0.045 ms ---- lab02-web ping statistics --- +--- web ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss ``` @@ -68,18 +68,18 @@ Esegui: ```bash # Verifica: web NON puo raggiungere db (reti diverse) -docker exec lab02-web ping -c 2 lab02-db +docker exec lab02-web ping -c 2 db ``` Atteso: ``` -ping: bad address 'lab02-db' +ping: bad address 'db' ``` Oppure: ``` -PING lab02-db (10.0.2.10): 56 data bytes ---- lab02-db ping statistics --- +PING db (10.0.2.10): 56 data bytes +--- db ping statistics --- 2 packets transmitted, 0 packets received, 100% packet loss ``` @@ -97,7 +97,7 @@ Esegui: ```bash # Verifica: app puo raggiungere web (stessa rete pubblica) -docker exec lab02-app ping -c 2 lab02-web +docker exec lab02-app ping -c 2 web ``` Atteso: SUCCESSO @@ -106,7 +106,7 @@ Esegui: ```bash # Verifica: app puo raggiungere db (stessa rete privata) -docker exec lab02-app ping -c 2 lab02-db +docker exec lab02-app ping -c 2 db ``` Atteso: SUCCESSO @@ -123,12 +123,12 @@ Esegui: ```bash # Test DNS nella stessa rete -docker exec lab02-app nslookup lab02-web +docker exec lab02-app nslookup web ``` Atteso: ``` -Name: lab02-web +Name: web Address 1: 10.0.1.10 ``` @@ -136,7 +136,7 @@ Esegui: ```bash # Test DNS cross-rete (dovrebbe fallire) -docker exec lab02-web nslookup lab02-db +docker exec lab02-web nslookup db ``` Atteso: Fallisce o restituisce errore diff --git a/labs/lab-03-compute/Dockerfile b/labs/lab-03-compute/Dockerfile index ab2a406..6b5fea7 100644 --- a/labs/lab-03-compute/Dockerfile +++ b/labs/lab-03-compute/Dockerfile @@ -9,7 +9,7 @@ RUN addgroup -g 1000 appgroup && \ # Installare strumenti di stress testing e monitoraggio RUN apk add --no-cache \ - stress \ + stress-ng \ curl \ wget \ procps \ diff --git a/labs/lab-03-compute/README.md b/labs/lab-03-compute/README.md index db8ff5a..868fefb 100644 --- a/labs/lab-03-compute/README.md +++ b/labs/lab-03-compute/README.md @@ -4,12 +4,19 @@ Deploy container con limiti CPU/memoria e healthchecks. ## Avvio del Laboratorio +Leggi prima i tutorial nell'ordine indicato sotto. Il flusso principale del lab usa `docker-compose.yml`; il `Dockerfile` e un supporto separato per test e strumenti. + ```bash cd labs/lab-03-compute -docker build . docker compose up -d ``` +## Ordine Consigliato + +1. `tutorial/01-set-resource-limits.md` +2. `tutorial/02-implement-healthchecks.md` +3. `tutorial/03-dependencies-with-health.md` + ## Verifica Completamento ```bash @@ -21,4 +28,4 @@ bash tests/99-final-verification.sh - [Tutorial](tutorial/) - Guida passo-passo - [How-to Guides](how-to-guides/) - Procedure specifiche - [Reference](reference/) - Documentazione tecnica -- [Explanation](explanation/) - Paralleli cloud \ No newline at end of file +- [Explanation](explanation/) - Paralleli cloud diff --git a/labs/lab-03-compute/reference/ec2-instance-mapping.md b/labs/lab-03-compute/reference/ec2-instance-mapping.md index 607cc38..62e35a6 100644 --- a/labs/lab-03-compute/reference/ec2-instance-mapping.md +++ b/labs/lab-03-compute/reference/ec2-instance-mapping.md @@ -121,7 +121,7 @@ app: ```yaml production: - image: myapp:latest + image: nginx:alpine deploy: resources: limits: diff --git a/labs/lab-03-compute/tests/99-final-verification.sh b/labs/lab-03-compute/tests/99-final-verification.sh index 0df8436..8d3e2a6 100755 --- a/labs/lab-03-compute/tests/99-final-verification.sh +++ b/labs/lab-03-compute/tests/99-final-verification.sh @@ -113,11 +113,14 @@ print_header "Section 2: INF-03 Compliance (Resource Limits)" print_test "Verifying all services have resource limits" NON_COMPLIANT=0 LIMITS_SUMMARY="" +COMPOSE_CONFIG=$(docker compose config 2>/dev/null) for service in $SERVICES; do + service_block=$(printf '%s\n' "$COMPOSE_CONFIG" | grep -A 20 "^ $service:") + # Check for resource limits - has_cpu=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep -c "cpus:" || echo "0") - has_memory=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep -c "memory:" || echo "0") + has_cpu=$(printf '%s\n' "$service_block" | grep -c "cpus:" || true) + has_memory=$(printf '%s\n' "$service_block" | grep -c "memory:" || true) if [[ $has_cpu -eq 0 ]]; then print_fail " $service: Missing cpus limit" @@ -126,8 +129,8 @@ for service in $SERVICES; do print_fail " $service: Missing memory limit" ((NON_COMPLIANT++)) || true else - cpu_val=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep "cpus:" | sed 's/.*cpus: //' | tr -d ' "') - mem_val=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep "memory:" | sed 's/.*memory: //' | tr -d " '"") + cpu_val=$(printf '%s\n' "$service_block" | grep -m1 "cpus:" | sed 's/.*cpus: //' | tr -d ' "') + mem_val=$(printf '%s\n' "$service_block" | grep -m1 "memory:" | sed 's/.*memory: //' | tr -d ' "') # Map to EC2 instance type case "$cpu_val:$mem_val" in @@ -159,15 +162,20 @@ MISSING_HC=0 HC_SUMMARY="" for service in $SERVICES; do - has_hc=$(docker compose config 2>/dev/null | grep -A 50 "^$service:" | grep -c "healthcheck:" || echo "0") + service_block=$(printf '%s\n' "$COMPOSE_CONFIG" | grep -A 20 "^ $service:") + has_hc=$(printf '%s\n' "$service_block" | grep -c "healthcheck:" || true) if [[ $has_hc -eq 0 ]]; then print_fail " $service: Missing healthcheck" ((MISSING_HC++)) || true else - interval=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "interval:" | sed 's/.*interval: //' | tr -d " '"" || echo "N/A") - timeout=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "timeout:" | sed 's/.*timeout: //' | tr -d " '"" || echo "N/A") - retries=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "retries:" | sed 's/.*retries: //' | tr -d " '"" || echo "N/A") + interval=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "interval:" | sed 's/.*interval: //' | tr -d ' "' || true) + timeout=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "timeout:" | sed 's/.*timeout: //' | tr -d ' "' || true) + retries=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "retries:" | sed 's/.*retries: //' | tr -d ' "' || true) + + interval=${interval:-N/A} + timeout=${timeout:-N/A} + retries=${retries:-N/A} print_pass " $service: interval=$interval, timeout=$timeout, retries=$retries" HC_SUMMARY="$HC_SUMMARY\n • $service: interval=$interval, timeout=$timeout, retries=$retries" @@ -208,10 +216,12 @@ print_test "Checking resource limits are applied" LIMITS_ENFORCED=0 for service in $SERVICES; do - container_name="lab03-$service" - if docker ps --format '{{.Names}}' | grep -q "$container_name"; then - nano_cpus=$(docker inspect "$container_name" --format '{{.HostConfig.NanoCpus}}' 2>/dev/null || echo "0") - mem_bytes=$(docker inspect "$container_name" --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0") + container_id=$(docker compose ps -q "$service" 2>/dev/null || echo "") + if [[ -n "$container_id" ]]; then + container_name=$(docker inspect "$container_id" --format '{{.Name}}' 2>/dev/null || echo "$service") + container_name=${container_name#/} + nano_cpus=$(docker inspect "$container_id" --format '{{.HostConfig.NanoCpus}}' 2>/dev/null || echo "0") + mem_bytes=$(docker inspect "$container_id" --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0") if [[ $nano_cpus -gt 0 && $mem_bytes -gt 0 ]]; then cpu_cores=$(echo "scale=2; $nano_cpus / 1000000000" | bc 2>/dev/null || echo "N/A") @@ -237,7 +247,7 @@ fi # Test docker stats print_test "Monitoring resource usage" echo -e "\n${BLUE}Live Resource Usage:${NC}" -docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null || print_fail "docker stats failed" +docker ps --format '{{.Names}}' | grep '^lab03-' | xargs -r docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null || print_fail "docker stats failed" # === SECTION 6: Health Status === print_header "Section 6: Health Status Verification" @@ -246,9 +256,11 @@ print_test "Checking container health status" HEALTHY=0 for service in $SERVICES; do - container_name="lab03-$service" - if docker ps --format '{{.Names}}' | grep -q "$container_name"; then - health=$(docker inspect "$container_name" --format '{{.State.Health.Status}}' 2>/dev/null || echo "no-healthcheck") + container_id=$(docker compose ps -q "$service" 2>/dev/null || echo "") + if [[ -n "$container_id" ]]; then + container_name=$(docker inspect "$container_id" --format '{{.Name}}' 2>/dev/null || echo "$service") + container_name=${container_name#/} + health=$(docker inspect "$container_id" --format '{{.State.Health.Status}}' 2>/dev/null || echo "no-healthcheck") if [[ "$health" == "healthy" ]]; then print_pass " $container_name: healthy ✓" @@ -264,7 +276,7 @@ done if [[ $HEALTHY -gt 0 ]]; then print_pass "✓ $HEALTHY containers are healthy" else - print_warning "No healthy containers yet (may still be starting)" + print_warning "No healthy containers yet; they may still be starting" fi # === SECTION 7: Cloud Parallels === diff --git a/labs/lab-03-compute/tutorial/01-set-resource-limits.md b/labs/lab-03-compute/tutorial/01-set-resource-limits.md index 5cd815f..0599def 100644 --- a/labs/lab-03-compute/tutorial/01-set-resource-limits.md +++ b/labs/lab-03-compute/tutorial/01-set-resource-limits.md @@ -120,6 +120,8 @@ services: restart: unless-stopped ``` +Nota: in questo repository il file `docker-compose.yml` finale esiste gia. Puoi usarlo come riferimento o partire direttamente da quello presente nel lab. + ### Step 2: Verificare la sintassi ```bash diff --git a/labs/lab-03-compute/tutorial/02-implement-healthchecks.md b/labs/lab-03-compute/tutorial/02-implement-healthchecks.md index af4cb92..6cc20bb 100644 --- a/labs/lab-03-compute/tutorial/02-implement-healthchecks.md +++ b/labs/lab-03-compute/tutorial/02-implement-healthchecks.md @@ -211,7 +211,7 @@ Per comandi più complessi, usa `CMD-SHELL`: ```yaml app: - image: myapp:latest + image: nginx:alpine container_name: lab03-app hostname: app @@ -223,7 +223,7 @@ Per comandi più complessi, usa `CMD-SHELL`: # Custom healthcheck with shell healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost/health || exit 1"] + test: ["CMD-SHELL", "curl -f http://localhost/ || exit 1"] interval: 15s timeout: 3s retries: 3 diff --git a/labs/lab-03-compute/tutorial/03-dependencies-with-health.md b/labs/lab-03-compute/tutorial/03-dependencies-with-health.md index ba23fc4..d8e2ab2 100644 --- a/labs/lab-03-compute/tutorial/03-dependencies-with-health.md +++ b/labs/lab-03-compute/tutorial/03-dependencies-with-health.md @@ -226,10 +226,10 @@ docker compose logs --tail=50 Cerca messaggi tipo: ``` lab03-db | database system is ready to accept connections -lab03-app | Waiting for db to be healthy... -lab03-web | Waiting for app to be healthy... ``` +Nota: le righe `Waiting for db to be healthy...` e `Waiting for app to be healthy...` sono una spiegazione didattica del comportamento atteso, non un output reale generato da nginx o postgres in questo lab. + --- ## Parte 5: Testare le Dipendenze