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

Installiamo LibreSpeed

https://github.com/librespeed/speedtest/

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

Portainer

https://docs.portainer.io/start/install-ce

Immagini docker interessanti


https://github.com/awesome-selfhosted/awesome-selfhosted#awesome-selfhosted

https://selfh.st/apps

https://hub.docker.com

este.linux.it

Repository e Progetti su GIT:
codeberg.org/este-linux

Gruppo Telegram (discussione):
ILS Este - Gruppo


Canale Telegram (solo notizie):
ILS Este - Notizie


Matrix:
ILS Este - Gruppo (server: matrix.org)