presentato da Fabio 'Loviuz' Lovato
Introduzione a Docker
Docker è una piattaforma open-source che consente di automatizzare la pubblicazione di applicazioni all'interno di contenitori. Questi contenitori sono ambienti leggeri e portabili che possono essere eseguiti su qualsiasi sistema che supporti Docker, rendendo più semplice la gestione delle applicazioni in vari ambienti, come sviluppo, test e produzione.
Cos'è un Contenitore?
- Un contenitore è un'unità standard di software che incapsula il codice e tutte le sue dipendenze
- Ogni contenitore è isolato dagli altri, il che significa che le applicazioni possono funzionare senza conflitti di dipendenze
- I contenitori sono leggeri e avviabili in pochi secondi, rendendo il ciclo di vita delle applicazioni più agile
Teoria di Funzionamento
- Docker utilizza il kernel del sistema operativo host per eseguire i contenitori rispetto alle macchine virtuali tradizionali
- Le immagini Docker sono istantanee (snapshot) di file system che contengono tutto il necessario per eseguire un'applicazione, incluse librerie e configurazioni
- Le immagini possono essere versionate e condivise tramite registri come Docker Hub (hub.docker.com), facilitando la distribuzione delle applicazioni
Vantaggi di Docker
- Portabilità: I contenitori possono essere eseguiti su qualsiasi sistema che supporti Docker, garantendo coerenza tra ambienti di sviluppo e produzione
- Isolamento: Ogni contenitore è indipendente, riducendo il rischio di conflitti tra applicazioni e dipendenze
- Efficienza: I contenitori utilizzano meno risorse rispetto alle macchine virtuali, consentendo di eseguire più applicazioni sullo stesso hardware
- Velocità: I contenitori si avviano in pochi secondi, accelerando il ciclo di sviluppo e distribuzione delle applicazioni
Svantaggi di Docker
- Isolamento meno forte: a differenza delle macchine virtuali, i contenitori condividono il kernel dell'host (rischi per la sicurezza)
- Gestione della sicurezza: Le vulnerabilità nel kernel possono influenzare tutti i contenitori in esecuzione, richiedendo una gestione attenta della sicurezza
- Curva di apprendimento: Per i nuovi utenti, Docker può presentare una curva di apprendimento, specialmente per la gestione delle immagini e dei contenitori
Paragone con Altri Sistemi di Virtualizzazione
Caratteristica |
Docker |
VM Tradizionali |
Isolamento |
Contenitori condividono il kernel |
Ogni VM ha il proprio kernel |
Risorse |
Leggero e veloce |
Pesante e richiede più risorse |
Avvio |
Rapido (secondi) |
Lento (minuti) |
Esempi pratici di utilizzo
- Microservizi: un'azienda di e-commerce può creare contenitori per microservizi (catalogo, database, API), consentendo scalabilità e sviluppo indipendente
- Integrazione Continua/Distribuzione Continua (CI/CD): pipeline di CI/CD con Docker, automatizzando test e distribuzione, riducendo i tempi di rilascio da settimane a giorni
Esempi pratici di utilizzo
- Ambienti di sviluppo: creazione di ambienti coerenti e replicabili, eliminando il problema del "funziona sul mio computer" e aumentando la produttività
- Data Science: chi si occupa di analisi dati può usare i container inserendo modelli di machine learning, garantendo quindi coerenza nei risultati tra diversi ambienti
- Applicazioni web: è possibile avviare applicazioni come WordPress o Joomla in Docker, semplificando la gestione dei siti web
Esempi pratici di utilizzo
- Web service: servizi come Redis e MongoDB possono essere eseguiti in contenitori Docker per migliorare le prestazioni e la scalabilità
Il backup di questi container è molto semplice e occorre salvare la configurazione dei container con i rispettivi volumi.
Uno strumento molto utile è:
https://github.com/muesli/docker-backup
Riga di comando di Docker
- docker run: avvia un nuovo contenitore. Alcuni parametri comuni includono:
- -d: esegue il contenitore in background (modalità "detached")
- --rm: Rimuove automaticamente il contenitore quando viene arrestato
- -p: Mappa le porte del contenitore a quelle dell'host, ad esempio -p 8080:80 per esporre la porta 80 del contenitore sulla porta 8080 dell'host
Riga di comando di Docker
- docker volume: gestisce i volumi, che sono utilizzati per salvare i dati in modo persistente. I comandi utili includono:
- docker volume create: crea un nuovo volume
- docker volume ls: elenca tutti i volumi esistenti
- docker volume rm: rimuove un volume specifico
Riga di comando di Docker
- docker network: gestisce le reti per i contenitori. I comandi comuni includono:
- docker network create: crea una nuova rete
- docker network ls: elenca tutte le reti esistenti
- docker network rm: rimuove una rete specifica
Riga di comando di Docker
- docker ps: mostra i contenitori attivi. Aggiungendo -a, si possono vedere anche i contenitori non in esecuzione
- docker stop: arresta un contenitore in esecuzione. Può essere utilizzato con l'ID o il nome del contenitore
- docker rm: rimuove uno o più contenitori. Può essere utilizzato con -f per forzare la rimozione di contenitori in esecuzione
Avvio semplice
docker run\
-p 80:80\
-d\
--name speedtest\
--rm\
ghcr.io/librespeed/speedtest
Cosa fa? 🙄
Qualche configurazione aggiuntiva
docker run\
-e MODE=standalone\
-e TELEMETRY=true\
-e ENABLE_ID_OBFUSCATION=true\
-e PASSWORD="yourPasswordHere"\
-e WEBPORT=86\
-p 86:86\
-v $PWD/db-dir/:/database\
-it #Avvia in modo interattivo con log a video\
ghcr.io/librespeed/speedtest
Cosa fa? 🫠
Docker compose!
version: '3.7'
services:
speedtest:
container_name: speedtest
image: ghcr.io/librespeed/speedtest:latest
restart: always
environment:
MODE: standalone
#TITLE: "LibreSpeed"
#TELEMETRY: "false"
#ENABLE_ID_OBFUSCATION: "false"
#REDACT_IP_ADDRESSES: "false"
#PASSWORD:
#EMAIL:
#DISABLE_IPINFO: "false"
#IPINFO_APIKEY: "your api key"
#DISTANCE: "km"
#WEBPORT: 80
ports:
- "80:80" # webport mapping (host:container)
docker compose up -d
Tutto qui:
https://github.com/librespeed/speedtest/blob/master/doc_docker.md