Tutto il codice e l'applicazione di esempio necessari per questo tutorial è disponibile in:
https://github.com/saverioriotto/docker-tomcat-sample.git
Clona docker-tomcat-tutorial sul pc locale utilizzando i seguenti comandi:
$ git clone https://github.com/saverioriotto/docker-tomcat-sample.git
$ cd docker-tomcat-sample
$ ls
Dockerfile README.md docker.war
Una volta individuata l'immagine da utilizzare, possiamo scrivere un Dockerfile specificando l'immagine di base da utilizzare, la webapp da utilizzare, ecc.
Docker può creare immagini leggendo le istruzioni da un Dockerfile. Lo stesso contiene tutti i comandi che un utente può chiamare sulla riga di comando per assemblare un'immagine. Utilizzando la build docker, gli utenti possono creare una build automatizzata che esegue diverse istruzioni della riga di comando in successione.
Nel nostro caso andremo a scrivere le istruzioni che prevedono un'immagine con l'installazione di Tomcat 8 con JDK Amazon Corretto 11. La prima parte del Dockerfile la andiamo a prelevare dal portale dedicato Docker Hub scegliendo la versione a noi interessata per l'installazione dei middleware. La seconda parte che prevede le istruzioni da eseguire per configurare la nostra applicazione sono riportartate di seguto:
Il nostro semplice Dockerfile è il seguente:
$ cat Dockerfile
.
.
.
# L'istruzione LABEL imposta il campo Autore delle immagini generate.
LABEL maintainer="[email protected]"
# L'istruzione ADD copia nuovi file, directory o URL di file remoti e li aggiunge al filesystem dell'immagine nel percorso indicato. Nel nostro caso, stiamo aggiungendo la webapp di esempio posizionandola sotto la directory webapps di tomcat sul container.
ADD docker.war /usr/local/tomcat/webapps/
# L'istruzione EXPOSE informa Docker che il container è in ascolto sulle porte di rete specificate in fase di runtime.
EXPOSE 8080
# L'istruzione CMD specifica cosa eseguire quando viene eseguito il container (non l'immagine). Nel nostro caso, il server Tomcat viene avviato eseguendo lo script della shell che avvia il container web. Può esserci solo un'istruzione CMD in un Dockerfile.
CMD ["catalina.sh", "run"]
La build viene eseguita dal daemon Docker, non dalla CLI. Scarica tutte le immagini necessarie ed esegue anche i comandi specificati nel Dockerfile.
Nel comando seguente, viene utilizzato il Dockerfile creato in precedenza (il demone Docker cerca Dockerfile specificato dalla directory corrente utilizzando un punto) e l'immagine appena creata è contrassegnata con dockersample:0.0.1.
$ docker build -t dockersample:0.0.1 .
Se è la prima volta che lo esegui, potrebbero essere necessari alcuni minuti per completare il download dell'immagine Tomcat (e delle sue dipendenze).
Ora puoi verificare che l'immagine dockersample:0.0.1 sia costruita e pronta per essere utilizzata. Nota che a questo punto, hai solo costruito l'immagine, non c'è nessun contenitore in esecuzione.
$ docker image ls
La Docker CLI ha un comando chiamato run che avvierà un container basato su un'immagine Docker. La struttura è docker run.
Come accennato prima, l'istruzione EXPOSE nel Dockerfile non pubblica effettivamente sulla porta. In modo che durante l'esecuzione del contenitore, bisogna utilizzare il flag -p su docker run per pubblicare e mappare una o più porte.
Quindi, per mappare la porta del contenitore 8080 per l'immagine dockersample:0.0.1 sulla porta 8888 sulla macchina host, eseguiamo:
$ docker run -p 8888:8080 dockersample:0.0.1
Apri http://localhost:8888/ in un browser per vedere l'applicazione web in esecuzione.
Per impostazione predefinita, Docker eseguirà un comando in primo piano. Per essere eseguito in background, è necessario specificare l'opzione -d. In questo modo verrà restituito l'ID del contenitore che potrebbe essere utilizzato per altri comandi come di seguito.
$ docker run -d -p 8888:8080 dockersample:0.0.1
8e6e1c6b2ab8340a626ffdbf2e78252d861bd01d7f14da1b6d08c7530ebf5a11
Il comando docker inspect fornisce ulteriori dettagli su un container in esecuzione, come l'indirizzo IP.
Il comando docker log visualizzerà i messaggi che il contenitore ha scritto in standard error o standard out.
Il comando docker ps elenca tutti i container in esecuzione.
Conclusioni
Hai appena eseguito il tuo primo container Docker!
Ovviamente, Docker offre molto di più di questo semplice tutorial. In un modello reale, che si desidera che l'applicazione di esempio venga creata utilizzando Maven e inclusa nell'immagine, il Dockerfile avrebbe anche molte più istruzioni come la definizione delle variabili di ambiente, la copia dei file nei volumi Docker, ecc.