Porque é que os contentores são importantes?

Concluído

Nesta unidade, você seguirá a equipe do Tailspin enquanto eles discutem algumas melhorias muito necessárias para seu processo de DevOps. Nesse cenário, a equipe usa o Docker para contêinerizar seu aplicativo Web. Em seguida, a equipe atualiza seu pipeline de CI/CD para suportá-lo.

Foram algumas semanas difíceis

As últimas semanas têm sido desafiadoras na Tailspin. As equipes lutam para cumprir os prazos por vários motivos, e tem havido preocupação com a produtividade em toda a empresa. Andy chamou algumas das principais partes interessadas da equipe do site Space Game para coletar feedback para uma próxima apresentação à gerência.

Andy: Obrigado por passar. Sei que as últimas semanas foram difíceis para todos, mas tenho boas notícias. A administração está realizando um evento externo amanhã para ouvir propostas sobre mudanças que podemos fazer para melhorar o desempenho. Eles me convidaram para apresentar um estudo de caso sobre nossos sucessos de DevOps e disseram que também estão abertos a quaisquer outras ideias que possamos ter. Eu esperava que pudéssemos usar esta reunião como uma oportunidade para fazer um brainstorming. Quem quer ir primeiro?

Todos olham para Amita. Ela tem sido especialmente frustrada ultimamente.

Amita: Eu vou primeiro. Como você sabe, eu teste para várias equipes, e isso pode ser desafiador porque cada equipe usa sua própria pilha de tecnologia. Mesmo quando usam as mesmas plataformas subjacentes, como .NET ou Java, geralmente têm como alvo versões diferentes. Sinto que, às vezes, passo metade do meu dia simplesmente obtendo ambientes de teste em um estado onde eles podem executar o código que preciso testar. Quando algo não funciona, é difícil dizer se há um bug no código ou se eu acidentalmente configurei a versão 4.2.3 em vez da 4.3.2.

Andy escreve "Dependency versioning challenges for QA" no quadro branco.

Tim: Eu gostaria de adicionar operações a essa frustração. Temos algumas equipes com requisitos de versão exclusivos, então temos que publicar seus aplicativos em suas próprias máquinas virtuais apenas para garantir que seus requisitos de versão e componentes não entrem em conflito com nossos outros aplicativos. Além da sobrecarga envolvida na manutenção do conjunto extra de VMs, também nos custa mais do que se esses aplicativos pudessem ser executados lado a lado.

Andy escreve "Overhead due to solving app isolation with VMs" no quadro branco.

Mara: Eu tenho algo do lado do desenvolvimento. Algumas semanas atrás, eu estava trabalhando no sistema de atualização peer-to-peer e tinha tudo funcionando na minha máquina. Mas quando o entreguei para implantação, ele não funcionou na produção. Eu tinha esquecido que eu precisava abrir a porta 315 como parte do serviço. Levamos mais de um dia de solução de problemas para perceber o que estava acontecendo. Uma vez que abrimos isso na produção, as coisas funcionaram como esperado.

Andy escreve "Inconsistências de configuração entre estágios de implantação" no quadro branco.

Andy: Acho que esta conversa é um bom começo. Deixe-me pesquisar essas questões e ver o que posso inventar. Eis as preocupações que ouvi:

  • Desafios de controle de versão de dependência para controle de qualidade
  • Sobrecarga devido à resolução do isolamento de aplicativos com VMs
  • Inconsistências de configuração entre os estágios de implantação

Juntando tudo (em um recipiente)

Na manhã seguinte, Andy convoca uma reunião para apresentar uma nova ideia à equipe.

Andy: Falei com alguns colegas ontem sobre os desafios que estamos enfrentando, e eles fizeram algumas sugestões interessantes. O que estou animado para experimentar é o Docker. É uma tecnologia para embalar aplicações inteiras como recipientes.

Amita: O que é um contentor? É como um ficheiro .zip ?

Andy: Não exatamente. É mais como uma máquina virtual leve projetada para ser executada diretamente no sistema operacional host. Quando você cria seu projeto, a saída é um contêiner que inclui seu software e suas dependências. No entanto, não é um sistema virtualizado completo, por isso pode girar em menos de um segundo.

Tim: Como lida com a segurança e o isolamento?

Andy: A segurança e o isolamento são tratados pelo sistema operacional do host. Quando o contêiner é executado em um processo de host, o contêiner é isolado dos outros processos na mesma máquina host. Esse isolamento permite que seu contêiner carregue quaisquer versões de componentes necessárias, independentemente do que outros contêineres estejam fazendo. Isso também significa que você pode facilmente executar vários contêineres no mesmo host simultaneamente.

Amita: Isso parece ótimo para o ambiente de produção, mas resolve os desafios que estamos enfrentando no início do pipeline?

Andy: Com certeza! Em vez de enviar o código-fonte ou um conjunto de binários, todo o contêiner se torna o artefato. Isso significa que, quando Mara está desenvolvendo, suas sessões de depuração são executadas localmente no contêiner hospedado em sua máquina. Quando Amita testa, ela testa em uma cópia desse mesmo contêiner, que já inclui todas as versões necessárias de suas dependências. Quando Tim gerencia nosso ambiente de produção, os contêineres que ele monitora são cópias independentes dos mesmos contêineres desenvolvidos pela Mara e testados pela Amita.

Mara: Quão difícil é desenvolver um aplicativo de contêiner? Temos de fazer alterações significativas ao nosso código existente?

Andy: Os contêineres são mais uma tecnologia de empacotamento e implantação. Eles não afetam o software fundamental que estamos escrevendo. Podemos apenas instruir nossas ferramentas para produzir um contêiner Docker no final da compilação. Em seguida, quando depuramos, o aplicativo é executado fora desse contêiner local em vez do nosso servidor Web local. Na verdade, ferramentas como o Visual Studio até permitem que você alterne entre ambientes de depuração como o Docker e o IIS Express para nos dar a flexibilidade de que precisamos. Eu realmente bifurquei nosso projeto de site ontem à noite e o converti para construir como um contêiner do Docker para testar o processo. Eu só precisava adicionar alguma configuração básica de contêiner; Eu não precisei alterar nenhum dos nossos códigos existentes.

Mara: Isso é ótimo saber. Aposto que podemos até atualizar o pipeline de lançamento no Azure Pipelines a partir da sua bifurcação para criar e implantar a versão do Docker.

Andy: Você lê minha mente.

O que é o Docker?

O Docker é uma tecnologia para automatizar o empacotamento e a implantação de contêineres portáteis e autossuficientes. Os contêineres do Docker podem ser executados em qualquer lugar onde um host do Docker seja encontrado, seja em uma máquina de desenvolvimento, um servidor departamental, um datacenter corporativo ou na nuvem. O Azure fornece várias maneiras de executar aplicativos baseados em contêiner, incluindo o Serviço de Aplicativo ou como parte de clusters gerenciados com tecnologias de orquestração, como o Kubernetes.

A equipe do Tailspin selecionou contêineres do Docker para esse cenário porque ele atendia a todas as suas necessidades:

  • Desafios de controle de versão de dependência para QA: os aplicativos são empacotados como contêineres que trazem as versões corretas de suas dependências com eles.

  • Sobrecarga devido à resolução do isolamento de aplicativos com VMs: muitos contêineres isolados podem ser executados no mesmo host com benefícios em relação às máquinas virtuais, incluindo tempo de inicialização mais rápido para maior eficiência de recursos.

  • Inconsistências de configuração entre os estágios de DevOps: os contêineres são enviados com manifestos que automatizam os requisitos de configuração, como quais portas precisam ser expostas.

A adoção de contêineres do Docker pode ser um passo fundamental para uma arquitetura de microsserviços. Discutiremos mais sobre isso mais adiante.

Verifique o seu conhecimento

1.

Qual das seguintes opções não é um bom motivo para usar o Docker?

2.

Como contêineres e máquinas virtuais são semelhantes?

3.

Quanta sobrecarga requer a migração de um aplicativo .NET Core existente para usar um contêiner do Docker?