GNU/Linux >> Linux Esercitazione >  >> Linux

Come containerizzare le applicazioni legacy

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:

1. Riscrivi e riprogetta completamente la tua applicazione precedente.

2. Esegui un'applicazione monolitica esistente all'interno di un singolo contenitore.

3. Aumenta e rimodella le applicazioni in modo che possano trarre vantaggio dalla nuova architettura distribuita.

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:

  1. Utilizza un'immagine vuota e aggiungi livelli aggiuntivi importando una serie di file esterni.
  2. Utilizza la riga di comando per inserire in modo interattivo i singoli comandi Docker e creare una nuova immagine con docker commit .
  3. Utilizza un sofisticato strumento di gestione della configurazione (ad es. come Puppet e Chef) per implementazioni complesse.
  4. 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 .
  1. La docker build Il comando indica al demone Docker di creare un'immagine basata sul Dockerfile.
  2. Il percorso fornito alla docker build comando viene utilizzato per caricare file e directory.
  3. Ogni fase di compilazione è numerata mentre il demone Docker procede con l'esecuzione dei comandi dal Dockerfile.
  1. Ogni comando genera una nuova immagine. E l'ID immagine viene visualizzato sullo schermo.
  2. 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.


Linux
  1. Come migliorare il tempo di avvio dell'applicazione in Linux

  2. Come usare Podman all'interno di un contenitore

  3. Come modificare le applicazioni predefinite di Debian

  4. Come installare l'applicazione Spotify su Linux

  5. In che modo i file delle app reciprocamente non attendibili sono protetti in Linux?

Come aggiungere un'applicazione nell'elenco delle applicazioni aperte in Ubuntu

Come aggiungere un'applicazione all'elenco delle applicazioni aperte?

Come creare un contenitore dell'applicazione Django Docker

Come SSH in un Docker Container

Come distribuire rapidamente applicazioni full-stack con i modelli di applicazione Portainer

Come gestire i container Docker