Perché i contenitori sono importanti?
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 contenere la sua applicazione Web. Aggiornano quindi la pipeline CI/CD per supportarla.
Sono state settimane complicate
Le ultime settimane non sono state facili per Tailspin. I team faticano a rispettare le scadenze per diversi motivi e c'è stata preoccupazione per la produttività in tutta l'azienda. Andy ha riunito alcuni stakeholder principali del team del sito Web Space Game per raccogliere commenti e feedback per una presentazione imminente alla direzione.
Andy: Grazie per la visita. So che le ultime settimane sono state difficili per tutti, ma ho buone notizie. La direzione ha organizzato un incontro fuori sede per domani per ascoltare proposte sulle modifiche che possiamo fare per migliorare le prestazioni. Mi hanno invitato a presentare un case study sui successi che abbiamo ottenuto con DevOps e sostengono anche di essere aperti ad altre idee. Vorrei approfittare di questo incontro per fare un brainstorming. Chi vuole iniziare?
Tutti guardano Anita. Ultimamente è stata particolarmente frustrata.
Amita: Inizio io. 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 sembra di passare metà giornata a cercare di preparare gli ambienti di test in modo che possano eseguire il codice che devo testare. Quando qualcosa non funziona, è difficile capire se è presente un bug nel codice o se per sbaglio ho configurato la versione 4.2.3 invece della 4.3.2.
Andy scrive "Problemi di controllo delle versioni delle dipendenze per il controllo di qualità" sulla lavagna.
Tim: Desidero aggiungere altre operazioni a questo problema. Alcuni team hanno requisiti di versione univoci, quindi dobbiamo pubblicare le loro app nelle loro macchine virtuali in modo da essere sicuri che i requisiti di versione e componenti non entrino in conflitto con quelli di altre app. Oltre al sovraccarico per la gestione del set aggiuntivo di macchine virtuali, se queste app potessero essere eseguite in modalità affiancata, il costo sarebbe minore.
Andy scrive "Sovraccarico per risolvere l'isolamento delle app nelle macchine virtuali" sulla lavagna.
Mara: Ho qualcosa da dire per quanto riguarda lo il lato sviluppo. Alcune settimane fa stavo lavorando al sistema di aggiornamento peer-to-peer e tutto funzionava nel mio computer. Quando poi l'ho distribuito, in produzione non funzionava. Avevo dimenticato di aprire la porta 315 come parte del servizio. Ci siamo resi conto del problema dopo una giornata intera di tentativi. Alla fine, quando l'abbiamo aperto in produzione, tutto ha funzionato correttamente.
Andy scrive "Incoerenze di configurazione tra le fasi di distribuzione" sulla lavagna.
Andy: Credo che questa conversazione sia un buon punto di partenza. Approfondirò questi problemi e vediamo cosa riesco a fare. Questo è quello che ho sentito:
- Problemi di controllo delle versioni delle dipendenze per il controllo di qualità
- Sovraccarico dovuto alla risoluzione dell'isolamento delle app con le macchine virtuali
- Incoerenze di configurazione tra le fasi di distribuzione
Riunendo il tutto (in un unico contenitore)
Il mattino successivo, Andy organizza una riunione per presentare una nuova idea al team.
Andy: Ieri ho parlato delle difficoltà che stiamo incontrando con alcuni colleghi che mi hanno fornito spunti interessanti. Sarei lieto di provare Docker. Si tratta di una tecnologia per la creazione di pacchetti come contenitori per applicazioni intere.
Amita: Cos'è un'immagine del contenitore? È come un file .zip?
Andy: Non esattamente. È più simile a una macchina virtuale leggera progettata per essere eseguita direttamente sul sistema operativo host. Quando si compila il progetto, l'output è un contenitore che include il software e le relative dipendenze. Tuttavia, non si tratta di un sistema virtualizzato completo, quindi può essere avviato in meno di un secondo.
Tim: In che modo è in grado di gestire la sicurezza e l'isolamento?
Andy: Sicurezza e isolamento vengono gestiti dal sistema operativo host. Quando il contenitore viene eseguito in un processo host è isolato dagli altri processi dello stesso computer host. Questo isolamento consente al contenitore di caricare tutte le versioni dei componenti necessari, indipendentemente dalle operazioni svolte da altri contenitori. Significa anche che è possibile eseguire facilmente più contenitori nello stesso host simultaneamente.
Amita: Sembra fantastico per l'ambiente di produzione, ma ci consente di risolvere i problemi che troviamo nelle fasi precedenti della pipeline?
Andy: Assolutamente sì! Anziché inviare il codice sorgente o un set di file binari, l'artefatto è l'intero contenitore. Ciò significa che quando Mara sta sviluppando, le sessioni di debug vengono eseguite localmente nel contenitore ospitato nel suo computer. 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 che monitora sono copie autonome degli stessi contenitori sviluppati da Mara e testati da Amita.
Mara: Quanto è difficile sviluppare un'applicazione contenitore? Sono necessarie modifiche importanti al nostro codice?
Andy: I contenitori sono più di una tecnologia per la creazione di pacchetti e la distribuzione. Non influiscono sul software fondamentale che stiamo sviluppando. Ci basta configurare gli strumenti in modo che producano un contenitore Docker alla fine della compilazione. Quindi, quando si esegue il debug, l'applicazione esce dal contenitore locale anziché dal server Web locale. Inoltre, strumenti come Visual Studio consentono anche di alternare ambienti di debug come Docker e IIS Express per migliorare la flessibilità. La scorsa notte, ho creato una copia tramite fork del progetto del nostro sito Web e ho convertito la copia in un contenitore Docker per testare il processo. Mi sono bastate poche configurazioni di base del contenitore, non ho dovuto modificare affatto il codice esistente.
Mara: Bene, ottime notizie. Scommetto che possiamo anche aggiornare la pipeline di versione in Azure Pipelines dalla copia per compilare e distribuire la versione Docker.
Andy: Mi hai letto nel pensiero.
Che cos'è Docker?
Docker è una tecnologia per automatizzare la creazione di pacchetti e la distribuzione di contenitori portatili e 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, incluso 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é soddisfano tutte le esigenze:
Problemi di controllo delle versioni delle dipendenze per qa: le applicazioni vengono incluse come contenitori che portano le versioni corrette delle relative 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 passaggio chiave verso un'architettura di microservizi. Questo argomento verrà affrontato più avanti.