7.1 Immagine base
Le immagini base svolgono un ruolo importante nella creazione delle immagini Docker, poiché forniscono il punto di partenza per il build e determinano l'ambiente in cui verrà eseguita la tua app. Fare la scelta giusta e configurare correttamente le immagini base può influenzare significativamente le prestazioni, le dimensioni e la sicurezza dell'immagine finale. In questa lezione vedremo come scegliere e configurare le immagini base per Docker.
Un'immagine base (o immagine di partenza) è un'immagine Docker utilizzata come layer iniziale per creare una nuova immagine Docker. Può includere un sistema operativo minimale, strumenti e librerie necessarie o addirittura essere vuota (immagine scratch). La scelta dell'immagine base determina quali risorse e pacchetti saranno disponibili nel container di default.
Scelta dell'immagine base
Nella scelta dell'immagine base, bisogna tenere in considerazione diversi fattori:
- Dimensione dell'immagine: Immagini più piccole si scaricano più velocemente, occupano meno spazio su disco e possono velocizzare il deployment delle applicazioni.
- Supporto e aggiornamenti: Usare immagini ufficiali con aggiornamenti regolari garantisce un livello di sicurezza più alto, correzione delle vulnerabilità e stabilità operativa.
- Compatibilità: L'immagine base deve includere le librerie e le dipendenze necessarie per garantire il funzionamento corretto della tua applicazione.
Immagini base popolari
1. Alpine Linux
Immagine super leggera, pesa circa 5 MB. È perfetta per applicazioni che richiedono un sistema operativo minimale. Tuttavia, gli sviluppatori devono tenere presente che Alpine manca di molte librerie standard, quindi alcune applicazioni potrebbero richiedere configurazioni aggiuntive.
FROM alpine:3.12
2. Debian/Ubuntu
Immagini più complete che includono una vasta gamma di strumenti e librerie. Sono adatte per applicazioni complesse che richiedono un ambiente più completo o una libreria standard Linux familiare.
FROM ubuntu:20.04
3. Immagini Ufficiali dei Linguaggi
Immagini ufficiali per linguaggi di programmazione come Node.js, Python, Ruby e altri. Queste immagini contengono già l'ambiente necessario per sviluppare ed eseguire applicazioni nel linguaggio corrispondente, semplificando la configurazione.
FROM node:14
7.2 Configurazione dell'immagine base
Dopo aver scelto l'immagine base, è necessario configurarla in base ai requisiti della tua applicazione. La configurazione include l'installazione dei pacchetti necessari, la copia dei file dell'applicazione e la configurazione dell'ambiente.
Esempio: Configurazione dell'immagine base basata su Alpine Linux
# Utilizziamo l'immagine base Alpine Linux
FROM alpine:3.12
# Installiamo i pacchetti necessari
RUN apk add --no-cache python3 py3-pip
# Impostiamo la directory di lavoro
WORKDIR /app
# Copiamo i file dell'applicazione
COPY . .
# Installiamo le dipendenze
RUN pip3 install -r requirements.txt
# Indichiamo il comando per avviare l'applicazione
CMD ["python3", "app.py"]
In questo esempio viene utilizzata l'immagine base alpine:3.12, vengono installati i pacchetti necessari, copiati i file dell'applicazione e installate le dipendenze. Il comando finale alpine:3.12
specifica come avviare l'applicazione.
Esempio: Configurazione dell'immagine base basata su Ubuntu
# Utilizziamo l'immagine base Ubuntu
FROM ubuntu:20.04
# Aggiorniamo e installiamo i pacchetti necessari
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# Impostiamo la directory di lavoro
WORKDIR /app
# Copiamo i file dell'applicazione
COPY . .
# Installiamo le dipendenze
RUN pip3 install -r requirements.txt
# Indichiamo il comando per avviare l'applicazione
CMD ["python3", "app.py"]
Questo Dockerfile utilizza l'immagine ubuntu:20.04 e installa Python e pip. Successivamente, copia i file dell'applicazione e installa le dipendenze, similmente all'esempio precedente.
7.3 Migliori pratiche
Come scegliere e configurare correttamente le immagini base:
1. Scegli immagini minimali: inizia con le immagini più piccole che soddisfano i requisiti della tua applicazione. Questo ridurrà la dimensione dell'immagine finale e aumenterà la sicurezza.
2. Non installare pacchetti inutili: installa solo le dipendenze realmente necessarie per la tua applicazione. Questo ridurrà la dimensione dell'immagine e diminuerà il numero di potenziali vulnerabilità.
3. Pulisci la cache dei gestori di pacchetti: dopo aver installato i pacchetti, elimina i file temporanei e la cache per rendere l'immagine più leggera.
RUN apt-get update && apt-get install -y python3 python3-pip && rm -rf /var/lib/apt/lists/*
4. Usa la multi-stage build: permette di separare le fasi di build e runtime, aiutando a creare immagini più leggere e sicure.
# Fase di build
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Fase finale
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
5. Aggiorna regolarmente le immagini: utilizza versioni recenti delle immagini base per includere le ultime patch di sicurezza e aggiornamenti.
GO TO FULL VERSION