Un Dockerfile è un file di testo che definisce passo dopo passo come creare un’immagine Docker personalizzata, partendo da un’immagine già esistente.
Contiene una sequenza ordinata di istruzioni che descrivono in modo chiaro come deve essere costruita l’immagine permettendo di ottenere sempre lo stesso risultato in maniera ripetibile, coerente e automatizzabile.
In questo modo la creazione delle immagini non è manuale o improvvisata, ma documentata, tracciabile nel tempo e facilmente integrabile in processi di automazione.
Creiamo un esempio di un’immagine Docker che avvia un server web Nginx e pubblica una pagina HTML personalizzata.
frank@debian:~$ mkdir docker-web
frank@debian:~$ cd docker-web
Ora creiamo un file index.html che verrà servito da Nginx:
frank@debian:~/docker-web$ nano index.html
<h1>Ciao dal mio container Docker</h1>
<p>Questa pagina è servita da Nginx in un container</p>
Nella stessa cartella creiamo il file Dockerfile:
frank@debian:~/docker-web$ nano Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
In questo esempio:
- FROM (punto di partenza): definisce l’immagine di base. Qui partiamo da nginx:alpine una versione leggera di Nginx.
- COPY (inserimento file): copia file o directory dalla macchina locale dentro l’immagine. In questo caso copiamo la nostra pagina index.html nella directory pubblica di Nginx.
- EXPOSE (rete): dichiara la porta usata dall’applicazione all’interno del container. Qui Nginx usa la porta 80.
- CMD (avvio): definisce il comando predefinito eseguito all’avvio del container. Qui avviamo Nginx in foreground così il container resta attivo.
- CMD definisce il comando predefinito. È un comportamento di default: se l’utente avvia il container specificando un comando diverso quello di CMD viene sostituito.
- ENTRYPOINT definisce il comando principale quello che identifica il container come applicazione. In questo caso, ciò che l’utente passa a docker run viene interpretato come argomento del comando non come sostituzione.
frank@debian:~/docker-web$ docker build -t myweb:1.0 .
Il punto finale indica la directory corrente: Docker leggerà il Dockerfile e i file presenti in quella cartella come index.html.
Avviamo il container e pubblichiamo la porta 80 del container sulla porta 8080 dell’host:frank@debian:~/docker-web$ docker run -d -p 8080:80 --name web_test myweb:1.0
- -d avvia il container in background
- -p 8080:80 collega la porta 8080 dell’host alla porta 80 del container
- --name assegna un nome leggibile al container
frank@debian:~/docker-web$ curl http://localhost:8080
<h1>Ciao dal mio container Docker</h1>
<p>Questa pagina è servita da Nginx in un container</p>
Verificare che il container sia in esecuzione:
frank@debian:~/docker-web$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59f3b13dfbdb myweb:1.0 "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp web_test
Vedrai il container web_test in stato Up e la mappatura porte 0.0.0.0:8080->80/tcp


