Scopri tutti gli articoli e le iniziative nelle varie sezioni del portale

Più consultati


Tags

Docker: la containerization platform per sviluppare in modo veloce e innovativo

10/11/2016


Introduzione

Docker [1] è una piattaforma open source per sviluppatori amministratori di sistema che permette di automatizzare il deployment di applicazioni sfruttando la virtualizzazione tramite container. È quindi possibile pacchettizzare un’applicazione e le sue dipendenze in uno o più container che possono essere eseguiti su qualsiasi macchina Linux.

Docker nasce come progetto interno all’azienda dotCloud a cura di Solomon Hykes. La prima release stabile risale al 13 marzo 2013. Con le successive release, grazie al contributo della comunità̀ di sviluppatori e soprattutto alla collaborazione di alcune importanti aziende IT (tra cui RedhatGoogleIBM Amazon), il progetto ha subìto una crescita molto rapida e si è diffuso fino a divenire uno dei principali strumenti di virtualizzazione in ambienti cloud, come ad esempio Amazon Web Service.

Fondamenti     

Docker utilizza LXC [2] e libcontainer; è quindi una piattaforma nativa per sistemi operativi Linux. Per altri sistemi operativi, come Mac OS Xo Windows, è disponibile il tool boot2docker che virtualizza (paravirtualizzazione utilizzando VirtualBox) l’intero sistema Docker nella macchina host (dalla versione 1.8 le funzionalità̀ di boot2docker sono state incorporate in DockerMachine). Al settembre 2016 Docker e Microsoft hanno annunciato una partnership per il supporto nativo di Docker da parte dei sistemi operativi della casa di Redmond [3]



Docker sfrutta le risorse del kernel Linux (cgroups,namespaces, etc…), per isolare i container e consentire agli stessi di coesistere all’interno dello stesso sistema operativo.


Confronto tra virtualizzazione tramite container e hosted virtualization

Le motivazioni per cui la virtualizzazione tramite container risulta più efficiente rispetto alla tecnica di hosted virtualization possono essere sintetizzate considerando che l’ambiente di virtualizzazione tramite container utilizza direttamente le risorse offerte dal kernel Linux mentre un tipico software di hosted virtualization necessita di un hypervisor che virtualizzi completamente l’hardware del sistema su cui viene istanziata la macchina virtuale [4]



Quindi la virtualizzazione tramite container risulta più efficiente rispetto ad hosted virtualization perché esiste una minore distanza tra le risorse e il sistema che le utilizza; inoltre la virtualizzazione tramite container consuma meno risorse in termini di memoria per fare lo stesso lavoro di una macchina virtuale.

Per esempio assumiamo di avere un’immagine di dimensione 2GB:

  • hosted virtualization: se istanziamo n macchine virtuali a partire dall’immagine da 2GB otteniamo un consumo di memoria globale pari ad n x 2GB;                                    
  • virtualizzazione tramite container: se istanziamo n container a partire dall’immagine da 2GB otteniamo un consumo di memoria globale pari a poco più di 2GB; ciò è possibile grazie ad una gestione condivisa delle memorie delle immagini mediante la tecnica del copy on write.

L’esempio precedente chiarisce il motivo per cui Docker rappresenta ad oggi una delle tecnologie maggiormente utilizzate in ambito cloud. La sua gestione delle immagini e delle istanze di container permette di scalare molto velocemente ed efficacemente.

Docker offre piena portabilità̀ qualora il sistema che lo ospita utilizzi il kernel Linux; è interessante notare come un qualsiasi applicativo incapsulato in un container possa essere riprodotto esattamente nello stesso modo in qualsiasi ambiente che supporti Docker.

Componenti

Docker è composto da due macro-componenti:

  1. Docker Engine [5]: architettura Client-Serverche consente di creare ed eseguire container in cui il client istruisce il server indicandogli quali comandi eseguire. Eseguendo un’infrastruttura composta da più container su un singolo server fisico la comunicazione tra i container risulterà più efficiente perché́ non soggetta a problemi legati al traffico di rete, tuttavia esiste anche la possibilità di distribuire le istanze dei vari container su macchine fisiche diverse per gestire imponenti moli di lavoro.
  2. Docker Hub [6]: SaaS per la condivisione di immagini Docker.

Conclusioni

I container semplificano in modo significativo la portabilità delle Virtual Machine e d iinteri ambienti tra i vari cloud. Il supporto per i deployment dei container su svariati fornitori di servizi cloud sarà una funzionalità presente in numerosi container scheduler. Effettuare il deployment su svariati fornitori di servizi avrà come conseguenza la diminuzione del lock-in nei confronti di un singolo fornitore, la quale potrà essere utilizzata come strategia per il recupero da disastri. Infine, la portabilità tra diversi fornitori avrà un impatto sui prezzi, poiché in futuro i costi potrebbero diventare uno dei parametri di input per lo scheduler quando dovrà decidere dove allocare il carico di un determinato lavoro.

Principali feature

  • Isolamento del file system: il processo di ciascun container opera all’interno di un rootfile system separato
  • Isolamento delle risorse: le risorse di sistema (CPU, memoria, ...) possono essere allocate in maniera differente sul processo di ciascun container, utilizzando cgroups
  • Isolamento della rete: il processo di ciascun container opera all’interno di una rete virtuale non connessa con l’host, se non esplicitamente esponendo porte specifiche
  • Copy-on-write:i root file system sono creati mediante strategie copy-on-write,per garantire snapshot consistenti e tracciabili
  • Logging: gli stream standard (stdout/stderr/stdin) del processo di ciascun container sono memorizzati per la consultazione real time o batch
  • Change management: è possibile effettuare il commit dei cambiamenti al file system di un container in una nuova immagine,riutilizzabile per la creazione di un nuovo container

Pro

  • Prestazioni: l’assenza di un hypervisor per la gestione delle macchine virtuali e la velocità con la quale, tramite le API, i containers possono essere lanciati o spenti quando non più necessari riduce il consumo di risorse rispetto ad altre tecniche di virtualizzazione
  • Docker Hub: il servizio SaaS per la condivisione di stack applicativi presenta numerosi repository ufficiali, per la maggior parte delle componenti applicative più diffuse(Ubuntu, PostgreSQL, Nginx, MySql, ecc..)
  • Ambiente open e grande supporto della community.

Contro

  • Curva di apprendimento ostica per utenti che non hanno familiarità con Linux
  • Interfaccia a linea di comando eccessivamente “verbosa”

Quando usarlo

Docker è particolarmente indicato per la ContinuousDelivery: la distribuzione del software via container tra i vari ambienti di sviluppo, test e produzione può essere rapidamente automatizzata,senza particolari preoccupazioni per le inevitabili differenze in termini di configurazioni, dipendenze e sistemi operativi. Possiamo sicuramente affermare che la tecnologia dei container diffondendosi nell’ambito delle infrastrutture vede le architetture applicative muoversi verso un modello basato su microservizi distribuiti in cui le metodologie DevOps e di ContinuousDelivery la fanno da padroni all’interno dei vari settori IT aziendali.

La cosa interessante di questo fenomeno è come queste tre ondate d’innovazione si stiano alimentando a vicenda, amplificando il loro effetto finale sull’IT, ossia la capacità di fornire più velocemente un maggiore valore al business, all’utente e al consumatore.

Accanto a Docker,sul percorso verso il DevOps, gioca un ruolo fondamentale la tecnologia Jenkins, fondata su pratiche di Continuous Integration e Continuous Delivery dello sviluppo software; ma di Jenkins ne parleremo nel prossimo articolo.

Nel percorso verso l’innovazione e verso le architetture basate sui microservices (MA), svolgono un ruolo cruciale due tool ormai noti in ambito IT: Docker Jenkins.

In soli due anni Docker è cresciuto in maniera esponenziale: oggigiorno viene utilizzato da oltre 3milioni di sviluppatori e già 140.000 applicazioni sono state “dockerizzate”. La tecnologia dei container sta trasformando il nostro modo di sviluppare, rilasciare e aggiornare software.

Docker sta portando un nuovo livello di semplicità alla definizione e alla creazione di applicazioni e servizi, grazie all’incapsulamento di quest’ultimi in container.Questa semplicità consente agli sviluppatori e ai team di operation di utilizzare i container Docker come cifra comune per eliminare l’attrito tra development e operations, avvicinandosi così alla metodologia DevOps. Mentre Docker rappresenta una vera e propria storia di successo, la sua corretta applicazione si trova ancora in una fase di “work in progress”: le aziende stanno sperimentando solo ora come applicare Docker ai diversi contesti e come utilizzare Docker e Jenkins insieme attraverso le pipeline di software delivery.

Accanto a Docker,infatti, sul percorso verso il DevOps, gioca un ruolo fondamentale la tecnologia Jenkins, fondata su pratiche di Continuous Integration e ContinuousDelivery [7] dello sviluppo software. La sua più grande capacità è l’abilità di orchestrare automaticamente qualsiasi numero di processi e qualsiasi numero di tecnologie (come Docker)lungo tutto il ciclo di vita del software. Jenkins è attualmente conosciuto per operare su almeno 100.000 cluster e 300.000server, offrendo più di 1.000 plugin per fornire la Continuous Integration con sistemi di terze parti.


Gianluca Coviello

Full-stack Developer/Solutions Provider

Telecom Italia S.p.A.


Paolo Vitiello

Full-stack Developer/Solutions Provider

Telecom Italia S.p.A.



Bibliografia

[1] «Docker,» [Online]. Available: https://www.docker.com/.

[2]«LinuxContainers,» [Online]. Available: https://linuxcontainers.org/.

[3]«Docker Announces Commercial Partnership with Microsoft to Double Container Market by Extending Docker Engine to Windows Server,» [Online]. Available: https://blog.docker.com/2016/09/docker-microsoft-partnership/.

[4]«What is Docker?,» [Online]. Available: https://www.docker.com/what-docker.

[5]«Docker Engine | Docker,» [Online]. Available: https://www.docker.com/products/docker-engine.

[6]«Docker Hub | Docker,» [Online]. Available: https://hub.docker.com/.

[7]M. Fower, «Continuous delivery,» [Online]. Available: http://martinfowler.com/bliki/ContinuousDelivery.html.