Punti chiave
- Utilizza immagini Docker ufficiali per una migliore sicurezza e prestazioni. La creazione delle tue immagini potrebbe comportare una configurazione errata e richiedere più tempo.
- Utilizza versioni specifiche delle immagini Docker per evitare comportamenti imprevedibili e conflitti con le dipendenze. Estrai e costruisci utilizzando le immagini di una versione specifica.
- Esegui la scansione delle immagini Docker per individuare eventuali vulnerabilità della sicurezza utilizzando il comando docker scan. Determina se un'immagine è sufficientemente sicura per la tua applicazione.
Docker è il software di containerizzazione più popolare, ma non tutti lo utilizzano in modo efficiente. Se non segui le best practice di Docker, puoi lasciare le tue app vulnerabili a problemi di sicurezza o di prestazioni.
Ecco alcune best practice che puoi adottare per utilizzare le funzionalità Docker in modo ingegnoso. Queste misure migliorano la sicurezza e garantiscono la creazione di file Docker gestibili.
1. Utilizza immagini Docker ufficiali
Quando si containerizza l'applicazione, è necessario utilizzare un'immagine Docker. Puoi creare un'immagine con una configurazione personalizzata o utilizzare le immagini ufficiali di Docker.
Per creare le tue immagini è necessario che tu gestisca tu stesso tutta la configurazione. Ad esempio, per creare un'immagine per un'applicazione node.js, devi scaricare node.js e le sue dipendenze. Il processo richiede molto tempo e potrebbe non portare alla configurazione corretta.
Docker consiglia di utilizzare un'immagine node.js ufficiale fornita con tutte le dipendenze corrette. Le immagini Docker hanno misure di sicurezza migliori, sono leggere e sono testate per vari ambienti. Potete trovare le immagini ufficiali su Le immagini ufficiali di Docker pagina.
2. Utilizza versioni specifiche dell'immagine Docker
Di solito, quando estrai un'immagine ufficiale, è quella con il tag più recente che rappresenta l'ultima versione aggiornata di quell'immagine. Ogni volta che crei un contenitore da quell'immagine, si tratta di una versione diversa dell'ultimo contenitore.
La creazione con versioni diverse dell'immagine Docker può causare comportamenti imprevedibili nell'applicazione. Le versioni potrebbero scontrarsi con altre dipendenze e alla fine causare il fallimento dell'app.
Docker consiglia di estrarre e creare utilizzando immagini di una versione specifica. Le immagini ufficiali hanno anche documentazione e coprono i casi d'uso più comuni.
Ad esempio, invece di portuale tirare alpino, utilizzo docker pull alpine: 3.18.3. Docker estrarrà quella versione specifica. Puoi quindi utilizzarlo nelle build successive, riducendo gli errori nella tua applicazione. Puoi trovare le versioni particolari delle immagini sulla pagina ufficiale delle immagini Docker, sotto Tag supportati e rispettivi collegamenti Dockerfile:
3. Scansiona le immagini per individuare eventuali vulnerabilità della sicurezza
Come puoi determinare che un'immagine che desideri creare non presenta vulnerabilità di sicurezza? Scansionandolo. È possibile scansionare le immagini Docker utilizzando il comando docker scan. La sintassi è la seguente:
docker scan [IMAGE]
È necessario prima accedere alla finestra mobile per scansionare un'immagine.
docker login
Quindi, scansiona l'immagine specifica che desideri controllare:
docker scan ubuntu: latest
Uno strumento chiamato Sincronizzare esegue la scansione dell'immagine, elencando eventuali vulnerabilità in base alla loro gravità. È possibile visualizzare il tipo di vulnerabilità e collegamenti alle informazioni su di essa, incluso come risolverla. Dalla scansione puoi capire se l'immagine è sufficientemente sicura per la tua applicazione.
4. Utilizza immagini Docker di piccole dimensioni
Quando estrai un'immagine Docker, viene fornita con tutte le utilità di sistema. Ciò aumenta la dimensione dell'immagine con strumenti non necessari.
Le immagini Docker di grandi dimensioni occupano spazio di archiviazione e possono rallentare il tempo di esecuzione dei contenitori. Hanno anche una maggiore possibilità di vulnerabilità della sicurezza.
Puoi ridurre la dimensione delle immagini Docker utilizzando le immagini Alpine. Le immagini alpine sono leggere e vengono fornite solo con gli strumenti necessari. Riducono lo spazio di archiviazione, rendendo la tua applicazione più veloce ed efficiente.
Troverai una versione alpina per la maggior parte delle immagini ufficiali su Docker. Ecco un esempio di versioni Alpine per PostgreSQL:
5. Ottimizza la memorizzazione nella cache dei livelli di immagine
Ogni comando in un Dockerfile rappresenta un livello sull'immagine. I livelli hanno utilità diverse ed eseguono varie funzioni. Se guardi le immagini ufficiali su Docker Hub, vedrai le istruzioni utilizzate per crearle.
Il Dockerfile include tutto il necessario per creare l'immagine. È uno dei motivi per cui molti gli sviluppatori preferiscono Docker alle macchine virtuali.
Ecco la struttura di un esempio di immagine alpina:
Quando crei la tua applicazione basata su un'immagine, stai aggiungendo più livelli all'immagine. Docker esegue le istruzioni su un Dockerfile dall'alto verso il basso e, se un livello cambia, Docker deve ricostruire i livelli successivi.
La procedura migliore è organizzare il Dockerfile partendo dai file che cambiano meno a quelli che cambiano più spesso. Le istruzioni che non cambiano, come l'installazione, possono trovarsi all'inizio del file.
Quando modifichi un file, Docker crea dai file modificati e memorizza nella cache i file non modificati sopra di esso. Pertanto, il processo viene eseguito più velocemente.
Guarda l'esempio illustrato nella figura sopra. Se viene apportata una modifica ai file dell'applicazione, Docker esegue la compilazione da lì; non è necessario installare nuovamente i pacchetti npm.
Se costruisci dall'immagine, il processo verrà eseguito più velocemente rispetto alla ricostruzione di tutti gli altri livelli. La memorizzazione nella cache accelera inoltre l'estrazione e il push delle immagini da Docker Hub.
7. Utilizza un file .dockerignore
Quando crei un'immagine utilizzando un Dockerfile, potresti voler mantenere alcune informazioni private. Alcuni file e cartelle potrebbero far parte del progetto, ma non vuoi includerli nel processo di compilazione.
L'utilizzo di un file .dockerignore riduce notevolmente le dimensioni dell'immagine. Questo perché il processo di creazione include solo i file necessari. Aiuta anche a mantenere i file privati ed evitare di esporre chiavi segrete o password.
Il file .dockerignore è un file creato nella stessa cartella del Dockerfile. È un file di testo, molto simile un file .gitignore, che contiene i nomi di tutti i file che non desideri includere nel processo di compilazione.
Ecco un esempio:
8. Utilizzare il principio dell'utente meno privilegiato
Per impostazione predefinita, Docker utilizza l'utente root come amministratore per l'autorizzazione a eseguire comandi, ma questa è una cattiva pratica. Se è presente una vulnerabilità in uno dei contenitori, gli hacker possono accedere all'host Docker.
Per evitare questo scenario, creare un utente e un gruppo dedicati. È possibile impostare le autorizzazioni necessarie per il gruppo per salvaguardare le informazioni sensibili. Se un utente viene compromesso, puoi eliminarlo senza esporre l'intero progetto.
Ecco un esempio che mostra come creare un utente e impostarne le autorizzazioni:
In alcune immagini di base sono creati pseudo-utenti. È possibile utilizzare gli utenti installati anziché le autorizzazioni dell'utente root.
Perché dovresti adottare le best practice di Docker
Le best practice rappresentano un ottimo modo per ridurre le vulnerabilità e scrivere codice più pulito. Esistono molte best practice che puoi applicare a ciascuna funzionalità Docker che utilizzi.
Un progetto ben organizzato semplifica la sincronizzazione con altri strumenti di orchestrazione come Kubernetes. Puoi iniziare con quelli descritti nell'articolo e adottarne altri man mano che impari Docker.