Docker è una piattaforma open source che consente agli sviluppatori di creare, implementare, eseguire, aggiornare e gestire container - componenti eseguibili standardizzati che combinano il codice sorgente delle applicazioni con le librerie e le dipendenze del sistema operativo necessarie per eseguire tale codice in qualsiasi ambiente.
I container semplificano lo sviluppo e la fornitura di applicazioni distribuite. Sono diventati sempre più popolari man mano che le organizzazioni passano allo sviluppo nativo dei cloud e agli ambienti multicloud ibridi. Gli sviluppatori possono creare container senza Docker, lavorando direttamente con funzionalità integrate in Linux e altri sistemi operativi. Docker, però, rende la containerizzazione più veloce, facile e sicura. Al momento della stesura del presente documento, Docker segnala che più di 13 milioni di sviluppatori stavano utilizzando la piattaforma (link esterno a ibm.com).
Docker si riferisce anche a Docker, Inc. (link esterno a ibm.com), l'azienda che vende la versione commerciale di Docker, e al progetto open source Docker a cui contribuiscono Docker, Inc. e molte altre organizzazioni e persone.
I container sono resi possibili dalle funzionalità di virtualizzazione e isolamento dei processi integrate nel kernel Linux. Queste funzionalità - come i gruppi di controllo (Cgroup) per l'allocazione delle risorse tra i processi, e i namespace per limitare l'accesso o la visibilità di un processo in altre risorse o aree del sistema - consentono a più componenti applicativi di condividere le risorse di una singola istanza del sistema operativo host nello stesso modo in cui un hypervisor consente a più VM di condividere CPU, memoria e altre risorse di un singolo server hardware.
Di conseguenza, la tecnologia dei container offre tutte le funzionalità e i vantaggi delle VM - inclusi l'isolamento delle applicazioni, la scalabilità efficiente in termini di costi e l'eliminabilità - più degli importanti vantaggi aggiuntivi:
Peso minore: a differenza delle VM, i container non comportano il payload di un'intera istanza del sistema operativo e di un intero hypervisor. Includono solo i processi e le dipendenze del sistema operativo necessari per eseguire il codice. Le dimensioni dei container sono misurate in megabyte (rispetto ai gigabyte per alcune VM), utilizzano meglio la capacità hardware e hanno dei tempi di avvio più rapidi.
Maggiore produttività degli sviluppatori: le applicazioni containerizzate possono essere scritte una sola volta ed essere eseguite ovunque. Rispetto alle VM, poi, è possibile implementare, eseguire il provisioning e riavviare i container in modo più veloce e facile. Questo li rende ideali per l'utilizzo nelle pipeline CI/CD (continuous integration e continuous delivery) e più adatti per i team di sviluppo che adottano prassi Agile e DevOps.
Maggiore efficienza delle risorse: con i container, puoi eseguire diverse volte tante copie di un'applicazione sullo stesso hardware quante ne possono eseguire utilizzando le VM. Questo può ridurre la spesa in cloud.
Le aziende che utilizzano i container segnalano altri vantaggi, tra cui una maggiore qualità delle applicazioni, una risposta più rapida ai cambiamenti del mercato e tanto altro ancora. Scopri di più con questo strumento interattivo:
Docker è così diffuso oggi che i termini "Docker " e "container" sono usati in modo intercambiabile. Ma le prime tecnologie relative ai container erano disponibili da anni - anche decenni (link esterno a IBM) - prima che Docker venisse rilasciato al pubblico nel 2013.
In particolare, nel 2008, nel kernel Linux fu implementato LXC (LinuXContainers), abilitando completamente la virtualizzazione per una singola istanza di Linux. Sebbene LXC sia oggi ancora utilizzato, sono disponibili delle tecnologie più nuove che utilizzano il kernel Linux. Anche Ubuntu, un sistema operativo Linux moderno e open-source, fornisce questa funzionalità.
Docker consente agli sviluppatori di accedere a queste funzionalità di containerizzazione native utilizzando semplici comandi e automatizzarle tramite API (application programming interface) che consentono di risparmiare lavoro. Rispetto a LXC, Docker offre:
Un peso ancora più leggero e aggiornamenti più granulari: con LXC, più processi possono essere combinati in un singolo container. Questo consente di creare un'applicazione che può continuare la sua esecuzione mentre una delle sue parti viene resa inattiva per un aggiornamento o una riparazione.
Una creazione dei container automatizzata: Docker può creare automaticamente un container in base al codice sorgente delle applicazioni.
Il controllo delle versioni dei container: Docker può tracciare le versioni di un'immagine container, eseguire il rollback a versioni precedenti e tracciare chi ha creato una versione e come. Può anche caricare solo i delta tra una versione esistente e una nuova.
Il riutilizzo dei container: i container esistenti possono essere utilizzati come immagini di base - essenzialmente come template per la creazione di nuovi container.
Oggi la containerizzazione Docker funziona anche con Microsoft Windows e Apple MacOS. Gli sviluppatori possono eseguire i container Docker su qualsiasi sistema operativo e la maggior parte dei provider di servizi cloud, compresi AWS (Amazon Web Services), Microsoft Azure e IBM Cloud, offre servizi specifici per aiutare gli sviluppatori a creare, implementare ed eseguire applicazioni containerizzate con Docker.
Alcuni degli strumenti, dei termini e delle tecnologie che gli sviluppatori riscontrano quando usano Docker includono:
Ogni container Docker inizia con un semplice file di testo contenente le istruzioni relative a come creare l'immagine container Docker. DockerFile automatizza il processo di creazione di immagini Docker. È essenzialmente un elenco di istruzioni CLI (command-line interface) che verrà eseguito dal motore Docker per assemblare l'immagine. L'elenco di comandi Docker è ampio ma standardizzato: le opzioni Docker funzionano lo stesso, indipendentemente dal contenuto, dall'infrastruttura o da altre variabili di ambiente.
Le immagini Docker contengono il codice sorgente delle applicazioni eseguibile nonché tutti gli strumenti, le librerie e le dipendenze che il codice dell'applicazione deve eseguire come un container. Quando la esegui, l'immagine Docker diventa un'istanza (o più istanze) del container.
È possibile creare un'immagine Docker da zero, ma la maggior parte degli sviluppatori le estrae da repository comuni. Da una singola immagine di base è possibile creare più immagini Docker che condivideranno gli elementi comuni del loro stack.
Le immagini Docker sono formate da livelli e ogni livello corrisponde a una versione dell'immagine. Ogni qualvolta uno sviluppatore apporta modifiche all'immagine, viene creato un nuovo livello superiore che sostituisce quello precedente come versione corrente dell'immagine. I livelli precedenti vengono salvati per il rollback o per essere riutilizzati in altri progetti.
Ogni volta che viene creato un container da un'immagine Docker, viene creato un ulteriore nuovo livello denominato livello container. Le modifiche apportate al container, come l'aggiunta o l'eliminazione di file, vengono salvate solo nel livello container ed esistono solo mentre il container è in esecuzione. Questo processo di creazione di immagini iterativo consente una maggiore efficienza complessiva in quanto da una sola singola immagine di base possono essere eseguite più istanze container dal vivo che, quando ciò avviene, sfruttano uno stack comune.
I container Docker sono le istanze dal vivo in esecuzione di immagini Docker. Mentre le immagini Docker sono file di sola lettura, i container sono del contenuto eseguibile dal vivo e temporaneo. Gli utenti possono interagirvi e gli amministratori possono regolarne le impostazioni e le condizioni utilizzando i comandi Docker.
Docker Hub (link esterno a ibm.com) è il repository pubblico di immagini Docker che si autodefinisce la "più grande libreria e community del mondo per immagini di container". Contiene oltre 100.000 immagini di container provenienti da fornitori di software commerciali, progetti open-source e singoli sviluppatori. Include immagini che sono state prodotte da Docker, Inc., immagini certificate appartenenti al Docker Trusted Registry e molte migliaia di altre immagini.
Tutti gli utenti di Docker Hub possono condividere a piacimento le loro immagini. Possono anche scaricare immagini di base predefinite dal filesystem di Docker da utilizzare come punto di partenza per qualsiasi progetto di containerizzazione.
Esistono anche altri repository di immagini, in particolare GitHub. GitHub è un servizio di hosting di repository, ben noto per gli strumenti di sviluppo di applicazioni e come una piattaforma che promuove la collaborazione e le comunicazioni. Gli utenti di Docker Hub possono creare un repository (repo) che può contenere molte immagini. Il repository può essere pubblico o privato e può essere collegato ad account GitHub o BitBucket.
Docker Desktop (link esterno a ibm.com) è un'applicazione per Mac o Windows che include Docker Engine, client CLI Docker, Docker Compose, Kubernetes e altro ancora. Include anche l'accesso a Docker Hub.
Il daemon Docker è un servizio che crea e gestisce le immagini Docker, utilizzando i comandi dal client. Sostanzialmente, il daemon Docker funge da centro di controllo della tua implementazione di Docker. Il server su cui viene eseguito il daemon Docker viene chiamato host Docker.
Un registro Docker è un sistema di storage e distribuzione open-source scalabile per le immagini Docker. Il registro ti consente di tracciare le versioni delle immagini nei repository, utilizzando l'assegnazione di tag per l'identificazione. Tale operazione viene eseguita utilizzando git, uno strumento di controllo delle versioni.
Se stai eseguendo solo pochi container, è abbastanza semplice gestire un'applicazione nel Docker Engine, il runtime di fatto del settore. Però, per le implementazioni che comprendono migliaia di container e centinaia di servizi, è quasi impossibile gestire il flusso di lavoro senza l'aiuto di qualche strumento appositamente creato.
I plugin Docker (link esterno a ibm.com) possono essere utilizzati per rendere Docker ancora più funzionale.Diversi plugin Docker sono inclusi nel sistema di plugin Docker Engine ed è anche possibile caricare plugin di terze parti.
Gli sviluppatori possono utilizzare Docker Compose per gestire applicazioni multi-container, dove tutti i container vengono eseguiti sullo stesso host Docker. Docker Compose crea un file YAML (.YML) che specifica quali servizi sono inclusi nell'applicazione e può implementare ed eseguire i container con un singolo comando. Poiché la sintassi YAML è indipendente dal linguaggio, i file YAML possono essere utilizzati in programmi scritti in Java, Python, Ruby e molti altri linguaggi.
Gli sviluppatori possono anche utilizzare Docker Compose per definire volumi persistenti per lo storage, specificare dei nodi di base e documentare e configurare dipendenze di servizi.
Il monitoraggio e la gestione dei cicli di vita dei container in ambienti più complessi richiede uno strumento di orchestrazione dei container . Sebbene Docker includa un suo strumento di orchestrazione (denominato Docker Swarm), la maggior parte degli sviluppatori sceglie invece Kubernetes.
Kubernetes è una piattaforma di orchestrazione dei container open source derivata da un progetto sviluppato per uso interno presso Google. Kubernetes pianifica e automatizza le attività che sono parte integrante della gestione delle architetture basate sui container compresi, tra l'altro, l'implementazione dei container, gli aggiornamenti, il rilevamento di servizi, il provisioning di storage, il bilanciamento del carico e il monitoraggio dello stato di integrità. Inoltre, l'ecosistema open source di strumenti per Kubernetes - che include Istio e Knative - consente alle organizzazioni di implementare una PaaS (Platform-as-a-Service) ad elevata produttività per le applicazioni containerizzate e un accesso più rapido al serverless computing.
Red Hat OpenShift on IBM® Cloud utilizza OpenShift in ambienti pubblici e ibridi per una maggiore velocità, reattività al mercato, scalabilità e affidabilità.
Con IBM® Cloud Satellite, puoi avviare servizi cloud coerenti ovunque - in ambienti on-premise, sull'edge e in ambienti di cloud pubblico.
Archivia i dati nelle ubicazioni più adeguate per i tuoi servizi e applicazioni con le soluzioni di storage su cloud ibrido IBM, in ambienti on-premise, di cloud privato e pubblico.
Vedi in che modo un approccio di servizi gestiti in cloud aiuta a mitigare la potenziale tensione tra la cultura di gestione IT tradizionale e quella DevOps.