Tra le tecnologie open-source attualmente alla ribalta, Docker è un progetto che merita senz’altro un approfondimento.
Docker consente di implementare una “virtualizzazione leggera” o, come il team di Docker preferisce spiegare, di far girare contenitori di immagini applicative separate, portabili e distribuibili. Ma Docker, grande novità, elimina l’uso di una gamma di strumenti eterogenei con i quali sarebbe stato (ed è stato) possibile implementare circa le stesse cose (si pensi ai player PaaS come Heroku), e fornisce a tutti uno strumento unico per fare tutto: il comando docker.
Con docker si possono creare, lanciare, distruggere contenitori e perfino scaricare immagini già pronte all’uso e prodotte dalla community. I contenitori sono autosufficienti e al loro interno si può installare il software richiesto. Si può creare un contenitore tipo macchina virtuale con dentro CentOS e lavorarci, oppure un contenitore con dentro applicativi specifici in versioni specifiche, che si appoggia e condivide a strati, con altri contenitori, software di base, binari e librerie sottostanti.
A differenza della virtualizzazione, che astrae l’hardware e impila kernel, sistema, librerie e applicativi in una colonna sola, Docker isola porzioni di sistema operativo e risorse (core, memoria, storage e rete). Vediamolo come un chroot on steroids. O come una forma di virtualizzazione leggera. Qualcosa a metà strada.
Le immagini di Docker si possono impilare una sopra l’altra e possono condividere la base sotto. Per esempio, si può creare un’immagine CentOS che funge da fondamenta, due immagini che contengono Apache (Apache 2.2 e Apache 2.4) che si appoggiano su quella CentOS, poi, a sua volta, su quella con Apache 2.2, crearne due, una con MySQL 5.1 e una con MySQL 5.5. In ognuna di queste installare WordPress. E così via, verso l’alto.
Chiunque abbia gestito hosting shared, conosce l’incubo di dover avere più di una versione di PHP installata sul sistema. Per non parlare delle versioni delle librerie o di MySQL. Con Docker, si può instanziare ogni applicativo PHP con la propria versione, con un comando, e manutenerle, con un comando. Questa capacità di poter gestire il moltiplicarsi delle versioni e dei diversi software, potendo isolare immagini con versioni, porta a superare efficacemente il problema della matrice delle dipendenze.
Al di là di PHP, Docker costa meno, in termini di risorse, sforzo e soldi, rispetto a soluzioni di virtualizzazione classica. Laddove possibile, è una soluzione eccezionale per separare applicativi sullo stesso host, in modo sicuro e ripetibile. Qualcuno ha già pensato di usarlo per lanciare servizi PaaS. Altri hanno pensato di rilasciare servizi SaaS (per esempio il cliente compra risorse memcached servite tramite contenitori Docker). Altri ancora, lo usano per creare sandbox per testare software senza dover fare provisioning di VM intere. Ancora, Docker si può usare per implementare il continuous integration e il software testing: si può scriptare per creare e distruggere contenitori dentro i quali applicare i test, e osservare il risultato.
Al momento (versione 0.8), la cosa più sofisticata, fastidiosa e incompleta di Docker, sono le sue capacità di networking. Se è possibile gestire facilmente la rete sui contenitori, ognuno dei quali aggancia una interfaccia di rete a una interfaccia bridge sul sistema, è ancora non immediato fare parlare i contenitori tra di loro.
Comunque, Docker sta attraendo l’attenzione dei grossi player ed è, a mio avviso, uno dei progetti opensource più incandescenti. Red Hat ha pensato, tramite Openshift, di stringere accordi con Docker Inc., di supportarlo ufficialmente a partre da RHEL 7, mentre molti altri finanziatori stanno erogando milioni di dollari al piccolo software scritto in Go che sta, giorno dopo giorno, conquistando il mondo.
Ansiosi e impazienti di giocare con Docker? Usarlo è facilissimo. Per prima cosa va installato:
# yum -y install docker-io
Una volta installato, scarichiamo, installiamo, facciamo provisioning e istanziamo un’immagine CentOS:
# docker pull blalor/centos
Ora verifichiamo che l’immagine sia completa e running, stampando un echo, visualizzando le interfacce di rete e la versione del sistema operativo:
# docker run blalor/centos /bin/echo 'ciao' ciao # docker run blalor/centos /sbin/ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 11: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 6e:66:15:24:50:3d brd ff:ff:ff:ff:ff:ff inet 172.17.0.4/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::6c66:15ff:fe24:503d/64 scope link tentative valid_lft forever preferred_lft forever # docker run blalor/centos /bin/cat /etc/redhat-release CentOS release 6.5 (Final)
Nulla ci vieta di eseguire direttamente una shell ed entrare nel container:
# docker run -i -t blalor/centos /bin/bash bash-4.1# uptime 17:12:48 up 8:52, 0 users, load average: 0.95, 1.04, 0.90 bash-4.1# hostname ee95783822f6
ee95783822f6 è il nome dell’immagine running sull’istanza Docker, un identificativo univoco che individua il contenitore in Docker.
Per mettere mano su Docker, vi consiglio di seguire l’infamous e interattivo Docker tutorial. Ci metterete 10 minuti e dopo diventerete fan della tecnologia.
Infine, altro progetto interessante collaterale a, e che farà parlare di se sarà CoreOS. Magari ne parleremo in un prossimo post. Tornando a Docker, ai ritmi di rilascio attuali, una minor al mese, preparatevi ad accogliere Docker 1.0 per aprile 2014. Tenetelo d’occhio e buon divertimento!