Docker, cos'è e qual è lo scopo


111

Ho sentito parlare di Docker alcuni giorni fa e volevo parlarne.

Ma in effetti, non so qual è lo scopo di questo "contenitore"?

Cos'è un container?

Può sostituire una macchina virtuale dedicata allo sviluppo?

Qual è lo scopo, in parole semplici, dell'utilizzo di Docker nelle aziende? Il vantaggio principale?



Risposte:


116

VM: utilizzando il software VM, ad esempio, Ubuntu può essere installato all'interno di Windows. Ed entrambi funzionerebbero allo stesso tempo. È come costruire un PC, con i suoi componenti principali come CPU, RAM, dischi, schede di rete ecc., All'interno di un sistema operativo e assemblarli per funzionare come se fosse un vero PC. In questo modo, il PC virtuale diventa un "guest" all'interno di un PC vero e proprio che con il suo sistema operativo, viene chiamato host.

Contenitore: è come sopra, ma invece di utilizzare un intero sistema operativo, ha ridotto i componenti "non necessari" del sistema operativo virtuale per crearne una versione minima. Questo ha portato alla creazione di LXC (Linux Containers), più veloce delle macchine virtuali.

Docker: un container Docker , a differenza di una macchina virtuale e di un container, non richiede né include un sistema operativo separato. Invece, si basa sulla funzionalità del kernel Linux e utilizza l'isolamento delle risorse.
Scopo di Docker: il suo obiettivo principale è automatizzare la distribuzione di applicazioni all'interno di contenitori software e l'automazione della virtualizzazione a livello di sistema operativo su Linux. È più leggero dei container standard e si avvia in pochi secondi. GGG

(Si noti che non è richiesto alcun SO Guest in caso di Docker)


1
Ho provato a cercare risorse per quanto riguarda il flusso di lavoro di sviluppo e distribuzione di Docker, ma non riesco a trovare nulla. Diamo ad esempio che ho un ambiente lampp con laravel + angular4. Condivido un determinato file con i miei compagni di squadra? Come modifico il sorgente dell'applicazione (php html js / ts) se lo metto in un contenitore? Possiamo ancora usare git / svn nel nostro codice sorgente?
anaval

13
VM sta per "Virtual machine". Non c'è bisogno di chiamarlo "VM Machine" perché poi diventa "Virtual machine machine". :)
Dzhuneyt

32

[Nota, questa risposta si concentra sui contenitori Linux e potrebbe non essere completamente applicabile ad altri sistemi operativi. ]

Cos'è un container?

È un'app : un contenitore è un modo per eseguire applicazioni isolate l'una dall'altra. Piuttosto che virtualizzare l'hardware per eseguire più sistemi operativi, i container si basano sulla virtualizzazione del sistema operativo per eseguire più applicazioni. Ciò significa che puoi eseguire più contenitori sullo stesso hardware rispetto alle VM perché hai solo una copia del sistema operativo in esecuzione e non è necessario preallocare la memoria e i core della CPU per ogni istanza della tua app. Proprio come qualsiasi altra app, quando un contenitore ha bisogno della CPU o della memoria, le alloca e quindi le libera al termine, consentendo ad altre app di utilizzare le stesse risorse limitate in un secondo momento.

Sfruttano gli spazi dei nomi del kernel : ogni contenitore per impostazione predefinita riceverà un ambiente in cui i seguenti sono spazi dei nomi:

  • Mount: filesystem, /nel contenitore sarà diverso /dall'host.
  • PID: ID processo, pid 1 nel contenitore è l'applicazione avviata, questo pid sarà diverso se visualizzato dall'host.
  • Rete: i contenitori vengono eseguiti con la propria interfaccia di loopback (127.0.0.1) e un IP privato per impostazione predefinita. Docker utilizza tecnologie come le reti bridge Linux per connettere più container insieme nella propria lan privata.
  • IPC: comunicazione tra processi
  • UTS: include il nome host
  • Utente: puoi opzionalmente spostare tutti gli ID utente in modo che vengano compensati da quello dell'host

Ognuno di questi spazi dei nomi impedisce inoltre a un contenitore di vedere cose come il filesystem o i processi sull'host o in altri contenitori, a meno che non rimuova esplicitamente quell'isolamento.

E altri strumenti di sicurezza di Linux : i contenitori utilizzano anche altre funzionalità di sicurezza come SELinux, AppArmor, Capabilities e Seccomp per limitare gli utenti all'interno del contenitore, incluso l'utente root, dalla possibilità di sfuggire al contenitore o avere un impatto negativo sull'host.

Creare un pacchetto delle app con le relative dipendenze per la portabilità : il confezionamento di un'applicazione in un contenitore implica l'assemblaggio non solo dell'applicazione stessa, ma di tutte le dipendenze necessarie per eseguire tale applicazione, in un'immagine portatile. Questa immagine è il filesystem di base utilizzato per creare un contenitore. Poiché stiamo isolando solo l'applicazione, questo filesystem non include il kernel e altre utilità del sistema operativo necessarie per virtualizzare un intero sistema operativo. Pertanto, un'immagine per un contenitore dovrebbe essere notevolmente più piccola di un'immagine per una macchina virtuale equivalente, rendendo più rapida la distribuzione ai nodi attraverso la rete. Di conseguenza, i contenitori sono diventati un'opzione popolare per la distribuzione di applicazioni nel cloud e nei data center remoti.

Può sostituire una macchina virtuale dedicata allo sviluppo?

Dipende : se il tuo ambiente di sviluppo esegue Linux e non hai bisogno di accedere ai dispositivi hardware, o è accettabile avere accesso diretto all'hardware fisico, allora troverai una migrazione a un contenitore Linux abbastanza semplice. L'obiettivo ideale per un contenitore Docker sono applicazioni come API basate sul Web (ad esempio un'app REST), a cui si accede tramite la rete.

Qual è lo scopo, in parole semplici, dell'utilizzo di Docker nelle aziende? Il vantaggio principale ?

Dev o Ops : Docker viene in genere portato in un ambiente in uno dei due percorsi. Sviluppatori che cercano un modo per sviluppare e testare localmente più rapidamente la loro applicazione e operazioni che cercano di eseguire più carico di lavoro su meno hardware di quanto sarebbe possibile con le macchine virtuali.

O Devops : uno degli obiettivi ideali è sfruttare Docker immediatamente dallo strumento di distribuzione CI / CD, compilare l'applicazione e creare immediatamente un'immagine che viene distribuita a sviluppo, CI, prod, ecc. I contenitori spesso riducono il tempo per spostare l'applicazione dal check-in del codice fino a quando non è disponibile per il test, rendendo gli sviluppatori più efficienti. E se progettata correttamente, la stessa immagine che è stata testata e approvata dagli sviluppatori e dagli strumenti CI può essere distribuita in produzione. Poiché quell'immagine include tutte le dipendenze dell'applicazione, il rischio di interruzioni nella produzione che hanno funzionato durante lo sviluppo sono notevolmente ridotti.

Scalabilità : un ultimo vantaggio chiave dei contenitori che menzionerò è che sono progettati per la scalabilità orizzontale in mente. Quando si dispone di app senza stato sotto carico pesante, i contenitori sono molto più facili e veloci da scalare in orizzontale grazie alle dimensioni dell'immagine più piccole e al ridotto overhead. Per questo motivo vedi che i contenitori vengono utilizzati da molte delle più grandi società basate sul Web, come Google e Netflix.


2
+1 Sono completamente d'accordo con la tua risposta, specialmente con la parte "può sostituire le macchine virtuali". Vedo molti commenti altrove che sottolineano che Docker non è una macchina virtuale, ma, per esperienza, per molti casi d'uso funziona altrettanto bene o è anche un'alternativa migliore. Ma cosa intendi quando hai detto "accettabile avere accesso diretto all'hardware fisico"?
Tyress

2
@tyress se il tuo host è Linux, puoi montare i dispositivi direttamente in un container Linux. L'ho visto fare con dispositivi audio, ma è possibile aggiungere qualsiasi cosa in / dev. Ciò aggira alcuni isolamenti del contenitore, ma ha senso per attività specifiche come le app desktop.
BMitch

è fantastico. Non ci ho pensato.
Tyress

@ BMitch: risposta molto pulita ed elegante, grazie !! Penso di poter ora visualizzare cos'è il container ... tuttavia, sarebbe fantastico se potessi aggiornare la tua risposta con come il container è correlato al docker? In confronto tra container e VM, docker è equivalente a hypervisor?
rahulaga_dev

1
Docker è uno strumento che implementa i contenitori, oltre a fornire il resto dell'ecosistema necessario come il registro su hub docker e ambienti desktop che incorporano una VM per eseguire contenitori Linux.
BMitch

6

Le stesse domande mi hanno colpito la testa alcuni giorni fa e quello che ho trovato dopo esserci entrato, capiamo in parole molto semplici.

Perché si dovrebbe pensare a docker e contenitori quando tutto sembra a posto con l'attuale processo di architettura e sviluppo dell'applicazione !!

Facciamo un esempio che stiamo sviluppando un'applicazione utilizzando i servizi nodeJs, MongoDB, Redis, RabbitMQ ecc [puoi pensare a qualsiasi altro servizio].

Ora affrontiamo le seguenti cose come problemi nello sviluppo di applicazioni e nel processo di spedizione se dimentichiamo l'esistenza di docker o altre alternative di containerizzazione delle applicazioni.

  1. Compatibilità dei servizi (nodeJs, mongoDB, Redis, RabbitMQ ecc.) Con il sistema operativo (anche dopo aver trovato versioni compatibili con il sistema operativo, se accade qualcosa di imprevisto relativo alle versioni, è necessario rileggere nuovamente la compatibilità e risolverlo).

  2. Se due componenti di sistema richiedono una libreria / dipendenza con versioni differenti nell'applicazione nel sistema operativo (che necessita di un nuovo sguardo ogni volta in caso di un comportamento imprevisto dell'applicazione a causa di problemi con la libreria e la versione della dipendenza).

  3. Ancora più importante, se una nuova persona si unisce al team, troviamo molto difficile configurare il nuovo ambiente, la persona deve seguire un ampio set di istruzioni ed eseguire centinaia di comandi per configurare finalmente l'ambiente E richiede tempo e impegno.

    Le persone devono assicurarsi di utilizzare la versione corretta del sistema operativo e verificare la compatibilità dei servizi con il sistema operativo e ogni sviluppatore deve seguirlo ogni volta durante la configurazione.

  4. Abbiamo anche diversi ambienti come sviluppo, test e produzione.Se uno sviluppatore è a suo agio nell'usare un sistema operativo e l'altro è a suo agio con un altro sistema operativo E in questo caso, non possiamo garantire che la nostra applicazione si comporterà allo stesso modo in queste due diverse situazioni .

Tutto ciò ci rende la vita difficile durante il processo di sviluppo , test e spedizione delle applicazioni.

Quindi abbiamo bisogno di qualcosa che gestisca il problema di compatibilità e ci consenta di apportare modifiche e modifiche a qualsiasi componente del sistema senza influire sugli altri componenti.

Ora pensiamo a docker perché il suo scopo è containerizzare le applicazioni e automatizzare la distribuzione delle applicazioni e spedirle molto facilmente.

inserisci qui la descrizione dell'immagine

Come docker risolve i problemi di cui sopra-

  1. Possiamo eseguire ogni componente del servizio (nodeJs, MongoDB, Redis, RabbitMQ) in diversi contenitori con le proprie dipendenze e librerie nello stesso sistema operativo ma con ambienti diversi.

  2. Dobbiamo solo eseguire la configurazione docker una volta, quindi tutti gli sviluppatori del nostro team possono iniziare con un semplice comando di esecuzione docker, abbiamo risparmiato molto tempo e sforzi qui :) .

Quindi i contenitori sono ambienti isolati con tutte le dipendenze e le librerie raggruppate insieme ai propri processi e interfacce di rete e montaggi .

Tutti i container utilizzano le stesse risorse del sistema operativo, pertanto richiedono meno tempo per l'avvio e utilizzano la CPU in modo efficiente con minori costi hardware.

Spero che questo possa essere utile.


2

Vorrei provare a fornire risposte il più semplici possibile:

Ma in effetti, non so qual è lo scopo di questo "contenitore"?

Cos'è un container?

In poche parole: un pacchetto contenente software . Più specificamente, un'applicazione e tutte le sue dipendenze sono raggruppate insieme. Un normale ambiente applicativo non dockerizzato è collegato direttamente al sistema operativo, mentre un contenitore Docker è un livello di astrazione del sistema operativo.

E un contenitore differisce da un'immagine in quanto un contenitore è un'istanza di runtime di un'immagine , simile a come gli oggetti sono istanze di runtime di classi nel caso in cui tu abbia familiarità con OOP.

Può sostituire una macchina virtuale dedicata allo sviluppo?

Sia le VM che i contenitori Docker sono tecniche di virtualizzazione, in quanto forniscono astrazione sull'infrastruttura di sistema.

Una VM esegue un sistema operativo "guest" completo con accesso virtuale alle risorse host tramite un hypervisor. Ciò significa che la VM spesso fornisce all'ambiente più risorse di quelle di cui ha effettivamente bisogno. In generale, le VM forniscono un ambiente con più risorse di quelle necessarie alla maggior parte delle applicazioni. Pertanto, i contenitori sono una tecnica più leggera. I due risolvono problemi diversi.

Qual è lo scopo, in parole semplici, dell'utilizzo di Docker nelle aziende? Il vantaggio principale?

La containerizzazione va di pari passo con i microservizi. I servizi più piccoli che compongono l'applicazione più grande vengono spesso testati ed eseguiti in contenitori Docker. Ciò semplifica i test continui.

Inoltre, poiché i contenitori Docker sono di sola lettura, applicano un principio DevOps chiave: i servizi di produzione dovrebbero rimanere inalterati

Alcuni vantaggi generali del loro utilizzo:

  • Ottimo isolamento dei servizi
  • Grande gestibilità poiché i contenitori contengono tutto ciò di cui l'app ha bisogno
  • Incapsulamento della tecnologia di implementazione (nei contenitori)
  • Utilizzo efficiente delle risorse (grazie alla virtualizzazione del sistema operativo leggero) rispetto alle VM
  • Distribuzione rapida
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.