Por que os contêineres são importantes?
- 7 minutos
Nesta unidade, você seguirá a equipe da Tailspin enquanto eles discutem algumas melhorias necessárias para o processo de DevOps. Nesse cenário, a equipe usa o Docker para colocar em contêiner seu aplicativo Web. Em seguida, a equipe atualiza o pipeline de CI/CD para dar suporte a ele.
Foram algumas semanas difíceis.
As últimas semanas foram um momento desafiador em Tailspin. As equipes lutam para cumprir prazos por uma série de razões, e houve preocupação com a produtividade em toda a empresa. Andy reuniu alguns dos principais stakeholders da equipe do site do Space Game para coletar feedback para uma apresentação futura à gestão.
Andy: Obrigado por passar por aqui. Sei que as últimas semanas foram difíceis para todos, mas tenho boas notícias. A gerência realizará uma reunião fora do escritório amanhã para ouvir propostas sobre mudanças que podemos implementar para melhorar o desempenho. Eles me convidaram para apresentar um estudo de caso sobre nossos sucessos do DevOps e disseram que também estão abertos a qualquer outra ideia que possamos ter. Esperava que pudéssemos usar esta reunião como uma oportunidade para discutir. Quem quer ir primeiro?
Todo mundo olha para Amita. Ela tem estado especialmente frustrada ultimamente.
Amita: Eu vou primeiro. Como você sabe, eu testo para várias equipes, e pode ser desafiador porque cada equipe usa seu próprio stack de tecnologia. Mesmo quando usam as mesmas plataformas subjacentes, como .NET ou Java, elas geralmente visam versões diferentes. Eu 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 eu preciso testar. Quando algo não funciona, é difícil dizer se há um bug no código ou se configurei acidentalmente a versão 4.2.3 em vez da 4.3.2.
Paulo escreve “Desafios do controle de versão de dependência para a garantia de qualidade” no quadro de comunicações.
Pedro: Gostaria de adicionar operações a essa frustração. Temos algumas equipes com requisitos de versão exclusivos, portanto, temos que publicar seus aplicativos em suas próprias máquinas virtuais apenas para garantir que seus requisitos de versão e componente não entrem em conflito com nossos outros aplicativos. Além da sobrecarga envolvida na manutenção do conjunto extra de VMs, isso também nos custará mais do que se esses aplicativos pudessem ser executados lado a lado.
Paulo escreve “Sobrecarga devido à resolução do isolamento de aplicativo com VMs” no quadro de comunicações.
Clara: Quero mencionar algo do lado de desenvolvimento. Algumas semanas atrás, eu estava trabalhando no sistema de atualização ponto a ponto e tinha tudo funcionando na minha máquina. Mas quando o entreguei para implantação, não funcionou em 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 essa conversa é um bom começo. Deixe-me pesquisar essas questões e ver o que posso inventar. Aqui estão as preocupações que ouvi:
- Desafios do controle de versão de dependência para a garantia de qualidade
- Sobrecarga devido a resolver o isolamento dos aplicativos com VMs.
- Inconsistências de configuração entre estágios de implantação
Colocando tudo junto (em um contêiner)
Na manhã seguinte, Andy chama 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 empacotar aplicativos inteiros como contêineres.
Amita: O que é um contêiner? É como um arquivo .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, ele não é um sistema virtualizado completo, portanto, pode ser criado em um pouco menos de um segundo.
Tim: Como ele lida com a segurança e o isolamento?
Andy: A segurança e o isolamento são tratados pelo sistema operacional host. Quando o contêiner é executado em um processo de host, o contêiner é isolado dos outros processos no mesmo computador host. Esse isolamento permite que o contêiner carregue todas as versões dos componentes necessários, independentemente do que outros contêineres estão fazendo. Isso também significa que você pode executar facilmente vários contêineres no mesmo host simultaneamente.
Amita: Isso parece ótimo para o ambiente de produção, mas isso resolve os desafios que estamos enfrentando anteriormente no pipeline?
Andy: Absolutamente! 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 Clara está fazendo o desenvolvimento, as sessões de depuração são executadas localmente no contêiner hospedado no computador dela. Quando Marina realiza o teste, ela faz isso em uma cópia do mesmo contêiner, que já inclui todas as versões necessárias das dependências. Quando Tim gerencia nosso ambiente de produção, os contêineres que ele monitora são cópias autônomas dos mesmos contêineres desenvolvidos por Clara e testados pela Amita.
Mara: Qual é a dificuldade de desenvolver um aplicativo de contêiner? Precisamos fazer alterações significativas em 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 a produzir um contêiner do Docker no final do build. Em seguida, quando fazemos a depuramos, o aplicativo é executado fora desse contêiner local em vez do servidor Web local. Na verdade, ferramentas como o Visual Studio até permitem alternar entre ambientes de depuração como o Docker e o IIS Express para nos dar a flexibilidade necessária. Na verdade, criei o fork do projeto do site ontem à noite e o converti para ser compilado 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 precisava alterar nenhum dos nossos códigos existentes.
Mara: Isso é ótimo saber. Aposto que podemos até atualizar o pipeline de lançamento no Azure Pipelines para compilar e implantar a versão do Docker.
Andy: Você leu minha mente.
O que é o Docker?
O Docker é uma tecnologia para automatizar o empacotamento e a implantação de contêineres portáteis e auto-suficientes. Os contêineres do Docker podem ser executados em qualquer lugar onde um host do Docker for encontrado, seja em um computador de desenvolvimento, em um servidor departamental, em 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 da Tailspin selecionou contêineres do Docker para esse cenário porque atendeu a todas as suas necessidades:
Desafios do controle de versão de dependência para a garantia de qualidade: Os aplicativos são empacotados como contêineres que acompanham as versões corretas das respectivas dependências.
Sobrecarga devido à resolução do isolamento do aplicativo com VMs: muitos contêineres isolados podem ser executados no mesmo host com benefícios em máquinas virtuais, incluindo tempo de inicialização mais rápido para maior eficiência de recursos.
Inconsistências de configuração entre estágios de DevOps: 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 tarde.