Premier Training & Business Partner Red Hat

Docker, una soluzione semplice e geniale

Giorgio Crivellari
Ti piacerebbe diventare anche tu uno di noi e
pubblicare i tuoi articoli nel blog degli RHCE italiani?

In quest’ultimo anno e mezzo, abbiamo assistito all’eccezionale evoluzione del progetto open-source Docker: una soluzione che permette di automatizzare il deployment di applicazioni all’interno di containers autosufficienti con estrema facilità e velocità.

Docker

Il progetto

è nato dall’esperienza di dotCloud, società specializzata nello sviluppo di soluzioni PaaS, e in particolare dal suo CTO, Solomon Hykes, che è il suo più grande contributore insieme ai più di 600 sviluppatori della open-community.
La prima versione stable è stata rilasciata lo scorso 9 Giugno e accolta con molto favore da tutta la community e molti progetti collegati; mentre a oggi, l’ultima release disponibile, è la 1.3.1. Dunque è comprensibile come la velocità di sviluppo, gli investimenti e l’interesse maturato sul progetto stanno accelerando il rilascio di nuove features e integrazioni.

Come funziona?

Docker, come anticipato, basa la sua semplicissima logica di deploy applicativa a partire dai containers e immagini (“template”).
I containers sono delle porzioni di spazi di sistema nei quali, le applicazioni e le proprie dipendenze, vengono eseguite con risorse (CPU, RAM, block I/O e network) isolate pur mantenendo comune lo stesso kernel space: questa tecnologia è di fatto una virtualizzazione light, in quanto richiede meno overhead rispetto ai classici e famosi hypervisor (questi ultimi infatti eseguono una virtualizzazione complessiva dell’hardware e del sistema operativo).

Come accade nelle navi porta containers, che permettono lo spostamento di qualsiasi merce da un luogo a un altro, così Docker permette lo spostamento di applicazioni mediante il deploy di istanze di “immagini” che contengono:

  • una immagine base (disponibili per le più importanti distro: rhel, centos, debian, ubuntu…)
  • la/le applicazione/i (dunque una serie di processi)
  • i requirement dell’environment a corollario dell’applicativo (mount, network port, etc…)

tutto questo è descrivibile e “buildabile” automaticamente a partire da un file detto Dockerfile.

A questo si aggiunge anche la possibilità di poter committare e versionare i vostri container, proprio come fareste con i vostri files, per poter creare nuove immagini da poter implementare in locale o su altre macchine remote, pushando l’immagine in un repository remoto detto registry (una classica operazione fatta con SVN o GIT).

Questo rende dunque la vostra applicazione “dockerizzata”, e tutte le sue dipendenze, usabili e trasportabili su qualsiasi altra macchina che esegue il demone Docker.

Esiste un repository comune, offerto dal sito del progetto Docker, chiamato Registry Hub e che potrete sfogliare all’indirizzo https://registry.hub.docker.com – qui gli utenti hanno rilasciato migliaia di immagini preconfezionate per le più svariate applicazioni. Ogni immagine è accompagnata da una breve descrizione e repository git ove è possibile sfogliare il contenuto del Dockerfile che lo ha buildato.

E’ inoltre possibile costruirsi il proprio repository a partire, neanche a dirlo, da una immagine già pronta chiamata “registry” (https://registry.hub.docker.com/_/registry/): questa una volta avviata ed esposta dietro un web server NGINX o Apache, sarà un perfetto repository privato per tutte le vostre applicazioni, pronte per essere deployate in pochissimi minuti.

 

Come iniziare?

Docker può essere eseguito solo con i seguenti prerequisiti:

  • architettura a 64 bit
  • Kernel Linux recente: in particolare è consigliabile (in alcuni casi obbligatorio) utilizzare almeno la versione 3.8 o successive (alcune versioni 2.6.x sono state appositamente patchate)
  • il kernel deve supportare uno dei seguenti storage driver:
    • Device Mapper (default)
    • AUFS (molto utilizzato nelle prime versioni e causa di molte limitazioni)
    • vfs
    • brtfs
  • cgroups and namespaces supportati e abilitati dal kernel

Per il setup del vostro ambiente usate pure la guida adatta a voi (per tutte le piattaforme e distro): https://docs.docker.com/installation/#installation

Una volta installato e avviato il demone docker (infatti l’applicazione è di tipo client/server ed è dunque possibile centralizzare la gestione di diversi host docker da un unico manager mediante la connessione client) basterà lanciare il vostro primo container:

# scaricate l’immagine base di centos 7 nel vostro repo locale
docker pull centos:latest

# avviate il vostro primo docker a partire dall’immagine appena scaricata
docker run -i -t --name extraordy-lab centos /bin/bash

Avrete così avviato il vostro primo container e sarete liberi di personalizzarlo a vostro piacimento e, una volta usciti (il processo verrà fermato), di poterlo poi committare con il comando:

# comando di commit locale:
docker commit extraordy-lab lab:latest

potete verificare la presenza della nuova immagine con il comando “docker images” e dunque creare nuove istanze della vostra lab:latest, o altre, semplicemente sostituendo il nome dell’immagine desiderata alla procedura sopra descritta.

Vi ricordo che, se non commitate, tutte le modifiche all’immagine di avvio verranno distrutte alla distruzione del container.

Tutti i comandi della CLI sono ampiamente documentati a questo indirizzo:
http://docs.docker.com/reference/commandline/cli/

Sono disponibili numerosi esempi di addestramento che spiegano come creare applicazioni Node.js, database MongoDB e PostgreSQL, etc … https://docs.docker.com/installation/#examples

Perché usare Docker?

  • è estremamente utile e versatile nel velocizzare lo sviluppo/test locale e nella condivisione delle Docker images all’interno dei team;
  • supporta pienamente la nuova tendenza di ambienti autonomi composti da micro services;
  • è indicato per l’esecuzione test cases su singole istanze applicative in ambienti di Continuous Integration (CI) come Jenkins (si trovano in rete numerosi tutorial in merito)
  • permette la creazione di ambienti PaaS multi tenant su architetture host condivise, garantendo il massimo isolamento dei processi e dei dati;
  • è un’ottima soluzione per poter testare localmente architetture complesse multi-host

Purtroppo non mi è possible essere sufficientemente breve ed esaustivo nel trattare gli aspetti tecnici e le potenzialità di Docker, ma sono sicuro di aver attirato la vostra attenzione che, nelle prossime settimane, stimoleremo con ulteriori casi d’uso concreti.

A presto…

Info about author

Giorgio Crivellari