24 Gennaio 2019

Cos’è Docker ? Perché dovrei interessarmi di Docker?

Introduzione a Docker come sistema container in alternativa alla virtualizzazione classica.

Cos’è Docker?

Docker rappresenta una rivoluzione nel campo della virtualizzazione. Se sei già un esperto di virtualizzazione, potresti voler saltare alcune delle prossime sezioni. Tuttavia, se sei nuovo a questo concetto, una comprensione di base della virtualizzazione sarà essenziale per aiutarti a cogliere il valore e le potenzialità di Docker.

Docker è un potente strumento open-source per la containerizzazione, un’innovazione che sta rivoluzionando il modo in cui creiamo, distribuiamo ed eseguiamo le applicazioni. Con Docker, le tue applicazioni sono racchiuse in ambienti isolati chiamati “container”, consentendo loro di operare in modo indipendente dal sistema operativo sottostante e assicurando una prestazione consistente, a prescindere dall’ambiente in cui vengono eseguite.

I container Docker utilizzano avanzate tecnologie di virtualizzazione a livello di sistema operativo, tra cui i cgroups e i namespace di Linux. Questi strumenti isolano risorse di sistema critiche come memoria e processi, consentendo la creazione di ambienti di esecuzione leggeri e portatili. A differenza delle macchine virtuali tradizionali, i container Docker non richiedono l’installazione di un sistema operativo completo o di un hypervisor, risultando così più efficienti e snelli.

Uno dei principali vantaggi di Docker risiede nella sua capacità di superare i problemi di compatibilità tra differenti ambienti, facilitando la distribuzione delle applicazioni su qualsiasi sistema operativo che supporti Docker. Docker permette inoltre di configurare senza difficoltà ambienti di sviluppo e test che rispecchiano fedelmente quelli di produzione, poiché gli sviluppatori possono lavorare con gli stessi container utilizzati in fase di produzione. Questo uso strategico dei container può contribuire a ridurre i costi di infrastruttura, dal momento che i container possono operare su una singola macchina, sia fisica che virtuale, eliminando così la necessità di macchine dedicate per ogni applicazione.

Cos’è la virtualizzazione?

Iniziamo a svelare il concetto di virtualizzazione con una semplice metafora: immagina di possedere una casa e di avere un amico che ha bisogno di un posto dove stare. Hai diverse possibilità per aiutare il tuo amico:

  1. Potresti invitare il tuo amico a condividere la tua camera da letto, ma questa opzione potrebbe diventare scomoda molto velocemente.
  2. Potresti costruire una nuova casa per il tuo amico sulla tua proprietà, ma questa soluzione potrebbe risultare troppo costosa.
  3. Potresti offrire al tuo amico di alloggiare nella camera degli ospiti, mantenendo così separate le vostre vite, pur condividendo alcune risorse comuni come la cucina e il soggiorno.

La terza opzione rappresenta l’essenza della virtualizzazione. In informatica, la virtualizzazione si riferisce al processo di creazione di una versione virtuale (o simulata) di risorse hardware, come un server, un dispositivo di archiviazione o una rete.

Ora, mettiamo il caso di voler eseguire un server web sul tuo computer, ma desideri mantenerlo separato dal tuo sistema operativo e dalle tue applicazioni esistenti. La soluzione? La virtualizzazione. Puoi creare una macchina virtuale (VM) sul tuo sistema, che ospiterà il server web. La VM funziona come un computer separato, con il proprio sistema operativo e applicazioni, ma utilizza le risorse hardware del tuo computer, come il processore e la RAM.

Quando avvii la VM, vedrai apparire un sistema operativo completamente nuovo in una finestra all’interno del tuo sistema operativo attuale. Questo è l’equivalente di invitare il tuo amico a stare nella tua camera degli ospiti: condividi le risorse (in questo caso, le risorse hardware del tuo computer), ma mantenete la separazione e l’indipendenza. Questa potente tecnologia permette di sfruttare al meglio le risorse hardware disponibili, riducendo i costi e migliorando l’efficienza e la flessibilità dei sistemi informatici.

Cosa c’è di diverso in Docker? Come si differenzia dalla virtualizzazione tradizionale?

Docker rappresenta un approccio innovativo e diverso alla virtualizzazione. Mentre una macchina virtuale tradizionale incapsula l’intero sistema operativo insieme all’applicazione in esecuzione, Docker utilizza un approccio di condivisione, massimizzando l’uso comune delle risorse tra i sistemi virtualizzati. Questa strategia consente a Docker di consumare meno risorse durante l’esecuzione e rende i contenitori Docker più facili da distribuire, sia per gli sviluppatori che per l’ambiente di produzione.

La virtualizzazione tradizionale, offerta da hypervisor come VMware o Hyper-V, genera un ambiente di esecuzione separato noto come “macchina virtuale” (VM). In una VM, viene eseguito un sistema operativo completo, consentendo l’esecuzione simultanea di diversi sistemi operativi su una singola macchina fisica. Tuttavia, questo approccio comporta un notevole sovraccarico in termini di risorse di sistema, poiché ogni VM necessita di una propria memoria, CPU e spazio su disco.

Al contrario, Docker impiega una tecnologia denominata contenitorizzazione per creare ambienti di esecuzione isolati, chiamati “contenitori”. Questi contenitori condividono il kernel del sistema operativo della macchina host. Questo significa che, a differenza delle VM, i contenitori Docker non necessitano di un intero sistema operativo per funzionare, ma utilizzano le risorse condivise del sistema operativo host. Questa caratteristica permette a Docker di creare ambienti di esecuzione più leggeri e facilmente trasportabili rispetto alle VM. Infatti, i contenitori possono essere spostati senza problemi tra diverse macchine fisiche o virtuali, senza la necessità di modifiche.

In sintesi, mentre la virtualizzazione tradizionale sfrutta gli hypervisor per creare macchine virtuali completamente separate, Docker sfrutta la tecnologia di contenitorizzazione per generare ambienti di esecuzione isolati che condividono il kernel del sistema operativo host. Questo approccio unico alla virtualizzazione rende Docker una soluzione efficiente e flessibile per lo sviluppo, il testing e la distribuzione di applicazioni.

Docker riveste un ruolo fondamentale per gli sviluppatori web, fornendo strumenti potenti e facilitando molte operazioni quotidiane.

Uno dei principali vantaggi di Docker è la facilità di condivisione degli ambienti di sviluppo. Se tu ed io stessimo collaborando su un’app Node, per esempio, vorremmo garantire che entrambi avessimo installato Node e che stessimo utilizzando la stessa versione per assicurare la coerenza dei nostri ambienti. Inconsistenze nelle versioni possono infatti causare problemi difficili da individuare, dal momento che le librerie e il nostro codice potrebbero comportarsi diversamente tra le diverse versioni di Node.

Una possibile soluzione è installare la stessa versione di Node per entrambi, ma se abbiamo già altri progetti sui nostri sistemi che richiedono diverse versioni di Node, dovremmo considerare l’installazione di NVM, un tool che ci consente di cambiare facilmente versione. A questo punto, potremmo aggiungere un file .nvmrc al progetto, specificando la versione che intendiamo utilizzare. Questo processo, tuttavia, può essere piuttosto laborioso e, nonostante l’attuazione di tutti questi passaggi, non possiamo garantire che l’ambiente sarà lo stesso per tutti gli sviluppatori.

Docker ci offre una soluzione a queste problematiche, consentendoci di fornire lo stesso ambiente di sviluppo a tutti gli sviluppatori. Con Docker, il processo diventa:

  1. Installa Docker.
  2. Scrivi un Dockerfile.
  3. Esegui docker build -t <image-name>.
  4. Esegui docker run -p 3000:3000 <image-name>.

Questo processo potrebbe non sembrare molto più semplice rispetto alla configurazione di Node/NVM, ma offre un vantaggio notevole: l’installazione di Docker è un’operazione da eseguire una sola volta, indipendentemente dallo stack tecnologico che intendi utilizzare. Con Docker, invece di dover installare il software specifico per ogni stack, dovrai semplicemente scrivere un Dockerfile differente (o un Docker Compose file, a seconda della complessità della tua app).

Un Dockerfile è un semplice file di testo, senza estensione, che definisce la configurazione di un ambiente Docker. Ad esempio, ecco come potrebbe apparire un Dockerfile per un’app Node:

# This Docker image will be based on the Node 11.6 image
FROM node:11.6.0
# Install dependencies
COPY package*.json ./
RUN npm install
# Copy the node app from the host into the image at /app
COPY . /app
# Expose port 3000 and start the app
EXPOSE 3000
CMD npm start

Questo Dockerfile è destinato a un’app Node che ascolta sulla porta 3000 e viene avviata con il comando npm start. Inserendolo nel repository del tuo progetto, l’onboarding di nuovi sviluppatori diventa semplice e al 100% coerente: ogni sviluppatore ottiene sempre lo stesso ambiente. In sostanza, Docker è un potente strumento che semplifica la vita degli sviluppatori, aumenta l’efficienza e favorisce la coerenza tra gli ambienti di sviluppo.

Sviluppare sullo stesso ambiente della produzione

Una volta installata l’app in un ambiente di sviluppo Docker, è possibile spedire l’intero container direttamente alla produzione. Se pensi che sia un problema affrontare le incongruenze tra due sviluppatori, aspetta solo che tu scriva il codice che funziona sulla tua macchina solo per far sì che non funzioni nella produzione. È estremamente frustrante.

Hai tonnellate di opzioni per la distribuzione di container Docker alla produzione. Eccone alcuni:

Mi piace l’approccio di Heroku perché è l’unico che ti permette semplicemente di far salire il tuo progetto con un Dockerfile per farli girare. Gli altri fanno molti altri passi come fare il push  dell’immagine Docker in un repository. I passaggi extra non sono la fine del mondo, ma non sono necessari.

Che dire delle app più complesse?

A causa della filosofia di Docker (un processo per contenitore), la maggior parte delle app richiederà più contenitori . Ad esempio, un sito WordPress dovrebbe consistere in un contenitore per il server Web che esegue PHP e un contenitore per il database MySQL. Ciò significa che hai bisogno di un modo in cui i contenitori possano parlare. Questo è chiamato orchestrazione di container .

Se è possibile eseguire tutti i contenitori su un singolo host, Docker Compose soddisferà probabilmente le esigenze di orchestrazione. È incluso quando installi Docker ed è facile da imparare. Ti consente di avviare più contenitori contemporaneamente e di creare reti tra loro in modo che possano parlare tra loro. Questo è il modo più semplice e veloce per orchestrare più contenitori.

Se devi orchestrare contenitori sparsi su più host, Kubernetes è la soluzione prevalente. Molti host che supportano le distribuzioni Docker offrono Kubernetes per l’orchestrazione.

Vantaggi rapidi derivanti dalla comprensione di Docker.

Potrebbe non sembrare rilevante in questo momento, ma ricorda queste informazioni per la prima volta in cui incontrerai un problema causato dalle differenze negli ambienti di sviluppo. Non vorrai che si ripeta. Imparando ad utilizzare Docker, sarai in grado di garantire un ambiente coerente per la tua applicazione, indipendentemente da dove viene eseguita o da chi la sta gestendo. Ciò significa risultati uniformi e affidabili su cui tu, i tuoi clienti e i tuoi datori di lavoro potrete contare.

La comprensione di Docker offre una serie di vantaggi immediati o, come li chiamiamo nel mondo del business, “quick wins”. Vediamo alcuni dei più significativi:

  1. Ambiente di sviluppo coerente: Docker consente di creare e distribuire facilmente ambienti di sviluppo uniformi tra diverse macchine e diverse piattaforme. Questo riduce significativamente i problemi legati alle differenze negli ambienti di sviluppo, un problema comune in molti team di sviluppo.
  2. Portabilità dell’applicazione: Con Docker, le tue applicazioni possono essere facilmente spostate da un ambiente all’altro senza problemi di compatibilità. Ciò significa che le tue applicazioni possono essere sviluppate localmente, testate su un ambiente di stage, quindi spostate in produzione senza alcun cambiamento all’ambiente.
  3. Isolamento dell’applicazione: Docker consente di eseguire le applicazioni in contenitori isolati, garantendo che non interferiscano tra loro. Questo può essere particolarmente utile quando si lavora con applicazioni che richiedono versioni diverse delle stesse dipendenze.
  4. Efficienza delle risorse: I contenitori Docker sono notoriamente efficienti in termini di risorse, utilizzando solo le risorse necessarie per eseguire l’applicazione contenuta. Questo può portare a una maggiore efficienza delle risorse, in particolare quando si lavora con macchine con risorse limitate.
  5. Replicabilità: Con Docker, i processi di costruzione e distribuzione delle applicazioni sono completamente automatizzati e replicabili. Ciò significa che ogni membro del team può eseguire l’applicazione esattamente nello stesso modo, eliminando i problemi legati alle differenze nelle configurazioni locali.

Insomma, la comprensione e l’utilizzo di Docker può portare a una serie di benefici immediati, rendendolo uno strumento prezioso per qualsiasi sviluppatore.

Hai dei dubbi? Non sai da dove iniziare? Contattaci !

Abbiamo tutte le risposte alle tue domande per aiutarti nella giusta scelta.

Chatta con noi

Chatta direttamente con il nostro supporto prevendita.

0256569681

Contattaci telefonicamente negli orari d’ufficio 9:30 – 19:30

Contattaci online

Apri una richiesta direttamente nell’area dei contatti.

INFORMAZIONI

Managed Server S.r.l. è un player italiano di riferimento nel fornire soluzioni avanzate di sistemistica GNU/Linux orientate all’alta performance. Con un modello di sottoscrizione dai costi contenuti e prevedibili, ci assicuriamo che i nostri clienti abbiano accesso a tecnologie avanzate nel campo dell’hosting, server dedicati e servizi cloud. Oltre a questo, offriamo consulenza sistemistica su sistemi Linux e manutenzione specializzata in DBMS, IT Security, Cloud e molto altro. Ci distinguiamo per l’expertise in hosting di primari CMS Open Source come WordPress, WooCommerce, Drupal, Prestashop, Joomla, OpenCart e Magento, affiancato da un servizio di supporto e consulenza di alto livello adatto per la Pubblica Amministrazione, PMI, ed aziende di qualsiasi dimensione.

Red Hat, Inc. detiene i diritti su Red Hat®, RHEL®, RedHat Linux®, e CentOS®; AlmaLinux™ è un marchio di AlmaLinux OS Foundation; Rocky Linux® è un marchio registrato di Rocky Linux Foundation; SUSE® è un marchio registrato di SUSE LLC; Canonical Ltd. detiene i diritti su Ubuntu®; Software in the Public Interest, Inc. detiene i diritti su Debian®; Linus Torvalds detiene i diritti su Linux®; FreeBSD® è un marchio registrato di The FreeBSD Foundation; NetBSD® è un marchio registrato di The NetBSD Foundation; OpenBSD® è un marchio registrato di Theo de Raadt. Oracle Corporation detiene i diritti su Oracle®, MySQL®, e MyRocks®; Percona® è un marchio registrato di Percona LLC; MariaDB® è un marchio registrato di MariaDB Corporation Ab; REDIS® è un marchio registrato di Redis Labs Ltd. F5 Networks, Inc. detiene i diritti su NGINX® e NGINX Plus®; Varnish® è un marchio registrato di Varnish Software AB. Adobe Inc. detiene i diritti su Magento®; PrestaShop® è un marchio registrato di PrestaShop SA; OpenCart® è un marchio registrato di OpenCart Limited. Automattic Inc. detiene i diritti su WordPress®, WooCommerce®, e JetPack®; Open Source Matters, Inc. detiene i diritti su Joomla®; Dries Buytaert detiene i diritti su Drupal®. Amazon Web Services, Inc. detiene i diritti su AWS®; Google LLC detiene i diritti su Google Cloud™ e Chrome™; Microsoft Corporation detiene i diritti su Microsoft®, Azure®, e Internet Explorer®; Mozilla Foundation detiene i diritti su Firefox®. Apache® è un marchio registrato di The Apache Software Foundation; PHP® è un marchio registrato del PHP Group. CloudFlare® è un marchio registrato di Cloudflare, Inc.; NETSCOUT® è un marchio registrato di NETSCOUT Systems Inc.; ElasticSearch®, LogStash®, e Kibana® sono marchi registrati di Elastic N.V. Hetzner Online GmbH detiene i diritti su Hetzner®; OVHcloud è un marchio registrato di OVH Groupe SAS; cPanel®, L.L.C. detiene i diritti su cPanel®; Plesk® è un marchio registrato di Plesk International GmbH; Facebook, Inc. detiene i diritti su Facebook®. Questo sito non è affiliato, sponsorizzato o altrimenti associato a nessuna delle entità sopra menzionate e non rappresenta nessuna di queste entità in alcun modo. Tutti i diritti sui marchi e sui nomi di prodotto menzionati sono di proprietà dei rispettivi detentori di copyright. Ogni altro marchio citato appartiene ai propri registranti. MANAGED SERVER® è un marchio registrato a livello europeo da MANAGED SERVER SRL, Via Enzo Ferrari, 9, 62012 Civitanova Marche (MC), Italia.

Torna in alto