Docker e la gestione dei Container

Logo di Docker

Con questo articolo faremo un'introduzione a Docker, quello che viene considerato da tanti come l’arma definitiva del sysadmin, superando la virtualizzazione tradizionale.

Docker è uno strumento che ha, come scopo principale, quello di rendere più facile la creazione, il deploy e l’esecuzione di applicazioni utilizzando i container.

Per capire il successo che ha avuto negli ambienti di sviluppo basta pensare che su GitHub ci sono più di 1600 contributori tra programmatori, supporter e altro.

I container

Partiamo da un concetto base: cosa sono i container? Un container è un’applicazione isolata (con tutte le sue dipendenze) eseguita in namespace separati (network namespace, file system, users, IPC).
I container condividono il kernel della macchina host (ovvero la macchina dove vi è allocato) e non hanno uno strato di virtualizzazione tramite hypervisor.
E’ possibile creare un container, come vedremo, partendo da template di filesystem basati sulle distribuzioni più diffuse (per esempio CentOS, Ubuntu, Debian, ecc) e importarvi i relativi binari. I container non hanno un init e quindi non eseguono servizi.
A un container possiamo passare variabili di ambiente e possiamo effettuare, se necessario, il mapping di porte e cartelle.
Da quello che abbiamo detto sopra possiamo capire che un container consente a uno sviluppatore di pacchettizzare un'applicazione con tutte le parti necessarie (per esempio le librerie e altre risorse correlate) e consegnarla appunto come un unico pacchetto che potrà girare, per esempio, su qualsiasi macchina Linux, indipendentemente dalle impostazioni della macchina stessa. In questo modo gli sviluppatori non dovranno più preoccuparsi del sistema su cui andrà a girare il codice che scrivono.

Docker si avvicina al concetto di Virtual Machine, ma non è una Virtual Machine. Per capire in modo semplice la differenza basta guardare questa immagine.

Docker vs Virtual Machine

Al contrario di una virtual machine (che crea un intero sistema operativo virtuale), Docker consente alle applicazioni di usare lo stesso kernel Linux del sistema host su cui stanno girando e richiede soltanto che le applicazioni vengano consegnate senza elementi che risiedano già sulla macchina che le ospita. Per questo motivo i vantaggi più grandi di Docker sono la riduzione dello spazio occupato dall'applicazione, l'aumento delle prestazioni e l'isolamento.
L'isolamento porta una maggior sicurezza alle applicazioni che girano in un ambiente condiviso. Da ricordare bene però che i Container non sono un'alternativa alle misure appropriate di sicurezza!
Altra caratteristica importante di Docker è che è Open Source: chiunque può contribuire a Docker ed estenderlo per andare a coprire esigenze e bisogni aggiuntivi non ancora implementati e condividere le immagini dei container su GitHub, su hub.docker.com o su altri repository.

Funzionamento di base di Docker

Docker è un insieme di tecnologie che cooperano tra loro al fine di standardizzare il formato dei container e avere un insieme di tool (per lo più di sviluppi) standard e funzionanti che permettono di avere la piena portabilità e poter eseguire i container su diverse piattaforme e host.
Le componenti principali di Docker sono:

  • il Docker engine, che è un demone che risiede sul server e accetta comandi da un client (sia da riga di comando sia da chiamate alle API). Esso comunica con il Kernel Linux attraverso la libreria libcontainer (che viene installata insieme a docker).
  • il registry, che è una piattaforma che risiede nel cloud e che fornisce un’area dove caricare, scaricare e condividere le immagini dei vari container. Quella ufficiale è https://hub.docker.com/
    Supponiamo di voler utilizzare un container con una determinata immagine. Grazie a queste due componenti il cliente chiede al server di prendere quella immagine e “iniettarla” in un container. Il server, se non possiede ancora l’immagine richiesta, contatta il registry. Se esiste nel cloud la scarica e viene creata una copia cache locale. Dopo la inietta in un container.

docker-container_lib

Installazione e comandi principali

L’installazione base di Docker è molto semplice, per esempio su Ubuntu basta lanciare il seguente comando, come utente root (anche i successivi comandi dovranno essere lanciati come root):

apt-get install docker-engine

Mentre su distribuzioni in RHEL/CentOS il comando è

yum install docker

o, nel caso di Fedora 22+,

dnf install docker

Una volta installato bisogna far partire il servizio del docker. Su Ubuntu il comando è il seguente:

service docker start

mentre su RHEL/CentOS sono questi:

systemctl enable docker
systemctl start docker

Vediamo adesso una serie di comandi (per semplicità solo su Ubuntu, per le altre distribuzioni o sistemi operativi basta consultare la documentazione su https://docs.docker.com/) da utilizzare per poter utilizzare Docker e i container.

Per verificare se docker è stato installato correttamente possiamo lanciare il classico "Hello World":

docker run hello-world

Per stoppare il servizio di docker:

service docker stop

Per cercare un'immagine in Docker Hub:

docker search nome_immagine

Per scaricare un'immagine da Docker Hub:

docker pull nome_immagine

Per scaricare un'immagine da un repository di Docker Hub:

docker pull nome_repository/nome_immagine

Nei due comandi precedenti si vuole scaricare un'immagine ma non abbiamo indicato il tag, così viene presa l'ultima versione presente dell'immagine. L'uso dei tag viene altamente consigliato perché sono utili soprattutto per l'isolamento e il packaging.

Il comando con indicazione anche del tag diventa per esempio:

docker pull ventus85/tomcat:8.0.32

Per visualizzare l'elenco delle immagini presenti sulla macchina host:

docker images

Per avviare un nuovo container interattivo che usa la relativa immagine e avvia un terminale all'interno del nuovo container:

docker run parametri --name nome_container nome_immagine:tag

Per esempio se vogliamo avviare il container per tomcat e vogliamo che utilizzi una determinata porta è necessario fare un forwarding. Per fare la mappatura delle porte si usa il parametro "p" mentre per mappare una cartella il parametro è "v".

docker run -it -d --name tomcat -p 8080:8080 -v /home/myApp/tomcat:/usr/local/tomcat/log ventus85/tomcat:8.0.32

Quando viene avviato un container esso eseguirà un eventuale entry point (ovvero un file chiamato docker-entrypoint.sh).

Per avere l'elenco dei container presenti (se aggiungiamo l'opzione -a mostra solo quelli attivi):

docker ps -a

L'elenco dei contanier contiene:

  • l'id del container
  • il nome del container
  • il nome dell'immagine
  • il comando per avviarlo
  • quando è stato creato
  • lo stato (per esempio se è "up")
  • le eventuali porte mappate

Se invece vogliamo eseguire un comando su un container che vogliamo eseguire:

docker exec [OPTIONS] nome_container comando [ARG...]

Se per esempio vogliamo aprire una shell per poter usare il container con Oracle:

docker exec -it oracle bash

Per rimuovere un container:

docker rm id_container

Per rimuovere l'immagine:

docker rmi nome_immagine

Per stampare un file di log del container:

docker logs nome_container

Per avere le informazioni del container (vengono restituite in formato json):

docker inspect nome_container

Per fare un commit (ovviamente in locale) sulle eventuali modifiche effettuate sul container:

docker commit nome_container nome_immagine

Questa operazione è utile nel caso si voglia creare una nuova immagine con, per esempio, delle impostazioni diverse rispetto alla precedente.

Dockerfile

Oltre a usare il comando commit per customizzare le nostre immagini e i nostri container è possibile usare il Dockerfile. Esso è un file che crea l'immagine di cui abbiamo bisogno a partire da un'immagine di partenza. Contiene i passaggi da eseguire con il build. La sintassi del docker file è scritta in Ruby più i classici comandi bash.

Una volta creato il nostro Dockerfile (oppure modificato uno scaricato), il passo successivo è quello di effettuare il build con un comando come il seguente:

docker build -t ventus85/tomcat:8.0.32

Dopo possiamo includerlo, per esempio, nel repository del nostro progetto.

Questo è un esempio di un semplicissimo DockerFile.

# A very rudimentary mysql service
FROM ubuntu:12.04

ADD ./mysql-setup.sh /tmp/mysql-setup.sh
RUN /bin/sh /tmp/mysql-setup.sh
COPY docker-entrypoint.sh /

ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 3306
CMD ["/usr/sbin/mysqld"]

La prima istruzione (che non sia un commento) deve essere "FROM" e dobbiamo indicare l'immagine di base da cui stiamo costruendo il nostro file. Le righe che iniziano con il simbolo "#" sono commenti. Se il marcatore "#" è invece all'interno della riga esso sarà trattato come un argomento.  RUN esegue i comandi, mentre EXPOSE viene usato per specificare quali porte sono da esporre all'esterno per la reperibilità dei servizi in esecuzione all'interno del container.

Sul sito di Docker vengono indicate le "best practices" per i Dockerfile.

DockerHub

Come abbiamo già detto, DockerHub è il servizio in cloud che contiene i repository per Docker. Per poter utilizzarlo devi andare su https://hub.docker.com/ e creare un'account.

Una volta creato il proprio account possiamo iniziare a creare il nostro personale repository (o anche più di uno). Per farlo basta seguire queste istruzioni:

  1. fare l'accesso al sito
  2. sceglere il bottone "Create Repository"
  3. scegliere un namespace, un nome (deve essere univoco, da due a 255 caratteri e può contenere solo lettere minuscole, numeri oppure i caratteri "-" e "_"). Possiamo scegliere anche di inserire una descrizione del nostro repository e modificarne la visibilità (che può essere privata o pubblica).
  4. Cliccare sul pulsante "Create".

Una volta creato compariranno le informazioni sul repository creato, si potrà invitare a collaborare anche altri utenti. Nella pagina viene inoltre indicato anche il comando per fare il pull che può essere (come abbiamo visto):

docker pull ventus85/myrepository_01

Una volta creato il repository possiamo aggiungere tutte le nostre immagini per i container, semplicemente facendo l'upload del file.

 

 

ventus85

Ingegnere informatico (del genere femminile) conosciuta nel web con il nickname “ventus85”. Sempre pronta a scroprire le nuove tecnologie e a studiare l’evoluzione informatica.

Docker e la gestione dei Container ultima modifica: 2016-11-14T23:42:57+00:00 da ventus85


Advertisment ad adsense adlogger