Introduzione
Le organizzazioni di tutto il mondo stanno adottando un approccio alla distribuzione del software basato su microservizi e basato su container. Tuttavia, la maggior parte del software è stata progettata e scritta prima che esistessero i moderni contenitori basati su immagini.
Se stai pianificando di passare a un modello di distribuzione del container Docker, devi considerare gli effetti che la migrazione avrà sulle tue applicazioni esistenti.
Questo tutorial illustra il lavoro di preparazione richiesto e i comandi Docker di base per la containerizzazione di applicazioni legacy.
Perché containerizzare le app legacy?
Le aziende che adottano la distribuzione del software container devono ristrutturare la propria organizzazione per rispecchiare i processi del nuovo flusso di lavoro container. L'analisi dei potenziali vantaggi della distribuzione dei container è utile per determinare l'approccio migliore per la tua applicazione.
Efficienza e portabilità
La distribuzione dei container può essere una soluzione efficace poiché i container in genere si avviano in pochi secondi. L'immagine del contenitore contiene tutti i binari, le librerie e le dipendenze, il che significa che non è necessario aggiungere configurazioni specifiche dell'ambiente. La stessa immagine è ora trasferibile su più sistemi. L'immagine è priva di limitazioni ambientali, rendendo le distribuzioni affidabili, portatili e scalabili. Containerizzando le applicazioni, separi il filesystem e il runtime dal suo host.
Manutenibilità e ridimensionamento
Invece di gestire un'ampia applicazione monolitica, crei un modello architettonico in cui le applicazioni complesse sono costituite da piccoli processi indipendenti che comunicano tra loro tramite le API.
Risolvendo i conflitti applicativi tra diversi ambienti, gli sviluppatori possono condividere il proprio software e le dipendenze con le operazioni IT e gli ambienti di produzione. Gli sviluppatori e le operazioni IT sono strettamente legati e possono collaborare in modo efficace. Il flusso di lavoro del container fornisce a Dev Ops la continuità di cui hanno bisogno. La capacità di identificare i problemi all'inizio del ciclo di sviluppo riduce il costo di una revisione importante in una fase successiva.
Strumenti di gestione dei contenitori
Gli strumenti di gestione dei container di terze parti forniscono un meccanismo per il networking, il monitoraggio e l'archiviazione persistente per le applicazioni containerizzate. Le applicazioni legacy possono trarre vantaggio da framework di orchestrazione all'avanguardia come Kubernetes.
Questi strumenti migliorano i tempi di attività, le capacità analitiche e semplificano il monitoraggio dello stato delle applicazioni.
Pianifica per i container
Per migrare con successo le tue applicazioni, devi sviluppare una strategia che esamini le esigenze delle tue applicazioni insieme alla natura dei container. A livello tecnico, qualsiasi applicazione può essere distribuita in un container. Esistono diverse soluzioni possibili per la distribuzione di un'applicazione legacy in un container:
Indipendentemente dal percorso scelto, in primo luogo è fondamentale identificare correttamente se un'applicazione è un buon candidato per essere distribuita in un ambiente container. L'attenzione deve essere concentrata su architettura, prestazioni e sicurezza.
Architettura
Le applicazioni devono essere scomposte in singoli servizi in modo che possano essere ridimensionate e distribuite individualmente. Per utilizzare appieno la distribuzione dei container, determina se è possibile suddividere l'applicazione esistente in più container.
Idealmente, un singolo processo dovrebbe essere assegnato a un singolo contenitore. Anche i lavori cron dovrebbero essere esternalizzati in contenitori separati. Potrebbe essere necessario rifare l'architettura della tua app.
Prestazioni
Determina se la tua applicazione ha requisiti hardware specifici. I container utilizzano funzionalità Linux che partizionano il kernel sottostante. Potrebbe essere necessario configurare singoli contenitori con parametri univoci o fornire risorse specifiche.
Inoltre, tieni presente che Docker non ha un demone init per ripulire i processi zombie. Assicurati di fornirne uno come ENTRYPOINT nel tuo dockerfile. Considera dumb.ino come una possibile soluzione leggera.
Sicurezza
I container offrono un isolamento minore rispetto alle macchine virtuali ed è importante definire il livello di sicurezza di cui l'applicazione ha bisogno. Imposta vincoli rigorosi per gli account utente e di servizio. Mantieni segreti e password isolati dalle immagini del tuo contenitore, rispetta i principi del privilegio minimo e mantieni una difesa approfondita per proteggere i cluster Kubernetes.
Requisiti di memoria persistente
Nell'orchestrazione dei contenitori, tutti i dati persistenti non vengono salvati all'interno del livello scrivibile dei contenitori. Al contrario, i dati permanenti vengono salvati su volumi persistenti chiaramente definiti. Questo approccio garantisce che i dati permanenti non aumentino le dimensioni di un contenitore e esistano indipendentemente dal ciclo di vita del contenitore.
Se i dati permanenti della tua app legacy sono sparsi nel filesystem o sono scritti in percorsi condivisi con l'applicazione stessa, ti consigliamo di ristrutturare l'applicazione in modo che scriva tutti i dati permanenti in un unico percorso nel filesystem. Ciò semplificherà la migrazione dei dati dell'app in un ambiente containerizzato.
Esternalizzare i servizi
Identifica i servizi locali che possono essere esternalizzati ed eseguiti in contenitori separati. Cerca servizi di cache e database, quelli possono essere esternalizzati più facilmente. In alternativa, potresti voler utilizzare i servizi gestiti invece di configurarli e gestirli da solo.
Prepara l'immagine per più ambienti
È previsto l'utilizzo di una singola immagine Docker in un ambiente di sviluppo, QA e produzione. Prendere in considerazione le variabili di configurazione specifiche dell'ambiente. Se ne identifichi qualcuno, dovrai scrivere uno script di avvio che aggiornerà i file di configurazione dell'applicazione predefiniti.
Distribuire l'applicazione legacy ai container
Supponendo che Docker sia attivo e funzionante sul tuo sistema, esistono diversi modi per creare un'immagine Docker:
- Utilizza un'immagine vuota e aggiungi livelli aggiuntivi importando una serie di file esterni.
- Utilizza la riga di comando per inserire in modo interattivo i singoli comandi Docker e creare una nuova immagine con
docker commit
. - Utilizza un sofisticato strumento di gestione della configurazione (ad es. come Puppet e Chef) per implementazioni complesse.
- Utilizza un'immagine di base esistente e specifica una serie di comandi in un Dockerfile .
I Dockerfile sono un ottimo punto di partenza per capire come utilizzare un runtime del contenitore per creare un'immagine. Se commetti un errore, puoi facilmente modificare il file e creare una nuova immagine del contenitore con un solo comando.
File Docker dell'app legacy
Un Dockerfile è un semplice file di testo con una serie di comandi eseguiti in ordine rigoroso. I Dockerfile sono generalmente basati su immagini esistenti, con poche impostazioni aggiuntive. Usa la tua interfaccia a riga di comando per creare una directory che contenga i file necessari per la tua build:
mkdir ImageForLegacyApp
cd ImageForLegacyApp
Una volta avviato il processo di compilazione, i file all'interno di quella directory vengono inviati al demone Docker. Limitando il numero di file, acceleriamo il processo di compilazione e risparmiamo spazio su disco.
Usa il tuo editor di testo preferito per la codifica o la programmazione (usiamo vim) per creare un Dockerfile vuoto, all'interno di ImageForLegacyApp directory:
vim Dockerfile
Le seguenti istruzioni di compilazione sono per una semplice applicazione PHP. Iniziamo tirando un sistema operativo con PHP e Apache installati.
FROM php:apache
FROM
è la prima istruzione nel Dockerfile. Definisce l'immagine di base, in questo esempio il sistema operativo Debian con PHP e Apache installati. Se desideri una versione specifica di un'immagine di base, assicurati di utilizzare il tag corrispondente (ad esempio, php:7.0-apache
).
COPY ./var/www/html
Usa il COPY
comando per copiare il codice PHP nell'immagine. Usa il ADD
comando invece se è necessaria l'estrazione di tar.
WORKDIR /var/www/html
Questo definisce la cartella di lavoro. Tutti i comandi successivi verranno applicati a questa cartella.
EXPOSE 80
Imposta la porta per l'ascolto dell'applicazione con EXPOSE
comando. Dopo aver avviato l'immagine e collegato quello in esecuzione a un altro container, la porta esposta è disponibile per l'altro container come se si trovasse sullo stesso sistema locale.
CMD
[“php”, “./legacy_app.php”]
Usa il CMD
comando per identificare il comando predefinito da eseguire dall'immagine, insieme alle opzioni che si desidera passare ad essa. Puoi avere solo una riga CMD in un Dockerfile.
LABEL version="1.1"
Usiamo il LABEL
istruzioni per aggiungere metadati all'immagine. Oltre all'etichetta che assegni, l'immagine estrarrà tutte le etichette assegnate all'immagine principale richiamata con il FROM
comando.
Creazione di un'immagine Docker
Abbiamo definito con successo le istruzioni all'interno del Dockerfile. Avvia il processo di compilazione immettendo il seguente comando nel tuo terminale di comando:
docker build -t legacyapp [location_of_Dockerfile]
Durante il processo di creazione, ogni immagine riceve un ID univoco. Per individuare e identificare facilmente l'immagine in un registro, utilizza il -t
comando per assegnare un nome all'immagine. In questo esempio, l'immagine sarà denominata legacyapp .
docker build -t legacyapp .
- La
docker build
Il comando indica al demone Docker di creare un'immagine basata sul Dockerfile. - Il percorso fornito alla
docker build
comando viene utilizzato per caricare file e directory. - Ogni fase di compilazione è numerata mentre il demone Docker procede con l'esecuzione dei comandi dal Dockerfile.
- Ogni comando genera una nuova immagine. E l'ID immagine viene visualizzato sullo schermo.
- Ogni contenitore Docker intermedio viene rimosso prima di procedere al passaggio successivo per preservare lo spazio su disco.
L'immagine Docker è pronta e hai ricevuto un riferimento ID univoco. Inoltre, non abbiamo utilizzato un tag di versione, quindi Docker ha automaticamente taggato l'immagine come :latest
.
Esecuzione di un'immagine Docker
L'immagine è ora pronta per essere distribuita. La docker run
il sottocomando avvia il contenitore:
sudo docker run --name apache2 legacyapp
Il --name
argomento fornisce al contenitore un nome univoco, mentre legacyapp
argomento rappresenta il nome dell'immagine della finestra mobile statica che abbiamo creato.
Per visualizzare un elenco di contenitori che sono stati avviati e rimossi, digita il seguente comando:
docker ps -a
L'output fornisce una panoramica insieme a un ID e allo stato del contenitore.
Vai a localhost per verificare se la tua app viene servita correttamente dal server Apache.