Che cos'è Docker?

Un container è un formato di creazione dei pacchetti che racchiude tutto il codice e le dipendenze di un'applicazione in un formato standard che ne consente l'esecuzione rapida e affidabile in tutti gli ambienti di elaborazione. Un container Docker è un popolare container eseguibile, leggero e autonomo che include tutto il necessario per l'esecuzione di un'applicazione, comprese le librerie, gli strumenti di sistema, il codice e il runtime. Docker è anche una piattaforma software che consente agli sviluppatori di creare, testare e implementare rapidamente applicazioni containerizzate.

Containers as a Service (CaaS) o servizi container sono servizi cloud gestiti che gestiscono il ciclo di vita dei container. I servizi container consentono di orchestrare (avviare, arrestare, ridimensionare) il runtime dei container. Utilizzando i servizi container, puoi semplificare, automatizzare e accelerare lo sviluppo delle applicazioni e il ciclo di vita delle implementazioni.

Negli ultimi anni Docker e i servizi container hanno ottenuto un enorme successo che ha portato a una loro rapida adozione. Docker si è evoluto da tecnologia open source quasi sconosciuta e tecnicamente piuttosto impegnativa nel 2013 ad ambiente di runtime standardizzato ora ufficialmente supportato per molti prodotti aziendali Oracle.

Definizione della terminologia Docker

Docker:

Una piattaforma di container software progettata per lo sviluppo, la spedizione e l'esecuzione di applicazioni sfruttando la tecnologia dei container. Docker è disponibile in due versioni: edizione aziendale e edizione per community

Container:

A differenza di una VM che fornisce la virtualizzazione hardware, un container fornisce una virtualizzazione leggera a livello di sistema operativo astraendo lo "spazio utente". I container condividono il kernel del sistema host con altri container. Un container, che viene eseguito sul sistema operativo host, è un'unità software standard che contiene codice e tutte le relative dipendenze, in modo da consentire l'esecuzione rapida e affidabile delle applicazioni da un ambiente all'altro. I container sono non persistenti e provengono da immagini.

Engine Docker:

Il software host open-source che costruisce ed esegue i container. Le engine Docker fungono da applicazione client-server che supporta i container su diversi server Windows e sistemi operativi Linux, inclusi Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE e Ubuntu.

Immagini Docker:

Raccolta di software da eseguire come container che contiene un set di istruzioni per la creazione di un container da eseguire sulla piattaforma Docker. Le immagini sono immutabili e le modifiche apportate a un'immagine richiedono la creazione di una nuova immagine.

Registro Docker:

Luogo per memorizzare e scaricare le immagini. Il registro è un'applicazione server-side stateless e scalabile che memorizza e distribuisce le immagini Docker.

Chi usa Docker?

Docker è un framework di sviluppo di applicazioni aperto progettato per offrire vantaggi a DevOps e sviluppatori. Tramite Docker, gli sviluppatori possono facilmente creare, suddividere in pacchetti, spedire ed eseguire applicazioni come container leggeri, portatili e autosufficienti, eseguibili praticamente ovunque. I container consentono agli sviluppatori di creare un pacchetto di un'applicazione con tutte le sue dipendenze e implementarlo come una singola unità. Fornendo container di applicazioni predefiniti e autosufficienti, gli sviluppatori possono concentrarsi sul codice dell'applicazione e utilizzarlo senza doversi preoccupare del sistema operativo sottostante o del sistema di implementazione.

Inoltre, gli sviluppatori possono sfruttare migliaia di applicazioni container open source già progettate per l'esecuzione all'interno di un container Docker. Per i team DevOps, Docker si presta a toolchain di sviluppo e integrazione continue e riduce i vincoli e le complessità all'interno della loro architettura di sistema relativi all'implementazione e alla gestione delle applicazioni. Con l'introduzione dei servizi cloud di orchestrazione dei container, qualsiasi sviluppatore può sviluppare applicazioni containerizzate localmente nel proprio ambiente di sviluppo, quindi migrare ed eseguire quelle applicazioni containerizzate in produzione su servizi cloud, come i servizi Kubernetes gestiti.

Docker e sviluppatori

Containers può essere creato da qualsiasi tipo di sviluppatore. Nel settore dei software spesso si separano gli sviluppatori per specializzazione: front-end, back-end o qualsiasi punto tra loro. Mentre nella maggior parte dei casi sono gli sviluppatori back-end a creare i container, chiunque abbia familiarità con i concetti di base CaaS può avere successo in questa particolare area del ciclo di vita di sviluppo del software. Prima di creare un pacchetto per le dipendenze della tua applicazione, visita developer.oracle.com e acquisisci familiarità con gli strumenti che puoi utilizzare per creare la tua applicazione o il tuo programma.

Docker a confronto con Kubernetes

I container Linux esistono dal 2008, ma non sono stati molto conosciuti fino al 2013, anno della nascita dei container Docker. Con l'arrivo dei container Docker, è arrivata anche l'esplosione di interesse nello sviluppo e nell'implementazione delle applicazioni in containerizzate. Poiché il numero di applicazioni containerizzate è cresciuto fino a comprendere centinaia di container distribuiti su più server, anche il loro funzionamento è diventato più complesso. Come è possibile coordinare, ridimensionare, gestire e pianificare centinaia di container? È qui che Kubernetes può aiutarti. Kubernetes è un sistema di orchestrazione open source che consente di eseguire carichi di lavoro e container Docker. Permette di gestire le complessità operative quando effettui la migrazione per ridimensionare più container distribuiti su più server. Il motore Kubernetes orchestra automaticamente il ciclo di vita del container, distribuendo i container delle applicazioni nell'infrastruttura di hosting. Kubernetes può ridimensionare rapidamente le risorse, a seconda delle esigenze. Esegue il provisioning, pianifica, elimina e monitora continuamente lo stato dei container.

Nozioni di base su Docker

I concetti fondamentali di Docker sono rappresentati da immagini e container. Un'immagine Docker contiene tutti gli elementi necessari per eseguire il software: il codice, un runtime, come Java Virtual Machine (JVM), i driver, gli strumenti, gli script, le librerie, le implementazioni e molto altro ancora.

Un container Docker è un'istanza in esecuzione di un'immagine Docker. Tuttavia, a differenza della virtualizzazione tradizionale con un hypervisor di tipo 1 o di tipo 2, un container Docker viene eseguito sul kernel del sistema operativo host. All'interno di un'immagine Docker non esiste un sistema operativo separato, come illustrato nella Figura 1.

immagine di base docker
Figura 1

Isolamento a confronto con virtualizzazione

Ogni container Docker ha il proprio file system, il proprio stack di rete (quindi il proprio indirizzo IP), il proprio spazio di elaborazione e limitazioni di risorse definite per CPU e memoria. Poiché un container Docker non deve avviare un sistema operativo, si avvia immediatamente. Docker fa riferimento all'isolamento, vale a dire alla separazione delle risorse di un sistema operativo host, al contrario della virtualizzazione, vale a dire la fornitura di un sistema operativo guest al di sopra del sistema operativo host.

File system incrementale

immagine dei file system e incrementali
Figura 2

Il file system di un'immagine Docker è stratificata, con semantica copy-on-write. Ciò consente l'ereditarietà e il riutilizzo, salva le risorse su disco e consente il download incrementale delle immagini.

Come illustrato nella Figura 2, un'immagine Docker con un'implementazione WebLogic potrebbe essere basata su un'immagine con un dominio Oracle WebLogic Server, che potrebbe essere basata su un'immagine WebLogic, basata su un'immagine JDK (Java Development Kit), che a sua volta è basata su un'immagine di base Oracle Linux.

Registro Docker

Sebbene le immagini Docker siano facili da creare e gli sviluppatori ne apprezzino la semplicità e la portabilità.Tuttavia, è diventato subito evidente che la gestione di migliaia di immagini Docker rappresentava una vera sfida. Docker Registry affronta questa sfida. Docker Registry è uno standard per lo storage e la distribuzione delle immagini Docker. Registry è un repository open source con la licenza permissiva Apache.

Docker Registry consente anche di migliorare il controllo degli accessi e la sicurezza delle immagini Docker archiviate nel suo repository. Gestisce la distribuzione delle immagini e può anche integrarsi con i flussi di lavoro di sviluppo delle applicazioni. Gli sviluppatori possono configurare il proprio Docker Registry o utilizzare un servizio Docker Registry ospitato come Docker Hub, Oracle Container Registry, Azure Container Registry e così via.

Docker Hub è un registro Docker ospitato gestito da Docker. Docker Hub ha oltre 100.000 immagini di container da fornitori di software, progetti open source e dalla community. Docker Hub contiene software e applicazioni da repository ufficiali come NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu e Oracle Linux.

All'avvio di un container, Docker per impostazione predefinita estrae automaticamente l'immagine corrispondente dal Docker Hub pubblico, qualora non fosse disponibile localmente. Inoltre, puoi creare le tue immagini e inviarle a Docker Hub in un repository pubblico o privato.

Figura 3: screenshot del registro Docker
Figura 3

Docker come runtime di microservizi

In questi giorni, l'idea di suddividere applicazioni monolitiche in blocchi più piccoli di microservizi sta attirando l'attenzione degli sviluppatori di software.

I microservizi vengono implementati in modo indipendente come un processo, utilizzano protocolli leggeri per comunicare tra loro e ogni servizio possiede i propri dati . Poiché i microservizi seguono un approccio di governance decentralizzato, richiedono una quantità piuttosto elevata di automazione dell'infrastruttura, test automatizzati, pipeline CD completamente automatizzate e team DevOps agili e competenti.

Questo stile architettonico è ancora argomento di una discussione accesa, ma sarebbe ingenuo presumere che un'applicazione suddivisa in microservizi possa essere semplicemente gestita come un insieme di processi. Per citare solo alcuni requisiti, un microservizio deve essere indipendente dall'host e isolato a livello di sistema operativo. Deve essere eseguito entro i limiti delle risorse, deve essere ridimensionato, riavviato in caso di errore e rilevato da e connesso ad altri microservizi tramite un livello di rete definito dal software.

Pertanto, l'esecuzione di un microservizio in un container Docker è un ottimo punto di partenza per raggiungere la maggior parte di questi obiettivi.

Docker - Due dimensioni chiave

Docker cambia il modo in cui creiamo, spediamo ed eseguiamo il software in due diverse dimensioni:

  • Migliora il processo per il recupero affidabile delle applicazioni dallo sviluppo alla produzione.
  • Fornisce un formato immagine standard per passare dall'ambiente on-premise al cloud.

Entrambe le dimensioni sono illustrate più dettagliatamente nei paragrafi seguenti.

Immagine Docker - Dallo sviluppo alla produzione

La creazione di un'immagine Docker con tutte le sue dipendenze potrebbe evitare che questa funzioni solo sulla macchina di sviluppo. L'idea chiave è che un'immagine Docker viene creata automaticamente da una pipeline di creazione da un repository di codice sorgente come Git e inizialmente testata in un ambiente di sviluppo. Questa immagine immutabile verrà quindi archiviata in un registro Docker.

Come mostrato nella Figura 4, la stessa immagine verrà utilizzata per ulteriori test di carico, test di integrazione, test di accettazione e altro ancora. In ogni ambiente, verrà utilizzata la stessa immagine. Piccole ma necessarie differenze ambientali specifiche, come un URL JDBC per un database di produzione, possono essere inserite nel container come file o variabili di ambiente.

screenshot immagine docker
Figura 4

Le statistiche mostrano che il 65% di tutti gli attuali casi d'uso di Docker è in fase di sviluppo e il 48% utilizza Docker per l'integrazione continua.

Cloud Docker

Docker ha cambiato l'adozione dei cloud pubblici: da un lato, per la prima volta, grazie a un'immagine Docker esiste un formato di pacchetto comune eseguibile on-premise e su tutti i principali provider cloud. I container Docker vengono eseguiti sul laptop nello stesso modo in cui vengono eseguiti su Oracle Cloud.

D'altra parte, poiché i container Docker vengono eseguiti su tutti i principali cloud pubblici, rappresentano un contributo importante al superamento di un pregiudizio contro i cloud pubblici: il vendor lock-in. Tutti i principali provider cloud ora offrono Docker come PaaS.

Versioni Docker - Maturità della tecnologia sottostante

Il ritmo di rilascio di Docker è molto più veloce del ciclo di rilascio del software aziendale tradizionale. A volte il rapido ritmo di rilascio di Docker, insieme alla novità del progetto Docker, solleva preoccupazioni sulla sicurezza e la stabilità di Docker.

Sebbene Docker e la sua riga di comando, il daemon Docker, la sua API e strumenti come Docker Swarm, Docker Machine e Docker Compose si siano evoluti solo negli ultimi tre anni, le funzionalità del kernel sottostante sono disponibili in ogni kernel Linux da quasi un decennio.

Un importante esempio di uno dei primi ad adottare la tecnologia di container è Google. Google utilizza i container Linux da prima che Docker fosse in circolazione. Inoltre, Google esegue tutto in un container. Si stima che Google lanci diversi miliardi di container a settimana.

Storia di cgroup e spazi dei nomi

Le funzionalità del kernel Linux sottostante utilizzate da Docker sono cgroup e spazi dei nomi. Nel 2008, è avvenuta l'introduzione delle cgroup nel kernel Linux sulla base del lavoro svolto in precedenza dagli sviluppatori Google 1. Le cgroup limitano e tengono conto dell'utilizzo delle risorse di un insieme di processi del sistema operativo.

Il kernel Linux utilizza lo spazio dei nomi per isolare le risorse di sistema dei processi l'una dall'altra. Già nel 2002 è stato introdotto il primo spazio dei nomi, vale a dire lo spazio dei nomi di montaggio.2

Servizi cloud per container

Nella prima parte di questo articolo sono stati illustrati alcuni importanti concetti di Docker. Tuttavia, in un ambiente di produzione non è sufficiente eseguire semplicemente un'applicazione in un container Docker.

Per configurare e gestire un ambiente di produzione è necessario hardware per l'esecuzione dei container. Software come Docker, insieme a repository e gestori di cluster, devono essere installati, aggiornati ed è necessario applicarvi patch. Se più container Docker comunicano negli host, è necessario creare una rete. Potrebbe essere necessario riavviare i container in cluster, qualora non riuscissero a comunicare tra loro. Inoltre, implementare un insieme di container collegati tra loro dovrebbe essere un'operazione semplice, analogamente a quella per una singola istanza dell'applicazione logica. Un esempio potrebbe essere un sistema di bilanciamento del carico, alcuni server web, alcune istanze di Oracle WebLogic Server con un server di amministrazione, un server gestito e un database. Per gestire le applicazioni containerizzate su larga scala, è necessario un sistema di orchestrazione dei container come Kubernetes o Docker Swarm. L'implementazione, la gestione e il funzionamento di sistemi di orchestrazione come Kubernetes possono essere impegnativi e richiedere molto tempo.

Per rendere più semplice ed efficiente per gli sviluppatori la creazione di applicazioni containerizzate, i provider cloud offrono servizi cloud per container o Containers as a Service (CaaS). Container Cloud Services permette agli sviluppatori e ai team operativi di semplificare e gestire il ciclo di vita dei container in modo automatizzato. Questi servizi di orchestrazione, in genere creati utilizzando Kubernetes, semplificano la gestione e il funzionamento delle applicazioni containerizzate su larga scala per i team DevOps. Oracle Cloud Infrastructure Kubernetes Engine e Azure Kubernetes Service sono due esempi di servizi cloud gestiti per l'orchestrazione dei container più diffusi.

Oracle Container Engine for Kubernetes è un servizio completamente gestito, scalabile e ad alta disponibilità da utilizzare per implementare le applicazioni containerizzate nel cloud. Utilizza Kubernetes Engine (a volte abbreviato in OKE) quando il team di sviluppo desidera creare, implementare e gestire in modo affidabile applicazioni cloud native.

Immagini Docker di Oracle

Containers può essere creato da qualsiasi tipo di sviluppatore. Nel settore dei software spesso si separano gli sviluppatori per specializzazione: front-end, back-end o qualsiasi punto tra loro. Mentre nella maggior parte dei casi sono gli sviluppatori back-end a creare i container, chiunque abbia familiarità con i concetti di base CaaS può avere successo in questa particolare area del ciclo di vita di sviluppo del software. Prima di creare un pacchetto per le dipendenze della tua applicazione, visita developer.oracle.com e acquisisci familiarità con gli strumenti che puoi utilizzare per creare la tua applicazione o il tuo programma.

Di seguito sono riportate alcune fonti per ottenere o creare immagini Docker per i prodotti Oracle. Il repository Oracle GitHub per le immagini Docker contiene Dockerfile ed esempi per creare immagini Docker per prodotti commerciali Oracle e progetti open source sponsorizzati da Oracle.

Laboratori pratici Docker - Sviluppo containerizzato con Docker

Riferimenti

  1. Cgroups (Wikipedia)
  2. Spazi dei nomi Linux (Wikipedia)