Ciao, sono Alessandro Accardo, forse vi ricorderete di me per un altro Learning Friday sul framework Spring.
Ecco chi sono.
Docker è un software, innanzi tutto. Viene usato come sinonimo di container, per quanto i container non siano effettivamente nati con esso.
Alla base di questa tecnologia c'è una tecnica chiamata sandboxing.
Spesso, molto (troppo) spesso, i container vengono paragonati alle VM, macchine virtuali, quando invece poco e male si accostano tra loro, per quanto comunque le sandbox effettivamente virtualizzano, ma a livello di sistema operativo e non a livello hardware (quindi due livelli sotto).
Ma veniamo al punto: cos'è, a questo punto, un container?
Andando un po' indietro con la storia, il trascorso di queste tecnologie non è di certo nuovo. Troviamo degli embrioni di quello che oggi è un container addirittura in Unix.
Questi proto-container (perdonate la bestemmia) erano già chiamati sandbox, sostanzialmente degli userspace isolati tra loro a cui il sistema operativo fornisce risorse distribuendole (più o meno) equamente.
I casi più notevoli sono la chroot di Unix 7, la jail di BSD prima e di Linux dopo e le Zone di solaris.
A un certo punto, il kernel Linux tira fuori una tecnologia chiamata LXC, linux containers, e su questa è stato sviluppato Docker, che inizialmente (nel 2008!) era uno script python.
Una volta capito a grandi linee cos'è Docker e da dove viene la domanda spontanea è: perché.
Quale problema risolve Docker? Per quale motivo è stato sviluppato? E perché ora è così popolare?
L'industria del software è cambiata.
Proprio per la velocità di produzione richiesta attualmente è diventato indispensabile efficientare il ciclo che va dalla scoperta della necessità di una feature alla sua messa in produzione.
Inoltre, i sistemi di oggi sono molto complessi proprio per supportare un sempre maggiore numero di requisiti. Questo rende necessaria l'installazione di diverse componenti software da dover gestire contemporaneamente.
Veniamo alla parte importante: come funziona, internamente, Docker?
Il Docker Engine, o più comunemente Docker, si compone principalmente dei seguenti componenti:
C'è molta confusione sui nomi, e l'idea qui è quella di ridurre al minimo la frizione esplicitandoli per bene.
Bootfs è il filesystem messo a disposizione dal kernel Linux come base per uno userspace isolato LXC, o linux container.
Su questo componente del sistema operativo si costruisce l'immagine di base, che di solito è una distribuzione linux, o in generale una distribuzione di software di base (molto, molto base).
Una Docker Image si compone di diversi strati, o layer. Ogni strato si poggia sui precedenti andando ad aggiungere qualcosa allo userspace finale che costituirà poi l'immagine usata quando si crea un container.
Alla fine (o in cima, a seconda della prospettiva) della catena troviamo il container, cioè l'aggeggio dentro cui poter eseguire software che sarà a quel punto isolato dal resto del sistema operativo.
I container possono essere usati per i più vari utilizzi, si pensi a software come browsh che non offre un servizio, ma un normale software nel suo ambiente protetto di esecuzione.
Questo di seguito è l'esempio di un dockerfile, commentiamolo insieme.
FROM ubuntu:18.04 MAINTAINER klez@pm.me RUN apt-get update && apt-get install -y mongodb && apt-get install nano # Create the MongoDB data directory RUN mkdir -p /data/db # Expose port #37017 from the container to the host EXPOSE 37017 #Start MongoDb CMD ["mongod", "-f", "/etc/mongodb.conf"]
Grazie a tutti per essere arrivati fin qui!