Programma
L'esperienza pratica è essenziale per padroneggiare Docker. Docker è uno strumento fondamentale nello sviluppo software moderno e nella data science: ti permette di creare, distribuire e gestire applicazioni in container.
In questo articolo, ti propongo esempi di progetti Docker per principianti, intermedi ed esperti, con focus su multi-stage builds, ottimizzazione delle immagini Docker e uso di Docker nella data science. Questi progetti sono pensati per approfondire la tua comprensione di Docker e migliorare le tue competenze pratiche.
Primi passi con i progetti Docker
Prima di iniziare con i progetti, assicurati di avere Docker installato sulla tua macchina. In base al tuo sistema operativo (Windows, macOS, Linux), puoi scaricare Docker dal sito ufficiale di Docker.
Ti servirà anche una conoscenza di base di:
- Dockerfile (per definire cosa c'è nei tuoi container)
- Docker Compose (per applicazioni multi-container)
- Comandi CLI di base come
docker build,docker run,docker-compose up, ecc.
Se vuoi ripassare i concetti sopra, dai un'occhiata al corso Introduction to Docker o a Containerization and Virtualization Concepts.
Iniziamo!
Progetti Docker per principianti
Quando inizi con Docker, è importante scegliere progetti alla tua portata che allo stesso tempo ti spingano a imparare nuovi concetti. Ecco alcune idee per cominciare:
Progetto 1: Configurare un semplice server web
In questo progetto creerai un container Docker che esegue un web server di base con Nginx. Nginx è uno dei server web open source più popolari per reverse proxy, bilanciamento del carico e altro. Alla fine del progetto avrai imparato a creare ed eseguire container con Docker ed esporre porte in modo che l'applicazione sia accessibile dalla tua macchina locale.
Livello di difficoltà: Principiante
Tecnologie utilizzate: Docker, Nginx
Istruzioni passo passo
- Installa Docker: assicurati che Docker sia installato sul tuo sistema.
- Crea la directory del progetto: crea una nuova cartella e un file
index.htmlal suo interno che verrà servito da Nginx. - Scrivi il Dockerfile: un Dockerfile è uno script che definisce l'ambiente del container. Indica a Docker quale immagine base usare, quali file includere e quali porte esporre:
FROM nginx:alpine
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
- Crea l'immagine Docker: vai nella cartella del progetto e costruisci l'immagine usando:
docker build -t my-nginx-app .
- Esegui il container: avvia il container e mappa la porta 80 del container sulla porta 8080 della tua macchina:
docker run -d -p 8080:80 my-nginx-app
- Accedi al server web: apri il browser e vai su http://localhost:8080 per vedere la pagina creata.
Progetto 2: Dockerizzare uno script Python
Questo progetto consiste nel containerizzare un semplice script Python che elabora dati da un file CSV usando la libreria pandas. L'obiettivo è imparare a gestire le dipendenze ed eseguire script Python all'interno di container Docker, rendendo lo script portabile ed eseguibile in qualsiasi ambiente.
Livello di difficoltà: Principiante
Tecnologie utilizzate: Docker, Python, pandas
Istruzioni passo passo
- Scrivi lo script Python: crea uno script chiamato
process_data.pyche legge ed elabora un file CSV. Ecco un esempio:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.describe())
- Crea un file
requirements.txt: questo file elenca le librerie Python necessarie allo script. In questo caso ci serve solopandas:
pandas
- Scrivi il Dockerfile: questo file definirà l'ambiente per lo script Python:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "process_data.py"]
- Crea l'immagine Docker:
docker build -t python-script .
- Esegui il container:
docker run -v $(pwd)/data:/app/data python-script
Progetto 3: Creare una semplice applicazione multi-container
Questo progetto ti aiuterà a prendere confidenza con Docker Compose costruendo un'applicazione multi-container. Creerai una semplice applicazione web usando Flask come frontend e MySQL come database backend. Docker Compose ti permette di gestire più container che lavorano insieme.
Livello di difficoltà: Principiante
Tecnologie utilizzate: Docker, Docker Compose, Flask, MySQL
Istruzioni passo passo
- Scrivi l'applicazione Flask: crea una semplice app Flask che si connette a un database MySQL e visualizza un messaggio. Ecco un esempio:
from flask import Flask
import mysql.connector
app = Flask(__name__)
def get_db_connection():
connection = mysql.connector.connect(
host="db",
user="root",
password="example",
database="test_db"
)
return connection
@app.route('/')
def hello_world():
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute("SELECT 'Hello, Docker!'")
result = cursor.fetchone()
connection.close()
return str(result[0])
if __name__ == "__main__":
app.run(host='0.0.0.0')
- Crea il file
docker-compose.yml: Docker Compose definisce ed esegue applicazioni Docker multi-container. In questo file definirai i servizi dell'app Flask e del database MySQL:
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
environment:
FLASK_ENV: development
volumes:
- .:/app
volumes:
db_data:
- Scrivi il Dockerfile per Flask: creerà l'immagine Docker per l'applicazione Flask:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
- Crea ed esegui i container: usa Docker Compose per avviare l'intera applicazione:
docker-compose up --build
- Accedi all'app Flask: Vai su http://localhost:5000 nel browser.
Progetti Docker di livello intermedio
I seguenti progetti sono per chi ha una solida comprensione delle basi di Docker. Introdurranno concetti più complessi, come i multi-stage build e le tecniche di ottimizzazione.
Progetto 4: Multi-stage build per un'applicazione Node.js
I multi-stage build aiutano a ridurre le dimensioni delle immagini Docker separando gli ambienti di build e runtime. In questo progetto containerizzerai un'applicazione Node.js usando i multi-stage build.
Livello di difficoltà: Intermedio
Tecnologie utilizzate: Docker, Node.js, Nginx
Istruzioni passo passo
- Crea una semplice app Node.js: scrivi un server Node.js di base che restituisca un semplice messaggio. Ecco un esempio:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello from Node.js'));
app.listen(3000, () => console.log('Server running on port 3000'));
- Scrivi il Dockerfile con multi-stage build: la prima fase compila l'app, la seconda la esegue con un'immagine base più leggera.
# Stage 1: Build
FROM node:14 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Add the following line if there's a build step for the app
# RUN npm run build
# Stage 2: Run
FROM node:14-slim
WORKDIR /app
COPY --from=build-stage /app .
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]
- Crea l'immagine:
docker build -t node-multi-stage .
- Esegui il container:
docker run -p 3000:3000 node-multi-stage
Progetto 5: Dockerizzare un modello di machine learning con TensorFlow
Questo progetto prevede la containerizzazione di un modello di machine learning usando TensorFlow. L'obiettivo è creare un ambiente portabile in cui eseguire modelli TensorFlow su vari sistemi senza preoccuparti della configurazione sottostante.
Livello di difficoltà: Intermedio
Tecnologie utilizzate: Docker, TensorFlow, Python
Istruzioni passo passo
- Installa TensorFlow in uno script Python: crea uno script Python
model.pyche carica ed esegue un modello TensorFlow pre-addestrato:
import tensorflow as tf
model = tf.keras.applications.MobileNetV2(weights='imagenet')
print("Model loaded successfully")
- Scrivi il Dockerfile: definisci l'ambiente per TensorFlow dentro Docker:
FROM tensorflow/tensorflow:latest
WORKDIR /app
COPY . .
CMD ["python", "model.py"]
- Crea l'immagine:
docker build -t tensorflow-model .
- Esegui il container:
docker run tensorflow-model
Progetto 6: Creare un ambiente di data science con Jupyter e Docker
Questo progetto si concentra sulla creazione di un ambiente di data science riproducibile usando Docker e i notebook Jupyter. L'ambiente includerà librerie Python popolari come pandas, NumPy e scikit-learn.
Livello di difficoltà: Intermedio
Tecnologie utilizzate: Docker, Jupyter, Python, scikit-learn
Istruzioni passo passo
- Crea il file
docker-compose.yml: definisci il servizio Jupyter Notebook e le librerie necessarie. Ecco un esempio:
version: '3'
services:
jupyter:
image: jupyter/scipy-notebook
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/joelwembo/work
- Avvia Jupyter Notebook: usa Docker Compose per avviare Jupyter Notebook.
docker-compose up
- Accedi a Jupyter Notebook: apri il browser e vai su http://localhost:8888.
Progetti Docker di livello avanzato
Questi progetti avanzati si concentrano su applicazioni reali e concetti Docker evoluti, come pipeline di deep learning e pipeline di dati automatizzate.
Progetto 7: Ridurre le dimensioni di un'immagine Docker per un'applicazione Python
In questo progetto ottimizzerai un'immagine Docker per un'applicazione Python usando immagini base minimali come Alpine Linux e implementando multi-stage build per mantenere l'immagine il più piccola possibile.
Livello di difficoltà: Avanzato
Tecnologie utilizzate: Docker, Python, Alpine Linux
Istruzioni passo passo
- Scrivi lo script Python: crea uno script che analizzi i dati usando pandas. Ecco un esempio:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
- Ottimizza il Dockerfile: usa multi-stage build e Alpine Linux per creare un'immagine leggera.
# Stage 1: Build stage
FROM python:3.9-alpine as build-stage
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY script.py .
# Stage 2: Run stage
FROM python:3.9-alpine
WORKDIR /app
COPY --from=build-stage /app/script.py .
CMD ["python", "script.py"]
- Crea l'immagine:
docker build -t optimized-python-app .
Progetto 8: Dockerizzare una pipeline di deep learning con PyTorch
Questo progetto prevede la containerizzazione di una pipeline di deep learning usando PyTorch. Il focus è ottimizzare il Dockerfile per prestazioni e dimensioni, rendendo facile eseguire modelli di deep learning in ambienti diversi.
Livello di difficoltà: Avanzato
Tecnologie utilizzate: Docker, PyTorch, Python
Istruzioni passo passo
- Installa PyTorch in uno script Python: crea uno script che carichi un modello PyTorch pre-addestrato ed esegua inferenza. Ecco un esempio:
import torch
model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
print("Model loaded successfully")
- Scrivi il Dockerfile: definisci l'ambiente per PyTorch:
FROM pytorch/pytorch:1.9.0-cuda11.1-cudnn8-runtime
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY model.py .
CMD ["python", "model.py"]
- Crea l'immagine:
docker build -t pytorch-model .
- Esegui il container:
docker run pytorch-model
Progetto 9: Automatizzare pipeline di dati con Apache Airflow e Docker
In questo progetto configurerai e containerizzerai un ambiente Apache Airflow per automatizzare pipeline di dati. Apache Airflow è uno strumento popolare per orchestrare workflow complessi, ampiamente usato nel data engineering.
Livello di difficoltà: Avanzato
Tecnologie utilizzate: Docker, Apache Airflow, Python, PostgreSQL
Istruzioni passo passo
- Crea il file
docker-compose.yml: definisci i servizi Airflow e il database PostgreSQL:
version: '3'
services:
postgres:
image: postgres:latest
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
webserver:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
ports:
- "8080:8080"
volumes:
- ./dags:/opt/airflow/dags
command: ["webserver"]
scheduler:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
- webserver
volumes:
- ./dags:/opt/airflow/dags
command: ["scheduler"]
volumes:
postgres_data:
- Avvia l'ambiente Airflow: usa Docker Compose per avviare l'ambiente Airflow:
docker-compose up
- Accedi alla UI di Airflow: Apri il browser e vai su http://localhost:8080.
Progetto 10: Distribuire un'API di data science con FastAPI e Docker
Crea e distribuisci un'API di data science usando FastAPI. Containerizzerai l'API con Docker concentrandoti sull'ottimizzazione per ambienti di produzione.
Livello di difficoltà: Avanzato
Tecnologie utilizzate: Docker, FastAPI, Python, scikit-learn
Istruzioni passo passo
- Scrivi l'applicazione FastAPI: crea una semplice API che usa un modello di machine learning per le predizioni. Ecco un esempio:
from fastapi import FastAPI
import pickle
app = FastAPI()
with open("model.pkl", "rb") as f:
model = pickle.load(f)
@app.post("/predict/")
def predict(data: list):
return {"prediction": model.predict(data)}
- Scrivi il Dockerfile: crea un Dockerfile che definisca l'ambiente per FastAPI:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
- Crea l'immagine:
docker build -t fastapi-app .
- Esegui il container:
docker run -p 8000:8000 fastapi-app
Consigli per lavorare sui progetti Docker
Mentre affronti questi progetti, tieni a mente i seguenti suggerimenti:
- Parti in piccolo: inizia con progetti non troppo complessi e poi passa a compiti più articolati. Costruire fiducia con attività più semplici è fondamentale.
- Documenta i tuoi progressi: tieni un registro dettagliato dei progetti per monitorare l'apprendimento e usarlo come riferimento in futuro.
- Unisciti alle community Docker: partecipa a forum online e meetup locali per condividere esperienze, fare domande e imparare dagli altri.
- Sperimenta e personalizza: non aver paura di modificare i progetti, provare approcci diversi ed esplorare nuove funzionalità di Docker.
- Continua a imparare: Amplia le tue conoscenze su Docker esplorando argomenti e strumenti avanzati come Kubernetes, Docker Swarm o l'architettura a microservizi.
Conclusione
Padroneggiare Docker significa andare oltre i soli comandi e configurazioni. Si tratta di capire come Docker si inserisce nello sviluppo di applicazioni moderne, nei flussi di lavoro di data science e nella gestione dell'infrastruttura.
I progetti che ho condiviso in questa guida offrono spunti per costruire le competenze di base e l'esperienza pratica necessarie per eccellere in scenari reali.
A questo punto, ti suggerisco di consolidare le conoscenze seguendo questi corsi:
FAQs
Quali sono le best practice per scrivere Dockerfile efficienti?
Le best practice per scrivere Dockerfile efficienti includono minimizzare il numero di layer combinando i comandi, usare i multi-stage build per ridurre la dimensione dell'immagine, scegliere immagini base leggere, mettere in cache le dipendenze ed evitare di includere file non necessari nell'immagine finale.
Che cos'è un multi-stage build in Docker?
Un multi-stage build è un metodo per ottimizzare le immagini Docker separando gli ambienti di build e di runtime. Il risultato sono immagini più piccole e più sicure.
Come puoi ridurre la dimensione di un'immagine Docker?
Usa immagini base minimaliste, gestisci le dipendenze in modo efficiente e adotta i multi-stage build per ridurre la dimensione dell'immagine e migliorare le prestazioni.
Come risolvo gli errori più comuni durante la creazione di immagini Docker?
Gli errori comuni nella creazione di immagini Docker includono problemi di permessi, sintassi errata del Dockerfile e installazione delle dipendenze non riuscita. Per risolvere, controlla i log di build di Docker, assicurati di usare l'immagine base corretta e verifica che percorsi e permessi dei file siano impostati correttamente. Strumenti come docker build --no-cache possono aiutare a identificare problemi di caching.
Posso usare Docker con Kubernetes per questi progetti?
Sì, una volta che ti senti a tuo agio con Docker, Kubernetes può essere il passo successivo. Kubernetes aiuta a gestire applicazioni containerizzate su larga scala. Puoi distribuire i tuoi progetti Docker su un cluster Kubernetes per gestire più istanze, il scaling e automatizzare le distribuzioni.
Quali sono alcune best practice per gestire i volumi Docker e i dati persistenti?
Quando lavori con i volumi Docker, è importante usare volumi nominati per garantire la persistenza dei dati nei riavvii dei container. Esegui regolarmente il backup dei volumi e monitora eventuali colli di bottiglia di prestazioni dovuti all'I/O su disco. Evita di archiviare dati sensibili direttamente nei container; usa soluzioni di archiviazione sicure o database esterni.
Qual è lo scopo della direttiva ENTRYPOINT in un Dockerfile?
La direttiva ENTRYPOINT in un Dockerfile specifica il comando che verrà sempre eseguito all'avvio del container. Consente di trattare il container come un eseguibile, a cui passare argomenti in fase di esecuzione, aumentando la flessibilità.
Qual è la differenza tra CMD ed ENTRYPOINT in un Dockerfile?
Sia CMD che ENTRYPOINT specificano i comandi da eseguire all'avvio di un container. Tuttavia, CMD fornisce argomenti predefiniti che possono essere sovrascritti, mentre ENTRYPOINT definisce il comando che viene sempre eseguito. ENTRYPOINT è utile per creare container che si comportano come eseguibili, mentre CMD è più flessibile per specificare comandi predefiniti.
AWS Certified Cloud Solutions Architect, DevOps, Cloud Engineer con una profonda conoscenza dell’architettura ad alta disponibilità e dei relativi concetti. Ho competenze in cloud engineering e DevOps e sono abile nell’utilizzare risorse open source per implementare applicazioni enterprise. Sviluppo applicazioni cloud su AWS usando AWS CDK, AWS SAM, CloudFormation, Serverless Framework, Terraform e Django.


