Ottimizzazione delle immagini Docker

Ottimizzazione delle immagini Docker

Agli sviluppatori come lavorare con Docker per la sua flessibilità e facilità d'uso. Quando si creano applicazioni, vale la pena investire il tempo extra ottimizzando le immagini Docker e DockerFiles. L'ottimizzazione aiuterà i team a condividere immagini più piccole, a migliorare le prestazioni e semplificare il debug di problemi. Di seguito sono riportati alcuni consigli per la creazione di immagini migliori e file di Docker.

Ottimizzazione delle immagini Docker

Le grandi immagini Docker possono rendere difficile condividere. Inoltre, le grandi immagini rallentano l'esecuzione. Quindi, l'ottimizzazione delle immagini può aiutare con il processo di sviluppo generale e produzione.

Seleziona immagini di base corrette

Le immagini disponibili su Docker Hub sono già ottimizzate. Invece di costruire il tuo, è una buona idea utilizzare le immagini ottimizzate disponibili. Ad esempio, se hai bisogno di un'immagine Redis, hai la possibilità di costruirla su un'immagine Ubuntu o scaricare direttamente quello Redis. L'uso dell'immagine Redis già costruita è un'opzione migliore perché gli sviluppatori si sono già presi cura di eventuali pacchetti ridondanti.

Usa build multi-stage

La nuova opzione a più stadi in Docker (dalla versione 17.05) può aiutarti a creare modi intelligenti per ottimizzare le tue immagini. È possibile creare un'applicazione e quindi trasferirla in un nuovo ambiente pulito per la distribuzione. Garantirà che solo le librerie e le dipendenze necessarie sono parte dell'immagine finale.

Ridurre il numero di strati

Quando si costruisce un'immagine, presta attenzione ai livelli creati da Dockerfiles. Ogni comando di esecuzione crea un nuovo livello. Quindi combinare gli strati può ridurre la dimensione dell'immagine. Un semplice esempio è l'apt-get. In generale, gli utenti eseguono il comando in questo modo:

Esegui Apt -get -y Aggiornamento
Esegui Apt -get Installa -y Python

Creerà due livelli. Ma combinare i comandi creerà un singolo livello nell'immagine finale:

Esegui apt -get -y update && apt -get install -y python

Quindi, combinazioni intelligenti di comandi possono portare a immagini più piccole.

Crea immagini di base personalizzate

Docker cache immagini. Se hai bisogno di più istanze degli stessi livelli, è una buona idea guardare all'ottimizzazione dei livelli e alla creazione di un'immagine di base personalizzata. Accelererà i tempi di caricamento e renderà più semplice la traccia.

Build on Top of Production Images

Le immagini di prova richiedono più strumenti e librerie per testare le funzionalità. È una buona idea utilizzare l'immagine di produzione come base e creare immagini di prova sopra di essa. I file di test non necessari saranno al di fuori della base. Quindi le immagini di produzione rimarranno piccole e pulite per la distribuzione.

Evita di archiviare i dati dell'applicazione

L'archiviazione dei dati dell'applicazione nel contenitore sarà in mongolfiera. Per gli ambienti di produzione, utilizzare sempre la funzione volume per mantenere il contenitore separato dai dati.

Best practice per la scrittura di fikerfile

Dockerfiles consente agli sviluppatori di codificare i processi. Quindi, è un ottimo strumento per migliorare il processo di costruzione di immagini Docker. Ecco alcune pratiche che ti aiuteranno a migliorare il tuo sviluppo.

Progettare contenitori effimeri

Prova a progettare contenitori facili da creare e distruggere. Se i contenitori sono troppo dipendenti da ambienti e configurazioni periferici, sono più difficili da mantenere. Quindi la progettazione di contenitori apolidi può aiutare a semplificare il sistema.

Utilizzo .Dockerignore per ottimizzare le immagini

Se hai una build complicata che passa in modo ricorsivo più directory, tutti i file e le directory vengono inviati al demone Docker. Può provocare immagini più grandi e tempi di costruzione più lenti. Puoi usare il .Dockerignore per escludere file e cartelle non necessarie che complicano il processo di build.

Usa build multi-stage

Le build multi-stage sono una nuova funzionalità Docker dalla versione 17.05. Consente agli sviluppatori di creare più immagini nello stesso Dockerfile e spostare artefatti da un contenitore all'altro nello stesso Dockerfile. Quindi puoi avere artefatti più piccoli e ottimizzati nell'immagine finale senza usare script complicati per raggiungere gli stessi risultati.

Installa solo i pacchetti richiesti

Dockerfile dovrebbe installare solo i pacchetti minimi indispensabili necessari per eseguire i servizi. Ogni pacchetto richiede spazio nell'immagine. Quindi alcune applicazioni come il ping o l'editor di testo potrebbero non essere necessarie nel contesto del servizio che verrà eseguito sul contenitore. Comprendere i requisiti di un determinato servizio può aiutarti a scrivere migliori file Docker in grado di creare immagini ottimizzate.

Pensa ai microservizi

Progettare file Docker con l'architettura di microservizi può essere utile. Non è sempre possibile distribuire un processo per contenitore. Ma gli sviluppatori possono pensare a come distribuire i propri processi in modo più proattivo e prendere decisioni che aiuteranno a distribuire i servizi in modo disaccoppiato. I contenitori si adattano naturalmente al design modulare. Quindi i tuoi fikerfile dovrebbero sfruttare le opportunità che Docker offre.

Considera l'effetto delle istruzioni sui livelli

Esegui, copia e aggiungi solo Dockerfile Crea nuovi livelli dalla versione 1.10. Altre istruzioni non influiscono direttamente sulla dimensione delle immagini finali. Quindi dovresti essere vigile quando usano questi comandi. Inoltre, la combinazione di più comandi può ridurre il numero di livelli. Meno strati significano dimensioni più piccole.

Ordina argomenti multi-line

Ogni volta che hai un argomento multi-line, ordina gli argomenti in modo alfanumericamente per migliorare la manutenzione del codice. Gli argomenti casuali possono portare a duplicazioni. Sono anche più difficili da aggiornare. Un buon esempio:

Esegui Apt-get Update && Apt-get Install -y \
apache2 \
idiota \
iputils-ping \
Python \

Evita di usare: ultimo

Se stai usando da [ImageName]: più recente, puoi riscontrare problemi ogni volta che l'immagine cambia. Può diventare un problema difficile da tracciare. L'uso di tag specifici può assicurarti di conoscere l'immagine esatta utilizzata dal registro Docker.

Aggiungi solo i file richiesti dalla directory

I comandi Dockerfile sono eseguiti consecutivamente per creare immagini e costruisce solo livelli che non sono già presenti. Supponiamo che tu abbia un pacchetto.JSON per NPM e requisiti.txt per pip. Puoi scrivere il seguente Dockerfile in cui il pacchetto.JSON e requisiti.txt sono nella cartella MyCode:

COPIA ./mycode//home/programma/
Esegui l'installazione NPM
Esegui i requisiti di installazione PIP -R

Tuttavia, ogni volta che c'è una modifica in uno qualsiasi dei file in MyCode, entrambi i comandi di esecuzione devono essere ricostruiti. Invece, se il codice è scritto nel modo seguente:

COPIA ./mycode/pacchetto.JSON/Home/Programma/Pacchetto.JSON
Workdir /home /programma
Esegui l'installazione NPM
COPIA ./MyCode/Requisiti.txt/home/programma/requisiti.TXT
Workdir /home /programma
Esegui i requisiti di installazione PIP -R

Quindi, i comandi di esecuzione saranno indipendenti l'uno dall'altro e cambieranno in un singolo file nella cartella MyCode non influenzerà entrambi i comandi NPM e PIP RUN. Guardare dipendenze come questa può aiutarti a scrivere migliori fikerfiles.

Ulteriori studi

Le tecniche di cui sopra e le migliori pratiche dovrebbero aiutarti a costruire immagini Docker più piccole e scrivere migliori file di Docker. Ecco link per aiutarti a scoprire ulteriori informazioni su diversi argomenti:

  • Docker Development Best Practices
  • Build Multi-stage Docker
  • Riferimento file Docker

Riferimenti:

  • https: // docs.Docker.com/sviluppo/dev-best-practices/
  • https: // docs.Docker.com/motore/userguide/eng-image/dockerfile_best-practices/
  • https: // docs.Docker.com/motore/userguide/eng-image/baseimages/
  • https: // docs.Docker.com/motore/userguide/eng-image/multistage-build/
  • https: // blog.codeship.com/ridotto-docker-dimensione dell'immagine/
  • https: // hackernoon.com/tips-to-reduce-docker-dimensioni-image-876095da3b34
  • https: // docs.Docker.com/motore/riferimento/builder/#dockerignore file
  • https: // runnable.com/blog/9-mone-docerfile-mistakes

https: // linuxhint.com/install-and-us-docker-on-ubuntu/