Docker
# Docker

Docker è un popolare software libero progettato per eseguire processi informatici in ambienti isolabili, minimali e facilmente distribuibili chiamati container Linux (o anche soltanto container), con l'obiettivo di semplificare i processi di deployment di applicazioni software.

Fin dal suo rilascio nel 2013, Docker non si basa sui tradizionali metodi di virtualizzazione di un intero sistema operativo, bensì sulla OS-level virtualization fornita dal kernel Linux, ovvero un singolo sistema operativo basato su Linux si occupa di orchestrare l'isolamento e le limitazioni delle risorse.

I container Linux funzionano sulla maggior parte delle distribuzioni Linux ma anche in architetture differenti come macOS e Microsoft Windows.

Docker Inc. è anche il nome della società statunitense che cura il mantenimento del software e che nel 2022 ha annunciato i 318 miliardi di download sul suo sito web principale, Docker Hub.

## Storia

Docker è stato pubblicato nel 2013 dallo sviluppatore statunitense Solomon Hykes, come progetto interno di dotCloud, un'azienda platform as a service, grazie al lavoro di altri ingegneri della stessa azienda tra cui Andrea Luzzardi, Francois-Xavier Bourlet e Jeff Lindsay (come collaboratore esterno). Docker rappresenta l'evoluzione della tecnologia proprietaria di dotCloud, a sua volta realizzato grazie a precedenti software open source come Cloudlets.

Il codice sorgente di Docker è stato rilasciato come open source nel marzo 2013. Dopo cinque mesi, la società comunicava i 60 000 download al mese. Il 13 marzo 2014, con il rilascio della versione 0.9, Docker non utilizza più la tecnologia LXC come ambiente di esecuzione di predefinito ma una propria libreria chiamata libcontainer, scritta nel linguaggio di programmazione Go. Il 13 aprile 2015 il progetto aveva oltre 20 700 stelle su GitHub rendendolo il ventesimo progetto più seguito dello stesso sito, con più di 4 700 fork e quasi 900 contributori.

Una ricerca di maggio 2015 legata a Kubernetes ha evidenziato le maggiori organizzazioni legate ai contributi sul codice di Docker. In ordine dal maggior numero di contributi: Red Hat (il maggiore contributore, più del team di Docker), il team di Docker, IBM, Google Inc., Cisco Systems e Amadeus IT Group.

## Descrizione

Docker utilizza le funzionalità di isolamento delle risorse del kernel Linux come ad esempio cgroup e namespace per consentire a "container" indipendenti di coesistere sulla stessa istanza di Linux, evitando l'installazione e la manutenzione di una macchina virtuale.

I namespace del kernel Linux per lo più isolano ciò che l'applicazione può vedere dell'ambiente operativo, incluso l'albero dei processi, la rete, gli ID utente e i file system montati, mentre i cgroup forniscono l'isolamento delle risorse, inclusa la CPU, la memoria, i dispositivi di I/O a blocchi e la rete. A partire dalla versione 0.9, Docker include la libreria libcontainer per poter utilizzare direttamente le funzionalità di virtualizzazione del kernel Linux, in aggiunta alle interfacce di virtualizzazione astratte come libvirt, LXC e systemd-nspawn.

Queste caratteristiche permettono di pacchettizzare un'applicazione e le sue dipendenze in un container virtuale che può essere eseguito su qualsiasi server Linux.

## Funzionalità

Docker implementa API di alto livello per gestire container che eseguono processi in ambienti isolati. Poiché utilizza delle funzionalità del kernel Linux (principalmente cgroup e namespace), un container di Docker, a differenza di una macchina virtuale, non include un sistema operativo separato. Al contrario, utilizza le funzionalità del kernel e sfrutta l'isolamento delle risorse (CPU, memoria, I/O a blocchi, rete) e i namespace separati per isolare ciò che l'applicazione può vedere del sistema operativo. Docker accede alle funzionalità di virtualizzazione del kernel Linux o direttamente utilizzando la libreria libcontainer, che è disponibile da Docker 0.9, o indirettamente attraverso libvirt, LXC o systemd-nspawn.

Utilizzando i container le risorse possono essere isolate, i servizi limitati e i processi avviati in modo da avere una prospettiva completamente privata del sistema operativo, col loro proprio identificativo, file system e interfaccia di rete. Più container condividono lo stesso kernel, ma ciascuno di essi può essere costretto a utilizzare una certa quantità di risorse, come la CPU, la memoria e l'I/O.

L'utilizzo di Docker per creare e gestire i container può semplificare la creazione di sistemi distribuiti, permettendo a diverse applicazioni o processi di lavorare in modo autonomo sulla stessa macchina fisica o su diverse macchine virtuali. Ciò consente di effettuare il deployment di nuovi nodi solo quando necessario, permettendo uno stile di sviluppo del tipo platform as a service (PaaS) per sistemi come Apache Cassandra, MongoDB o Riak. Docker inoltre semplifica la creazione e la gestione di code di lavori in sistemi distribuiti.

### Integrazione

Docker può essere integrato in varie infrastrutture, tra cui Amazon Web Services, Ansible, Boinc, CFEngine, Chef, Google Cloud Platform, IBM Bluemix, Jelastic, Jenkins, Microsoft Azure, NoMachine, OpenStack Nova, OpenSVC, Puppet, Salt, e Vagrant.

### Orchestrazione

Per far interagire tra loro più container Docker, spesso si utilizzano dei software di orchestrazione, come ad esempio Docker Swarm o Kubernetes.

## Tecnologia

Docker è stato originariamente sviluppato per Linux, dove utilizza le funzionalità di isolamento delle risorse tipiche del Linux (kernel) come cgroup e kernel namespace oltre a un file system compatibile come OverlayFS e altri così da permettere a "container indipendenti" di funzionare utilizzando un'unica istanza Linux, evitando il sovraccarico relativo all'avvio e all'utilizzo della Macchina virtuale.

## Vantaggi e svantaggi

I vantaggi di Docker si misurano in relazione alle macchine virtuali. Infatti, i container sono più leggeri delle macchine virtuali, vengono avviati più velocemente e richiedono meno risorse. Anche le immagini risultano di dimensioni inferiori a quelle delle macchine virtuali. Tra gli svantaggi si annovera il fatto che i container non contengono un proprio sistema operativo e quindi i processi in esecuzione non possono essere isolati in maniera perfetta.

## Collaborazioni

* Il 23 luglio 2013 dotCloud Inc., l'entità commerciale dietro Docker, annunciò che l'ex CEO di Gluster and Plaxo Ben Golub si sarebbe unito all'azienda, citando Docker come l'obiettivo principale della società.
* Il 19 settembre 2013 Red Hat e Docker annunciarono un'importante collaborazione su Fedora, Red Hat Enterprise Linux e OpenShift.
* Il 22 gennaio 2014 Docker annunciò che aveva completato un venture capital di serie B da 15 milioni di dollari, guidato dalla Greylock Partners.
* Il 23 luglio 2014 Docker acquistò Orchard, i creatori di Fig.
* Il 16 settembre 2014 Docker annunciò che aveva completato un venture capital di serie C da 40 milioni di dollari, guidato dalla Sequoia Capital.
* Il 15 ottobre 2014 Microsoft ha annunciato l'integrazione di Docker nella successiva versione (2016) di Windows Server e il supporto nativo per il client Docker su Windows.
* Il 4 dicembre 2014 IBM ha annunciato una partnership strategica con Docker per permettere alle aziende di creare più efficacemente, velocemente e con costi contenuti la prossima generazione di applicazioni su IBM Cloud.
* Il 22 giugno 2015 è stato annunciato che Docker, CoreOS, IBM, Google, Microsoft, Amazon e altre aziende stanno lavorando su un nuovo standard per i container software indipendente dal sistema operativo.
