Perché i contenitori sono importanti?
- 7 minuti
In questa unità si seguirà il team di Tailspin durante la discussione di alcuni miglioramenti molto necessari per il processo DevOps. In questo scenario, il team usa Docker per inserire in contenitori l'applicazione Web. Il team aggiorna quindi la pipeline CI/CD per supportarla.
Sono state poche settimane difficili
Le ultime settimane sono state un momento impegnativo a Tailspin. I team faticano a rispettare le scadenze per diversi motivi e c'è stata preoccupazione per la produttività in tutta l'azienda. Andy ha chiamato alcuni stakeholder chiave del team del sito Web di Space Game insieme per raccogliere feedback per una presentazione futura alla gestione.
Andy: Grazie per essere passato. So che le ultime settimane sono state difficili per tutti, ma ho delle buone notizie. La direzione terrà un meeting fuori sede domani per ascoltare le proposte sui cambiamenti che possiamo attuare per migliorare le prestazioni. Mi hanno invitato a presentare un case study sui nostri successi DevOps e hanno detto che sono anche aperti a qualsiasi altra idea che potremmo avere. Speravo che potessimo usare questa riunione come un'opportunità di brainstorming. Chi vuole andare per primo?
Tutti guardano Amita. È stata particolarmente frustrata ultimamente.
Amita: Vado prima. Come sapete, testo per più team e può essere difficile perché ogni team usa il proprio stack tecnologico. Anche quando usano le stesse piattaforme sottostanti, ad esempio .NET o Java, spesso hanno come destinazione versioni diverse. A volte mi sento di trascorrere metà del mio giorno semplicemente ottenendo ambienti di test in uno stato in cui possono eseguire il codice che devo testare. Quando qualcosa non funziona, è difficile stabilire se è presente un bug nel codice o se è stata configurata accidentalmente la versione 4.2.3 anziché 4.3.2.
Andy scrive "Sfide di versionamento delle dipendenze per QA" sulla lavagna.
Tim: Vorrei aggiungere le operazioni a questa frustrazione. Abbiamo alcuni team con requisiti di versione univoci, quindi dobbiamo pubblicare le app nelle proprie macchine virtuali solo per garantire che i requisiti di versione e componenti non siano in conflitto con le altre app. Oltre al sovraccarico dovuto alla gestione del set aggiuntivo di macchine virtuali, costa anche più di quanto sarebbe se tali app potessero essere eseguite side-by-side.
Andy scrive "Sovraccarico per risolvere l'isolamento delle app nelle macchine virtuali" sulla lavagna.
Mara: Ho qualcosa da dire dal lato dello sviluppo. Alcune settimane fa, stavo lavorando al sistema di aggiornamento peer-to-peer e funzionava correttamente sul mio computer, ma quando è stato distribuito per la produzione, non ha funzionato. Ho dimenticato che avevo bisogno di aprire la porta 315 come parte del servizio. Abbiamo impiegato più di un giorno per risolvere i problemi e capire cosa stava succedendo. Una volta aperto in produzione, le cose funzionavano come previsto.
Andy scrive "Incoerenze di configurazione tra le fasi di distribuzione" nella lavagna.
Andy: Penso che questa conversazione sia un buon inizio. Lasciatemi cercare questi problemi e vedere cosa posso trovare. Ecco le preoccupazioni che ho sentito:
- Problemi di controllo delle versioni delle dipendenze per l’Agente quarantena
- Sovraccarico dovuto alla risoluzione dell'isolamento delle app con le macchine virtuali
- Incoerenze di configurazione tra le fasi di distribuzione
Mettere tutto insieme (in un unico contenitore)
La mattina successiva, Andy chiama una riunione per presentare una nuova idea al team.
Andy: Ho parlato con alcuni colleghi ieri sulle sfide che stiamo affrontando, e hanno fatto alcuni suggerimenti interessanti. Quello che sono entusiasta di provare è Docker. Si tratta di una tecnologia per il packaging di intere applicazioni come container.
Amita: Che cos'è un contenitore? È un file simile a .zip?
Andy: Non esattamente. È più simile a una macchina virtuale leggera progettata per l'esecuzione direttamente nel sistema operativo host. Quando si compila il progetto, l'output è un contenitore che include il software e le relative dipendenze. Tuttavia, non è un sistema completamente virtualizzato, quindi può avviarsi in meno di un secondo.
Tim: Come gestisce la sicurezza e l'isolamento?
Andy: La sicurezza e l'isolamento vengono gestiti dal sistema operativo host. Quando il contenitore viene eseguito in un processo host, il contenitore viene isolato dagli altri processi nello stesso computer host. Questo isolamento consente al contenitore di caricare le versioni dei componenti necessarie, indipendentemente dalle operazioni eseguite da altri contenitori. Significa anche che è possibile eseguire facilmente più contenitori nello stesso host contemporaneamente.
Amita: Sembra molto utile per l'ambiente di produzione, ma risolve le sfide affrontate in precedenza nella pipeline?
Andy: Assolutamente! Anziché spedire il codice sorgente o un set di file binari, l'intero contenitore diventa l'artefatto. Ciò significa che quando Mara sta sviluppando, le sue sessioni di debug vengono eseguite localmente contro il contenitore ospitato sulla sua macchina. Quando Amita testa, lo fa su una copia dello stesso contenitore che include già tutte le versioni necessarie delle relative dipendenze. Quando Tim gestisce l'ambiente di produzione, i contenitori monitorati sono copie autonome degli stessi contenitori sviluppati da Mara e testati da Amita.
Mara: Quanto è difficile sviluppare un'applicazione contenitore? È necessario apportare modifiche significative al codice esistente?
Andy: I contenitori sono più una tecnologia di creazione di pacchetti e distribuzione. Non influiscono sul software fondamentale che stiamo scrivendo. È sufficiente indicare agli strumenti di produrre un contenitore Docker alla fine della compilazione. Quindi, quando si esegue il debug, l'applicazione esce dal contenitore locale anziché dal server Web locale. Infatti, strumenti come Visual Studio consentono anche di passare da un ambiente di debug all'altro, ad esempio Docker e IIS Express, per offrire la flessibilità necessaria. Ho effettivamente creato un fork del progetto del sito web ieri sera e l'ho convertito per costruirlo come container Docker per testare il processo. Ho solo bisogno di aggiungere una configurazione del contenitore di base; Non è stato necessario modificare alcun codice esistente.
Mara: È fantastico saperlo. Scommetto che possiamo persino aggiornare la pipeline di rilascio in Azure Pipelines dalla tua fork per costruire e distribuire la versione Docker.
Andy: Hai letto la mia mente.
Che cos'è Docker?
Docker è una tecnologia per automatizzare la creazione di pacchetti e la distribuzione di contenitori portabili autosufficienti. I contenitori Docker possono essere eseguiti ovunque si trovi un host Docker, sia in un computer di sviluppo, in un server di reparto, in un data center aziendale o nel cloud. Azure offre diversi modi per eseguire applicazioni basate su contenitori, tra cui il servizio app o come parte di cluster gestiti con tecnologie di orchestrazione come Kubernetes.
Il team di Tailspin ha selezionato i contenitori Docker per questo scenario perché soddisfa tutte le proprie esigenze:
Problemi di controllo delle versioni delle dipendenze per QA: le applicazioni vengono distribuite in contenitori che portano con sé le versioni corrette delle loro dipendenze.
Sovraccarico dovuto alla risoluzione dell'isolamento delle app con le macchine virtuali: molti contenitori isolati possono essere eseguiti nello stesso host con vantaggi sulle macchine virtuali, tra cui tempi di avvio più rapidi per una maggiore efficienza delle risorse.
Incoerenze di configurazione tra le fasi devOps: i contenitori vengono forniti con manifesti che automatizzano i requisiti di configurazione, ad esempio le porte da esporre.
L'adozione di contenitori Docker può essere un passo chiave verso un'architettura di microservizi. Più avanti verranno illustrate altre informazioni.