Un container è come una piccola scatola dove l’applicazione vive da sola con tutto ciò che serve: se sposto la scatola da un computer all’altro funziona sempre.
Docker è una tecnologia che permette di impacchettare un’applicazione insieme a tutto ciò che le serve per funzionare: librerie, configurazioni, dipendenze. Questa scatola si chiama container.
Con Docker puoi fare tre cose fondamentali in modo semplice:- costruire l’applicazione
- distribuirla ovunque serva
- farla girare senza problemi su qualsiasi macchina
In pratica, Docker ti accompagna dall’idea al codice in esecuzione rendendo tutto più rapido, sicuro e ripetibile.
Prima di Docker installare un’applicazione spesso significava configurare il server, installare dipendenze e risolvere conflitti di versione: un processo lento e soggetto a errori. Docker semplifica tutto fornendo ambienti isolati, portabili e ripetibili:- ambienti identici tra sviluppo, test e produzione
- avvio rapido dei servizi
- facile distribuzione e scalabilità
Docker semplifica tutto, creando ambienti isolati, portabili e identici, funziona ovunque, si avvia in pochi secondi e ideale per microservizi. Uno dei problemi più fastidiosi nello sviluppo di applicazioni complesse è far sì che ogni componente giri nello stesso ambiente, senza sorprese tra computer diversi o tra locale e produzione. Docker risolve esattamente questo: ti permette di creare ambienti identici, pronti da usare, così che ogni microservizio o parte dell’applicazione funzioni sempre nello stesso modo, ovunque tu lo faccia partire.
Niente più “sulla mia macchina funziona”, tutto è prevedibile e replicabile.
Risorse principali di Docker- Immagini: pacchetti con tutto il necessario per eseguire l'applicazione
- Container: istanza in esecuzione di un'immagine
- Volumi: storage persistente per i dati
- Reti: comunicazione tra i container
- Dockerfile: file per creare un'immagine personalizzata
- Registri: dove le immagini vengono conservate
- Docker Compose: strumento per gestire più container come un'applicazione
Le immagini sono come dei pacchetti che contengono tutto ciò che serve per far funzionare un’applicazione: file, librerie, configurazioni e dipendenze. Da un’immagine nasce un container che è l’istanza realmente in esecuzione. Se l’immagine è il modello, il container è l’applicazione che sta girando.
Per salvare i dati in modo persistente cioè senza perderli ogni volta che un container viene eliminato si usano i volumi: sono delle aree di storage che Docker mantiene al di fuori del ciclo di vita del container. I container possono parlare tra loro grazie alle reti, che gestiscono la comunicazione interna e permettono di collegare più servizi in modo pulito e isolato dal resto del sistema.
Per creare immagini personalizzate si utilizza un Dockerfile: un semplice file di testo in cui si descrive passo dopo passo come deve essere costruita l’immagine. Una volta creata, l’immagine può essere conservata in un registro: che è un archivio online pubblico o privato dove vengono memorizzate e versionate.
Quando si vuole far lavorare insieme più container come un’unica applicazione ad esempio un servizio web con database, cache e frontend entra in gioco Docker Compose, uno strumento che permette di definire tutto in un file YAML e avviare l’intero ambiente con un solo comando.
Installazione di Docker Engine su Debian
Il Docker Engine è un progetto open source e può essere scaricato dal sito ufficiale di Docker.
Un container è un ambiente isolato dove eseguire un servizio o un'applicazione in autonomia. Non prevedono l'hypervisor come le VM ma l'esecuzione all'interno del kernel della macchina host attraverso il Docker Engine possiamo gestire ed eseguire i container.
Quando si parla di Docker spesso si pensa subito ai container, alle immagini o ai comandi che si lanciano dal terminale. Ma tutto ciò funziona grazie a un componente centrale: Docker Engine. È il motore vero e proprio che fa partire, spegne, crea e gestisce i container.
Docker Engine funziona come un servizio attivo sul sistema chiamato dockerd. Questo servizio rimane in ascolto e gestisce ogni richiesta: quando crei un container quando scarichi un’immagine, quando colleghi una rete o monti un volume. Tutto passa da lui. A sua volta, dockerd si appoggia a componenti più interni come containerd e runc che sono responsabili dell’esecuzione fisica dei container tramite le funzioni del kernel Linux come cgroups e namespaces.
La caratteristica più importante di Docker Engine è che funziona nativamente su Linux senza richiedere macchine virtuali o componenti aggiuntivi. Questo lo rende leggero, veloce e ideale per i server e gli ambienti di produzione. Usare Docker Engine significa lavorare tramite terminale.
Il Docker Engine è composto da componenti che insieme permettono di creare, eseguire e gestire i container:- Docker client: l'interfaccia a riga di comando (docker) che invia comandi al daemon
- Docker daemon (dockerd): servizio che gestisce immagini, container, reti e volumi
- Immagini: template immutabili che contengono tutto il necessario per avviare un container
- Container: istanze in esecuzione create a partire da un'immagine
- Docker file: è un file e la sua scrittura ci permette di creare la nostra immagine
- Registry: servizio che ospita immagini (es. Docker Hub, GHCR, registri privati)
Le immagini Docker possono essere salvate e condivise tramite diversi tipi di registry. Il più conosciuto è Docker Hub, la piattaforma ufficiale dove trovi migliaia di immagini già pronte. In alternativa c’è GHCR, il GitHub Container Registry, molto usato quando si lavora con repository GitHub e pipeline automatizzate. Infine esistono anche registri privati ideali per le aziende che vogliono mantenere le proprie immagini in ambienti chiusi e controllati senza esporle pubblicamente.
1. Aggiornamento del sistema
frank@debian:~$ su -
root@debian:~# apt update && apt upgrade
2. Installazione sudo
root@debian:~# apt install sudo
3. Assegnare l’utente al gruppo sudo
root@debian:~# usermod -aG sudo frank
root@debian:~# exit
Attiva subito il gruppo sudo nella shell corrente (senza logout)
frank@debian:~$ newgrp sudo
frank@debian:~$ groups
sudo cdrom floppy audio dip video plugdev users netdev frank
4. Disinstalla dal sistema tutti i pacchetti Docker se sono presenti
frank@debian:~$ sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc podman-docker containerd runc | cut -f1)
5. Aggiungere la chiave GPG ufficiale di Docker
frank@debian:~$ sudo apt install ca-certificates curl
frank@debian:~$ sudo install -m 0755 -d /etc/apt/keyrings
frank@debian:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
frank@debian:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc
6. Aggiungere il repository Docker alle sorgenti APT
frank@debian:~$ sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
frank@debian:~$ sudo apt update
7. Installazione Docker Engine
frank@debian:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
8. Stato del servizio Docker
frank@debian:~$ systemctl status docker.service
9. Usare Docker senza sudo
frank@debian:~$ sudo usermod -aG docker $USER
frank@debian:~$ docker -v
frank@debian:~$ newgrp docker
frank@debian:~$ groups
10. Verifica dell’installazione
frank@debian:~$ docker run --rm hello-world
Installazione di Docker Engine in modalità Rootless su Debian
Documentazione ufficiale Docker Rootless
Docker Engine può essere eseguito anche in modalità Rootless cioè senza privilegi di root. In questa configurazione il daemon Docker e i container vengono eseguiti come utente normale riducendo l’impatto di eventuali problemi di sicurezza.
Consiglio pratico: per iniziare a studiare Docker e i container la modalità standard è più semplice e diretta. La modalità Rootless è un’ottima opzione da approfondire in un secondo momento quando il focus diventa la sicurezza e richiede una configurazione aggiuntiva.
Docker Rootless può essere installato direttamente senza prima installare Docker in modalità rootful. In questo modo il demone Docker viene eseguito come utente normale aumentando la sicurezza del sistema.
Installare i pacchetti necessari:
frank@debian:~$ su -
root@debian:~# apt update && apt upgrade
root@debian:~# apt install -y sudo
root@debian:~# usermod -aG sudo frank
root@debian:~# exit
Chiudere la sessione e rientrare:
frank@debian:~$ exit
Attiva subito il gruppo sudo nella shell corrente (senza logout)
frank@debian:~$ newgrp sudo
frank@debian:~$ sudo apt update && sudo apt install -y uidmap dbus-user-session slirp4netns curl iptables
frank@debian:~$ sudo modprobe nf_tables
Riporta il gruppo attivo a frank
frank@debian:~$ newgrp frank
frank@debian:~$ curl -fsSL https://get.docker.com/rootless | sh
Aggiunge Docker al PATH
frank@debian:~$ echo 'export PATH=$HOME/bin:$HOME/.local/bin:$PATH' >> ~/.bashrc
Applica subito il PATH
frank@debian:~$ source ~/.bashrc
frank@debian:~$ systemctl --user enable --now docker
frank@debian:~$ systemctl --user status docker
frank@debian:~$ docker context use rootless
frank@debian:~$ sudo loginctl enable-linger frank
frank@debian:~$ docker info | grep -E 'rootless|Docker Root Dir|Server Version'
frank@debian:~$ docker run --rm hello-world
Docker Desktop
Docker Desktop è uno strumento pensato per rendere la vita più semplice a chi crea applicazioni in locale. E' un’applicazione pensata soprattutto per gli sviluppatori. Un ambiente completo che rende il lavoro con i container molto più semplice e organizzato.
A differenza di Docker Engine che è un motore essenziale e senza parte grafica, Docker Desktop offre una vera e propria interfaccia visiva che permette di vedere container, immagini, volumi e reti in modo immediato quasi come fossero applicazioni tradizionali.
L’idea alla base di Docker Desktop è quella di semplificare il lavoro quotidiano. Invece di dover controllare tutto tramite comandi, lo sviluppatore può aprire la dashboard e osservare in tempo reale cosa sta succedendo: quali container sono accesi, quali immagini occupano spazio, quali porte sono esposte e perfino quanto consuma ogni servizio. Per chi sviluppa applicazioni, soprattutto in locale, questa visione d’insieme è spesso molto comoda.
Docker Desktop include già Docker Engine, Docker Compose, strumenti di sviluppo aggiuntivi e persino un sistema di estensioni che consente di aggiungere funzioni extra come monitoraggio, analisi di sicurezza, gestione visuale dei volumi e molte altre utilità che aiutano durante la programmazione. Non è pensato per la produzione, ma per fornire uno spazio di lavoro omogeneo e pronto all’uso.
Docker Desktop non sostituisce Docker Engine: lo integra e lo rende più facile da usare per chi sviluppa. Se lavori con i container in modo quotidiano e vuoi evitare di ricordare decine di comandi, o semplicemente preferisci avere una gestione più visiva del tuo ambiente, Docker Desktop può essere un grande aiuto. Se invece gestisci server, cluster o ambienti di produzione, allora Docker Engine rimane la scelta giusta.
Su Arch Linux l’installazione di Docker Engine è molto semplice perché il pacchetto è già disponibile nei repository ufficiali. Basta eseguire il seguente comando e il motore dei container viene installato immediatamente:
# pacman -S docker
Docker Desktop invece non si trova nei repository quindi va scaricato direttamente dal sito ufficiale. Dalla pagina delle release è possibile recuperare il link all’ultima versione e scaricare il pacchetto per MS Windows, Mac e Linux. In Arch Linux / Manjaro Linux fare il dowload e installarlo manualmente:
$ wget https://desktop.docker.com/linux/main/amd64/173168/docker-desktop-x86_64.pkg.tar.zst
# pacman -U ./docker-desktop-x86_64.pkg.tar.zst
Docker Desktop una volta installato può chiedere la configurazione del sistema di gestione delle credenziali: su Linux infatti le credenziali non vengono salvate automaticamente e Docker richiede un password store configurato.
Per risolvere il problema di Sig In (Sign in to Docker Desktop) basta generare una nuova chiave GPG, inizializzare il gestore delle password con pass init e Docker potrà finalmente memorizzare le credenziali in modo sicuro. Dopo aver completato la configurazione si può utilizzare Docker normalmente.
$ gpg --generate-key
Inserisci nome, cognome, indirizzo email e confermare con ok.
Quindi GPG crea una coppia di chiavi.
Cerca la riga pub che contiene il tuo ID GPG.
pubrsa3072 2022-03-31 [SC] [expires: 2024-03-30]
3ABCD1234EF56G78
uid Molly <Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. >
Copia l'ID GPG per usarlo per inizializzare il passaggio.
$ pass init 3ABCD1234EF56G78
mkdir: created directory '/home/molly/.password-store/'
Password store initialized for <generated_gpg-id_public_key>
$ docker pull frank/privateimage


