Docker
La mera esposizione teorica non è didatticamente sufficiente.
Vogliamo compiere degli esercizi che coprano i seguenti argomenti:
- connessione tra un client e un server sulla stessa rete
- analisi del traffico durante una connessione
- connessione tra un client e un server su una rete vicina - il problema del routing
- regole di firewall perimetrale e personale
- enumerazione di servizi su un server
e tanto altro ancora.
Per questi esercizi ci occorrono clients, servers, reti.
Avere hardware fisico che copre le varie configurazioni è in pratica impossibile. Configurare gli host di rete con macchine virtuali è molto pesante di risorse per la macchina ospite.
La soluzione è di usare contenitori anzichè macchine virtuali, con la tecnologia Docker.
I contenitori sono molto più leggeri quanto a richiesta di risorse di CPU e memoria. Si può velocemente compiere il deployment di numerosi nodi di una o più reti collegando tra loro componenti Docker come fossero mattoncini da costruzione.
Il risultato emula sufficientemente la realtà per i nostri scopi didattici.
Evoluzione e componenti
Docker è un ambiente di isolamento delle risorse necessarie ad un applicativo all'interno di un contenitore
- Da circa 2013, ideato da Solomon Hykes
- Contributo di Red Hat
- Richiede Linux a 64 bit Kernel 2.6+
- Versione corrente: 20.10 (12/20)
- Licenza Apache (open)
- Scritto in linguaggio Go
- Virtualizzazione entro il sistema operativo
- Direzione: software indipendente dal sistema operativo
Macchine Virtuali e Contenitori
Macchine Virtuali: Virtualizzazione dell'Hardware
- Più sistemi operativi diversi
- Più flessibile
- Più maturo
Contenitori: Virtualizzazione dell'Ambiente Operativo
- Più efficienza
- Meno manutenzione di sistema
- Partenza molto più veloce
- Migliaia di immagini disponibili, con documentazione
NB: Il Kernel è quello dello host Linux
Tipi di Contenitori
- Process container - l’ambiente di esecuzione di un processo principale e possibilmente altri processi
- Network container - fornisce connettività, indirizzamento e risoluzione nomi ai contenitori di processo
- Data container - mantiene i dati in volumi e li persiste quando i contenitori di processo non sono attivi
Tutte le immagini da cui derivano i contenitori sono mantenuti in un repository sul computer locale
Proprietà di Docker
Docker è scritto nel linguaggio di programmazione Go
Molti dei suoi comportamenti sono dovuti al linguaggio Go
E’ distribuito da docker.com (o docker.io)
Ne esistono due versioni:
- enterprise - a sottoscrizione di licenza
- community - gratuito ed Open Source
Docker si basa su features architettoniche di Linux:
- cgroups - supporto kernel all’isolamento processi
- Union File System - FS composto da layers
La docker.com supporta il prodotto solo su Linux
Il Linux di riferimento è Ubuntu
E’ in fase di sviluppo un Linux di riferimento specifico per Docker indipendente dalle distribuzioni correnti
Immagini
Un contenitore è l'istanza run-time di un'immagine.
Un'immagine è la combinazione di un certo numero, variabile a seconda della specifica immagine, di strati software (Layers), integrati all'interno di uno Union File System.
Cgroups
Un cgroup (control group) è una feature che limita, traccia ed isola l’uso di risorse di una collezione di processi.
I Cgroups sono una parte integrale del kernel Linux
Forniscono l’implementazione nel system space dei contenitori dello user space
Componenti di Docker
- Dockerfile: specifica dei componenti necessari. File testuale di specifiche
- Image: risultato della compilazione del docker file. Serie di layers in un repository locale o remoto
- Container: istanza di realizzazione di una image
Più containers della stessa image sono istanze separate e indipendenti
Client-Server
Docker segue l'architettura Client-Server. Vi sono un eseguinile client e due server.
docker - client, Command Line Interface. Interfaccia con l’utente tramite comandi shell
dockerd - high-level server, interagisce con il client. Implementa il comportamento di Docker
containerd - low-level server, gestisce i container. Usato anche con contenitori non Docker, p.es. Kubernetes
Il server è gestito come servizio standard di Linux e si può controllare con il comando amministrativo:
sudo systemctl azione docker
ove azione può essere:
- status - stato del servizio e processi attivi
- start - far partire il servizio
- stop - fermare il servizio
- enable - configurare lo start automatico al boot
- disable - disabilitare lo start automatico al boot
Due componenti del server:
- docker.service - il servizio
- docker.socket - il socket Unix di collegamento
Il collegamento tra client e server avviene tramite un socket. In locale (default) questo è un socket Unix.