Comprendere Docker

Da diversi mesi utilizzo Docker per strutturare il processo di sviluppo e distribuzione di progetti web. Propongo ai lettori di «HabrHabr» la traduzione dell'articolo introduttivo su Docker — «Comprendere Docker».

Che cos'è Docker?

Docker è una piattaforma open source per lo sviluppo, la distribuzione e l'esecuzione di applicazioni. Docker è progettato per rendere più rapida la distribuzione delle tue applicazioni. Con Docker, puoi separare la tua applicazione dalla tua infrastruttura e gestire l'infrastruttura come un'applicazione controllata. Docker aiuta a pubblicare il tuo codice più rapidamente, a testare più velocemente, a rilasciare applicazioni in modo più efficace e a ridurre il tempo tra la scrittura del codice e il suo avvio. Docker fa questo tramite una leggera piattaforma di virtualizzazione a container, utilizzando processi e strumenti che facilitano la gestione e la distribuzione delle tue applicazioni.

Nel suo nucleo, Docker consente di eseguire praticamente qualsiasi applicazione, isolata in modo sicuro all'interno di un contenitore. L'isolamento sicuro permette di eseguire più contenitori contemporaneamente su un singolo host. La natura leggera del contenitore, che viene eseguito senza il carico aggiuntivo di un hypervisor, consente di ottenere di più dall'hardware.

La piattaforma e gli strumenti di virtualizzazione dei contenitori possono essere utili nei seguenti casi:

  • imballare la tua applicazione (e i relativi componenti) all'interno dei contenitori Docker;
  • distribuire e fornire questi contenitori ai tuoi team per lo sviluppo e il collaudo;
  • pubblicare questi contenitori nelle tue ambientazioni di produzione, sia in data center che nel cloud.

Per cosa posso utilizzare Docker?

Pubblicazione rapida delle tue applicazioni

Docker è particolarmente adatto per organizzare il ciclo di sviluppo. Docker consente agli sviluppatori di utilizzare contenitori locali con applicazioni e servizi, permettendo successivamente l'integrazione con i processi di integrazione continua e distribuzione (workflow di continuous integration and deployment).

Ad esempio, i vostri sviluppatori scrivono codice localmente e condividono il loro stack di sviluppo (una serie di immagini Docker) con i colleghi. Quando sono pronti, inviano il codice e i container nell'ambiente di test e eseguono tutti i test necessari. Dall'ambiente di test possono inviare il codice e le immagini in produzione.

Distribuzione e implementazione più semplici

La piattaforma basata su container Docker consente di portare facilmente la vostra carga utile. I container Docker possono funzionare sulla vostra macchina locale, sia fisica che virtuale nel data center, e nel cloud.

La portabilità e la leggerezza di Docker consentono di gestire dinamicamente il vostro carico. È possibile utilizzare Docker per implementare o arrestare la vostra applicazione o i vostri servizi. La velocità di Docker permette di farlo quasi in tempo reale.

Alti carichi e maggiore carga utile

Docker è leggero e veloce. Fornisce un'alternativa stabile e conveniente alle macchine virtuali basate su hypervisor. È particolarmente utile in condizioni di alto carico, ad esempio nella creazione di un proprio cloud o piattaforma come servizio (platform-as-service). Ma è altrettanto vantaggioso per piccole e medie applicazioni, quando desideri ottenere di più dalle risorse disponibili.

Componenti principali di Docker

Docker è composto da due componenti principali:

  • Docker: piattaforma di virtualizzazione con codice sorgente aperto;
  • Docker Hub: la nostra piattaforma come servizio per distribuire e gestire i container Docker.

Nota! Docker è distribuito sotto licenza Apache 2.0.

Architettura di Docker

Docker utilizza un'architettura client-server. Il client Docker comunica con il demone Docker, che si occupa della creazione, esecuzione e distribuzione dei tuoi container. Entrambi, client e server, possono funzionare su un'unica macchina, e puoi collegare il client a un demone Docker remoto. Client e server comunicano tramite socket o tramite un'API RESTful.

Comprendere Docker

Demone Docker

Come mostrato nel diagramma, il demone viene eseguito sulla macchina host. L'utente non interagisce direttamente con il server, ma utilizza un client per farlo.

Client Docker

Il client Docker, il programma docker, è l'interfaccia principale per Docker. Riceve comandi dall'utente e interagisce con il demone docker.

All'interno di Docker

Per comprendere cosa costituisce Docker, è necessario sapere tre componenti:

  • immagini (images)
  • registri (registries)
  • container

Le immagini

Un'immagine Docker è un modello in sola lettura. Ad esempio, un'immagine può contenere un sistema operativo Ubuntu con Apache e un'applicazione in esecuzione su di essa. Le immagini vengono utilizzate per creare contenitori. Docker consente di creare facilmente nuove immagini, aggiornare quelle esistenti, o è possibile scaricare immagini create da altri. Le immagini sono una componente fondamentale di Docker.

Registro

Il registro Docker memorizza le immagini. Ci sono registri pubblici e privati da cui è possibile scaricare o caricare immagini. Il registro pubblico di Docker è Docker Hub. Qui si trova un'enorme collezione di immagini. Come sapete, le immagini possono essere create da voi o potete utilizzare immagini create da altri. I registri sono una componente fondamentale della distribuzione.

Container

I container sono simili a directory. All'interno dei container c'è tutto ciò che serve per far funzionare un'applicazione. Ogni container viene creato da un'immagine. I container possono essere creati, avviati, arrestati, spostati o eliminati. Ogni container è isolato ed è una piattaforma sicura per l'applicazione. I container sono componenti fondamentali del funzionamento.

Come funziona Docker?

Finora sappiamo che:

  • possiamo creare immagini che contengono le nostre applicazioni;
  • possiamo creare container dalle immagini per eseguire le applicazioni;
  • possiamo distribuire immagini tramite Docker Hub o un altro registro di immagini.

Diamo un'occhiata a come si combinano questi componenti.

Come funziona un'immagine?

Sappiamo già che un'immagine è un modello in sola lettura, da cui viene creato un container. Ogni immagine è composta da un insieme di livelli. Docker utilizza union file system per combinare questi livelli in un'unica immagine. L'union file system consente a file e directory provenienti da diversi file system (diverse ramificazioni) di sovrapporsi in modo trasparente, creando un file system coerente.

Una delle ragioni per cui Docker è leggero è l'uso di strati. Quando modifichi un'immagine, ad esempio, aggiornando un'applicazione, viene creato un nuovo strato. Così, senza sostituire l'intera immagine o ricostruirla, come potresti dover fare con una macchina virtuale, viene solo aggiunto o aggiornato uno strato. E non è necessario distribuire l'intera nuova immagine, si distribuisce solo l'aggiornamento, rendendo più facile e veloce la diffusione delle immagini.

Alla base di ogni immagine c'è un'immagine di base. Ad esempio, ubuntu, l'immagine di base di Ubuntu, o fedora, l'immagine di base della distribuzione Fedora. Puoi anche usare le immagini come base per crearne di nuove. Ad esempio, se hai un'immagine apache, puoi usarla come immagine di base per le tue applicazioni web.

Nota! Docker prende solitamente le immagini dal registro Docker Hub.

Le immagini di Docker possono essere create da queste immagini di base, i passi per creare queste immagini vengono chiamati istruzioni. Ogni istruzione crea una nuova immagine o strato. Le istruzioni saranno le seguenti azioni:

  • eseguire un comando
  • aggiungere un file o una directory
  • creare una variabile d'ambiente
  • Istruzioni su cosa eseguire quando viene avviato il contenitore di questa immagine

Queste istruzioni vengono memorizzate in un file Dockerfile. Docker legge questo Dockerfile, quando costruisci l'immagine, esegue queste istruzioni e restituisce l'immagine finale.

Come funziona il registro Docker?

Il registro è un deposito di immagini Docker. Dopo aver creato un'immagine, puoi pubblicarla su un registro pubblico Docker Hub o sul tuo registro personale.

Con il client Docker puoi cercare immagini già pubblicate e scaricarle sulla tua macchina con Docker per creare contenitori.

Docker Hub offre depositi pubblici e privati di immagini. La ricerca e il download di immagini da depositi pubblici sono disponibili per tutti. Il contenuto dei depositi privati non appare nei risultati di ricerca. Solo tu e i tuoi utenti potete accedere a queste immagini e creare contenitori da esse.

Come funziona un contenitore?

Il contenitore è composto dal sistema operativo, file utente e metadati. Come sappiamo, ogni contenitore è creato a partire da un'immagine. Questa immagine indica a Docker cosa c'è nel contenitore, quale processo avviare quando il contenitore viene avviato e altri dati di configurazione. L'immagine Docker è disponibile solo in lettura. Quando Docker avvia un contenitore, crea un livello di lettura/scrittura sopra l'immagine (utilizzando il file system union, come menzionato in precedenza), dove può essere eseguita l'applicazione.

Cosa succede quando viene avviato un contenitore?

O attraverso un programma docker, oppure tramite l'API RESTful, il client Docker comunica al demone Docker di avviare il contenitore.

$ sudo docker run -i -t ubuntu /bin/bash

Analizziamo questo comando. Il client viene avviato con il comando docker, con l'opzione run, che indica che verrà avviato un nuovo contenitore. I requisiti minimi per avviare un contenitore sono i seguenti attributi:

  • quale immagine utilizzare per creare il contenitore. Nel nostro caso ubuntu
  • il comando che desideri eseguire quando il contenitore viene avviato. Nel nostro caso /bin/bash

Cosa succede realmente dietro le quinte quando eseguiamo questo comando?

Docker, in sequenza, fa quanto segue:

  • scarica l'immagine ubuntu: docker controlla se l'immagine ubuntu è presente sulla macchina locale, e se non c'è, la scarica da Docker Hub. Se l'immagine è già presente, la utilizza per creare il contenitore;
  • crea il contenitore: una volta ottenuta l'immagine, docker la utilizza per creare il contenitore;
  • inizializza il filesystem e monta il livello in modalità di sola lettura: il contenitore è creato nel filesystem e il livello in sola lettura è aggiunto all'immagine;
  • inizializza la rete/bridge: crea un'interfaccia di rete che consente a docker di comunicare con la macchina host;
  • Imposta l'indirizzo IP: trova e assegna l'indirizzo;
  • Avvia il processo specificato: avvia la tua applicazione;
  • Elabora e restituisce l'output della tua applicazione: si collega e registra l'input standard, l'output e lo stream di errori della tua applicazione, permettendoti di monitorare come funziona.

Ora hai un contenitore funzionante. Puoi gestire il tuo contenitore, interagire con la tua applicazione. Quando decidi di fermare l'applicazione, rimuovi il contenitore.

Tecnologie utilizzate

Docker è scritto in Go e utilizza alcune funzionalità del kernel Linux per implementare la funzionalità sopra descritta.

Spazi dei nomi (namespaces)

Docker utilizza la tecnologia namespaces per organizzare spazi di lavoro isolati, che chiamiamo contenitori. Quando avviamo un contenitore, Docker crea un insieme di spazi dei nomi per quel contenitore.

Questo crea un livello isolato, ogni aspetto del contenitore viene eseguito nel proprio spazio dei nomi e non ha accesso al sistema esterno.

Ecco un elenco di alcuni spazi dei nomi utilizzati da Docker:

  • pid: per l'isolamento dei processi;
  • net: per gestire le interfacce di rete;
  • ipc: per gestire le risorse IPC. (IPC: comunicazione interprocesso);
  • mnt: per gestire i punti di montaggio;
  • utc: per isolare il kernel e controllare la generazione delle versioni (UTC: sistema di condivisione del tempo Unix).

Gruppi di controllo (control groups)

Docker utilizza anche la tecnologia cgroups o gruppi di controllo. La chiave per il funzionamento dell'applicazione in isolamento è fornire all'applicazione solo le risorse che si desidera concedere. Ciò garantisce che i container siano buoni vicini. I gruppi di controllo consentono di suddividere le risorse disponibili dell'hardware e, se necessario, impostare limiti e restrizioni. Ad esempio, limitare la quantità di memoria che un container può utilizzare.

Union File System

Union File System o UnionFS è un file system che funziona creando livelli, rendendolo molto leggero e veloce. Docker utilizza UnionFS per creare i blocchi da cui è composto un container. Docker può utilizzare diverse varianti di UnionFS, tra cui: AUFS, btrfs, vfs e DeviceMapper.

Formati dei container

Docker combina questi componenti in una fascia, che chiamiamo formato del container. Il formato predefinito si chiama libcontainer. Inoltre, Docker supporta il formato tradizionale dei container in Linux tramite LXC. In futuro, Docker potrebbe supportare altri formati di container, ad esempio integrandosi con BSD Jails o Solaris Zones.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster