Introduzione a Docker e alla Dockerizzazione.
Filosofia e progettazione Docker
Comandi principali per gesitere immagini, container, volumi e reti
Dockerfile e docker-compose
Valerio Radice @ Nextre (Maggio 2017)
TAG: docker , Dockerfile , docker-compose , italian , nextre
6. 6
Questa domanda ha portati gli sviluppatori di
Google ad estendere il kernel di Linux con le
librerire cgroups, successivamente integrate
ufficialmente nel kernel linux.
Con cgroups, si ricrea un contesto di esecuzione
isolato, con un alto livello di astrazione, tanto da
imporsi come una sorta di sistema operativo
semplificato e virtualizzato che soggiace alla
base di tutte le applicazioni.
7. 7
DOCKER: cos'è
piattaforma open-source
per la creazione di
containers
portabili, leggeri, autosufficienti
per eseguire applicazioni
“Configure once... run everywhere!”
Documentazione
8. 8
La conteinerizzazione
può essere considerata figlia della
virtualizzazione
da cui si evolve in una nuova
generazione introducendo migliorie
9. 9
ü Replica ambiente di produzione
ü Modularità -> Scalabilità
ü Rapidità
ü Efficiente separazione dei servizi
ü Portabilità
ü Alta personalizzazione
DOCKER
10. 10
ü Containers
ü Immagini
ü Kernel condiviso
ü No hypervisor (niente overhead)
ü Performance migliori
ü Utilizzo solo delle risorse necessarie
DOCKER
17. 17
Ma i container possono dialogare
con i servizi offerti dalla
macchina che li ospita?
SI certamente, in ogni momento!
Vi è sempre condivisione di risorse
DOMANDA
18. 18
un deployment semplificato: impacchettando un’applicazione in un singolo
componente distribuibile e configurabile con una sola linea di comando, la
tecnologia a container permette di semplificare il deployment di qualsiasi
applicazione, senza doversi preoccupare della configurazione dell’ambiente
di runtime;
una disponibilità rapida: virtualizzando ed astraendo solo il sistema
operativo e le componenti necessarie all’esecuzione dell’applicazione, invece
che l’intera macchina, l’intero package si avvia in un ventesimo di secondo,
rispetto ai tempi di avvio di una VM;
BENEFICI
19. 19
un controllo più granulare: i container consentono agli operatori e agli
sviluppatori di suddividere ulteriormente le risorse computazionali in
microservizi, garantendo così un controllo superiore sull’eseguibilità delle
applicazioni e un miglioramento delle prestazioni dell’intero sistema.
l’amministrazione dei cicli di rilascio delle applicazioni è semplificato
basta pubblicare la nuova immagine docker e ricaricare il container per avere
tutto aggiornato (* salvare i dati volatili esternamente);
anche le attività di testing traggono un beneficio economico infatti il
testing avviene solo su container perchè la stessa situazione verrà ricreata sul
server.
BENEFICI
20. 20
CONTAINER
ü Pacchetto standardizzato contenente
software e dipendenze
ü Isola l'applicazione dal resto del
sistema
ü Condivide lo stesso kernel del
sistema operativo
ü Funziona sulla maggiorparte delle
distribuzioni linux
ü Nativo da Windows Server 2016
22. 22
WINDOWS
Installare su Windows 10 (Pro or Enterprise)
La miglior esperienza su Windows, sfortunatamente disponibile solo nelle
versioni Pro ed Enterprise.
Ti basterà installare il file di installazione della versione Docker
Community Edition (CE) per Windows disponibile sul Docker Store.
Installare su Windows 7, 8, o 10 Home Edition
Sfortunatamente nelle precedenti versioni di Windows non è disponibile,
nelle sue funzionalità complete, Hyper-V, così è necessario installare
Docker Toolbox, un approccio leggermente differente in quanto prevede
l'installazione di una macchina virtuale (VirtualBox VM) sul quale girerà
docker.
https://www.docker.com/docker-windows
Documentazione
23. 23
MAC
Installare su Mac OS X >= El Capitan
La miglior procedura per utilizzare Docker su un sistema MacOS è
l'installazione per Mac disponibile sul Docker Store.
Installare su Mac OS X <= Yosemite
Sfortunatamente nelle precedenti versioni di Mac il MacOS Hypervisor
framework non è pienamento integrato con Docker e risultanto
necessario installare Docker Toolbox, disponibile sul sito ufficiale di
Docker.
https://www.docker.com/docker-mac
Documentazione
24. 24
LINUX / UBUNTU
Installare su Linux (Kernel version >= 3.10)
La miglior procedura per utilizzare Docker su un sistema Linux è
installarlo da terminale con il comando:
curl -sSL https://get.docker.com/ | sh
Installare su Ubuntu (Kernel version >= 3.10)
Per la distribuzione Ubuntu è dedicata una pagina apposita dal quale è
possibile scaricare un pacchetto per l'installazione.
https://www.docker.com/docker-ubuntu
Documentazione
26. 26
VOCABOLARIO DOCKER
Docker Image
Rappresenta la base di un Docker container, contiene l'intera applicazione.
Docker Container
L'unità standard nella quale l'applicazione vive e viene eseguita.
Docker Engine
Il motore di Docker che organizza, avvia, ferma i container pemettendo la
comunicazione e la condivisione delle risorse tra macchine virtuali e host.
Registry Service
Il servizio, cloud o locale, dove si registrano e si distribuiscono le immagini
di Docker (Docker HUB o Docker Trusted Registry).
27. 27
CODE
I comandi di docker nel nuovo formato sono strutturati in:
docker <comandoPrincipale> <comandoSecondario> [parametri]
la lista dei comandi si può ottenere semplicimente col comando:
docker
la versione di docker installata sul sistema è ottenibile da:
docker version
oppure una versione semplificata:
docker -v
docker --version
Per avere informazioni sull'installazione di docker sulla macchina
docker info
28. 28
Le immagini sono costruite sui cambiamenti del file system,
generalmente da un'immagine di partenza, ed arricchite da
metadati.
Ogni modifica è contenuta in un “layer”, identificata da un
ID e salvate sull'host. la costruzione di un'immagine risulta
così un'operazione incrementale e quando caricherò sul
mio docker hub non dovrò ricaricare tutta l'immagine ma
solo le modifiche (layer).
IMAGE
29. 29
IMAGE: CODE
Per vedere le immagini in cache locale:
docker image ls
Per scaricare un'immagine dal docker hub:
docker pull <nomeImmagine>
Per cancellare un'immaigne:
docker image rm <nomeImmagine>
Per rimuovere le immagini non usate:
docker image prune
30. 30
IMAGE: CODE
Per assegnare un tag all'immagine:
docker image tag <nomeImmagine>[:TAG] <nomeImmagine>[:TAG]
Per vedere la storia di un'immagine:
docker image history <nomeImmagine>
Per vedere il contenuto/configurazione di un'immagine:
docker image inspect <nomeImmagine>
Per generare un container da un Dockerfile:
docker image build [options] <nomeImmagine>
32. 32
Il container è l'istanza di un'immagine, il suo stato
può essere salvato, tuttavia per il corretto
disaccoppiamento tra ambiente e persistenza dei
dati è opportuno creare dei volumi dedicati.
Inizialmente il container è la copia di un'immagine,
fino alla prima modifica, successivamente l'immagine
verrà copiata e resa disponibile all'istanza di quel
container, lasciando inalterata l'immagine.
Proprio per la natura effimera del container è
opportuno non salvare nulla all'interno di esso, si
adotta il principio di Separation of concerns.
CONTAINER
33. 33
CONTAINER: CODE
Comando principale per gestire i container:
docker container <comandoPrincipale>
Per vedere i container attivi:
docker container ls
e tutti quelli sulla macchina:
docker container ls -a
Tutti i comandi:
docker container --help
34. 34
CONTAINER: CODE
Creare un container da un'immagine:
docker container run [-v,-d,-p, options] <nomeImmagine>
Parametri principali:
-p <portaHost>:<portaContainer> = espone una porta
-d = detached mode (resta attivo in background)
-v <nomeVolume>:<percorsoNelContainer> = Assegna un volume definito
-rm = non lascia traccia del container al termine
Per trasformare un container in una nuova immagine:
docker container commit [options] <nomeContainer | ID> <nomeImmagine>
Per esporre più volte lo stesso servizio, da docker diverse, basta esporle solo sulla
porta esterna
35. 35
CONTAINER: CODE
Per avviare un'immagine ed entrare nel suo terminale:
docker run -it <nomeImmagine> bash
Per entrare nella shell di un container già avviato:
docker container exec -it <nomeContainer> <bash|sh>
-i = interactive mode
-t = allocate pseudo-TTY terminal
Per vedere le porte condivise tra host e container:
docker container port <nomeContainer>
Per generare un container da un template (Dockerfile) usare
docker image build -t <NomeImmagine> .
-t = specifica il nome dell'immagine, il punto indica di caricare
dal path corrente il Dockerfile (scritto con la D maiuscola!)
es: docker build -t wget
36. 36
I container sono solitamente immutabili ed effimeri, ma come fare a
mantenere le informazioni nel tempo?
Esempio
Come faccio a persistere i dati di un database che lavora in un container?
Persistent data
2 modi per farlo:
- Volumes
- Bind Mounts ( link container path to host path )
https://docs.docker.com/engine/tutorials/dockervolumes
DOMANDA
38. 38
PERSISTENT DATA: Volumes
E' un luogo speciale al di fuori del file system del container in uso
Esempio, salvare il db di un container mysql
docker pull mysql
docker image inspect mysql
#genera un volume
docker container run -d --name mysqltest -e
MYSQL_ALLOW_EMPTY_PASSWORD=True mysql
- docker container inspect mysqltest
#scopro che volumi sono presenti sul mio sistema
docker volume ls
#controllo cosa contiene il volume di mysqltest
docker volume inspect <id_volume | volume_name>
Nei sistemi linux i file sono archiviati direttamente su disco e non si perdono
quando si cancella il container. Nei sistemi Win e Mac questi sono archiviati
dentro la macchina virtuale di Docker.
39. 39
VOLUME
Creare un volume:
docker volume create <volumeName>
Elencare i volumi sulla macchina:
docker volume ls
Eliminare i volumi non usati:
docker volume prune
Eliminare un volume:
docker volume rm
Ottenere dettagli sul volume:
docker volume inspect <volumeName | ID>
40. 40
Named Volumes è un sistema per ricordarsi facilmente i volumi
assegnandogli un nome.
Per creare un volume prima di creare un container fare:
docker volume create -d <nomeVolume>
docker container run -v <nomeVolume>:<percorsoNelContainer>
<nomeImmagine>
esempio:
docker container run -d --name mysqltest -e
MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql
VOLUME
43. 43
PERSISTENT DATA: bind
E' un metodo per linkare una cartella sulla macchina host in un path del
container.
Può essere effettuato solo durante la generazione del container e non nel
Dockerfile.
Tutti i file presenti nel container verranno sovrascritti dai file condivisi con la
macchina host.
Esempio
docker run -p 80:4000 -v $(pwd):/site bretfisher/jekyll-serve
Windows
docker run -p 80:4000 -v //c/example/bind:/site bretfisher/jekyll-
serve
PWD is a environment variable in bash and other shells, which is updated by the
shell on cd. So when you do echo $PWD, shell replaces $PWD as whatever its
currently storing. $XYZ means a variable for the shell, and PWD is a varibale which it
itself does create, while there is no such $pwd present.
46. 46
NET: CODE
Con docker è possibile dividere ulteriormente i container con l'utilizzo di reti
virtuali dedicate, ciò è reso possibile da un substrato che simula una rete di
default tra la macchina host ed i container (Documentazione).
La rete di default per i container, se non diversamente specificato, sarà “bridge”
(docker0).
Per vedere le reti presenti sulla macchina:
docker network ls
Per creare una rete in fase di run usare l'attributo network:
docker run --network=<nomeRete> [parametri] <nomeImmagine>
Per vedere i comandi possibili per network vedere la guida:
docker network help
I container possono collegarsi e scollegarsi dalla rete in qualsiasi momento
47. 47
NET: CODE
Per creare una rete in fase di run usare l'attributo network:
docker network create [parametri] <nomeRete>
Per ispezionare una rete usare:
docker network inspect <nomeRete>
48. 48
NET: BRIDGE & PORT MAPPING
Per creare una rete usare il comando network create:
docker network create [parametri] <nomeRete>
Per ispezionare una rete usare:
docker network inspect <nomeRete>
50. 50
Dockerfile
Il Dockerfile è un file ben preciso che ci permette di creare un'immagine,
eseguendo una serie di comandi ben precisi, specificando eventualmente delle
opzioni, che risulterebbero scomode
da scrivere su una sola riga in console.
ü Istruzioni su come creare un'immagine
ü Ottimizare operazioni sulla
configurazione dell'immagine
ü Utilizzo di comandi nativi
Documentazione & best practice
> docker image build -t demo1 .
> docker run -d -p 3000:3000 demo1
51. 51
DOCKER-COMPOSE
Il docker-compose.yml è un file ben preciso, scritto in
yaml, che ci permette di creare un ambiente operativo
a partire da uno o più container.
Permette il settaggio di:
ü variabili
ü variabili d'ambiente
ü porte
ü referenze ad altri container
ü volumi
ü reti
Ci sono diverse versioni, consigliata minimo la v2
Documentazione & versioni
56. 56
DOCKER REGISTRY
Il Docker registry è un repository, pubblico o privato, per il versionamento delle
immagini.
L'archiviazione è affidata ad un driver di connessione remota con l'host che
archivierà i contenuti. I registry non sono solo quelli di docker hub ma anche S3,
Amazon, Azure, OpenStack e molti altri.
ü Soluzione rapida per fare il deploy su un proprio cluster.
ü Miglior soluzione per la distribuzione di un immagine in un contesto isolato
Documentazione
“A Docker registry stores Docker images. Docker Hub and Docker
Cloud are public registries that anyone can use, and Docker is
configured to look for images on Docker Hub by default. You can
even run your own private registry. If you use Docker Datacenter
(DDC), it includes Docker Trusted Registry (DTR).”
57. 57
DOCKER HUB
Il Docker hub è il luogo (repository) pubblico dove vengono caricate le immagini
che genereranno i nostri container.
Si possono trovare le immagini dei più diffusi software per lo sviluppo web e
database.
Sono presenti immagini di web server (apache, nginx, ecc... ) con preconfigurato
il supporto a diversi linguaggi di programmazione (php, ruby, python ecc... ).
Oltre alla immagini ufficiali sono presenti numerose immagine degli utenti, che,
come per github, possono caricare liberamente le loro creazioni e condividerle
con la community.
Ogni utente iscritto ottiene un proprio ID detto anche Docker ID.
58. 58
DOCKER HUB
Ogni utente può caricare le proprie immagini sul docker hub.
Le sue immagini vengono identificate con:
<dockerID>/<nomeImmagine>:<tagVersion>
La CLI mette a disposizione dei comandi per gestire direttamente il docker hub
da console, tra cui: docker search , docker pull , docker login e docker
push.
Esempio di account:
https://hub.docker.com/r/_/wordpress/
Docker HUB & documentazione
60. 60
Dubbi o domande?
Il mio contatto diretto: valerio.radice@nextre.it
GRAZIE per l'attenzione
61. 61
BIBLIOGRAFIA & CREDITS
Special thanks to all the people who made and released these awesome
resources for free:
▸ Docker - Official Docs
▸ Docker (Windows)
▸ Docker 101
▸ Docker & Microservices
▸ Registry
▸ www.play-with-docker.com
▸ courses/try-docker
▸ Docker@youtube