Por que os contêineres são importantes?

Concluído

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êineres no 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 desafiadoras na 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. Paulo reuniu alguns importantes stakeholders da equipe do site do Space Game para obter feedback para uma apresentação futura à gerência.

Paulo: Obrigado por passarem aqui. Sei que as últimas semanas foram difíceis para todos, mas tenho boas notícias. A gerência agendou um compromisso externo amanhã para ouvir propostas sobre as alterações que podemos fazer para aprimorar o desempenho. A gerência me convidou a apresentar um estudo de caso sobre nossos sucessos de DevOps e informou que também está aberta a outras ideias que possamos ter. Espero que possamos usar essa reunião como uma oportunidade para fazer um brainstorm. Quem quer começar?

Todos olham para Marina. Ela está bastante frustrada ultimamente.

Marina: Eu começo. Como você já sabe, eu realizo testes para várias equipes, o que pode ser desafiador porque cada equipe usa sua própria pilha de tecnologia. Mesmo para equipes que usam as mesmas plataformas subjacentes, como .NET ou Java, geralmente elas são direcionadas a versões diferentes. Às vezes sinto que passei a metade do dia simplesmente colocando ambientes de teste em um estado em que 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 configurei por engano a versão 4.2.3, em vez de 4.3.2.

Paulo escreve "Desafios de controle de versão de dependência para controle de qualidade" no quadro de comunicações.

Pedro: Gostaria de adicionar operações a essa frustração. Temos algumas equipes que têm requisitos de versão exclusivos, portanto, precisamos publicar os aplicativos delas nas próprias máquinas virtuais para garantir que os requisitos de versão e de componente não entrem em conflito com outros aplicativos. Além da sobrecarga envolvida na manutenção do conjunto extra de VMs, o custo também é maior do que se esses aplicativos pudessem ser executados lado a lado.

Paulo escreve "Sobrecarga devido à solução de isolamento de aplicativo com VMs" no quadro de comunicações.

Clara: Quero mencionar algo do lado de desenvolvimento. Há algumas semanas, estava trabalhando no sistema de atualização ponto a ponto e estava tudo funcionando no meu computador. Porém, quando entreguei para a implantação, não funcionou em produção. Esqueci que precisava abrir a porta 315 como parte do serviço. Foi necessário um dia inteiro de solução de problemas para perceber o que estava acontecendo. Depois de abri-la na produção, tudo funcionou conforme o esperado.

Paulo escreve "Inconsistências de configuração entre as fases de implantação" no quadro de comunicações.

Paulo: Acho que essa conversa é um bom começo. Vou pesquisar esses problemas e ver o que posso fazer. Aqui estão as preocupações que ouvi:

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

Juntando tudo (em um contêiner)

Na manhã seguinte, Paulo faz uma reunião para apresentar uma nova ideia à equipe.

Paulo: Falei com alguns colegas ontem sobre os desafios que estamos enfrentando e que eles deram sugestões interessantes. A que estou empolgado em experimentar é o Docker. É uma tecnologia para empacotar aplicativos inteiros como contêineres.

Marina: O que é um contêiner? É como um arquivo .zip?

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

Pedro: Como ele lida com segurança e isolamento?

Paulo: Segurança e isolamento são tratados pelo sistema operacional do host. Quando 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 qualquer versão dos componentes de que precisa, independentemente do que os outros contêineres estão fazendo. Isso também significa que você pode facilmente executar vários contêineres no mesmo host ao mesmo tempo.

Marina: Isso parece ótimo para o ambiente de produção, mas resolve os desafios que estamos enfrentando anteriormente no pipeline?

Paulo: 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 Clara está desenvolvendo, as sessões de depuração são executadas localmente no contêiner hospedado no computador dela. Quando Marina testa, ela faz isso com relação a uma cópia do mesmo contêiner, que já inclui todas as versões necessárias de suas dependências. Quando Pedro 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 por Marina.

Clara: Qual é a dificuldade de desenvolver um aplicativo de contêiner? Precisamos fazer alterações significativas ao nosso código?

Paulo: Os contêineres são mais como 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 depuramos, o aplicativo é executado fora desse contêiner local em vez de nosso servidor Web local. Na verdade, ferramentas como o Visual Studio permitem inclusive que você alterne entre ambientes de depuração como Docker e IIS Express para dar a flexibilidade necessária. Eu criei o fork do projeto do site na noite passada e o converti para compilar como um contêiner do Docker para testar o processo. Eu precisei adicionar apenas uma configuração básica de contêiner. Não foi preciso alterar nenhum código.

Clara: É bom saber. Aposto que podemos até mesmo atualizar o pipeline de lançamento no Azure Pipelines para compilar e implantar a versão do Docker.

Paulo: Você leu meus pensamentos.

O que é o Docker?

O Docker é uma tecnologia para automatizar o empacotamento e a implantação de contêineres portáteis e autônomos. 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 oferece 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 este cenário porque ele atendeu a todas as suas necessidades:

  • Desafios de 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 de suas 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: 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 uma etapa importante para uma arquitetura de microsserviços. Vamos discutir mais sobre isso posteriormente.

Verificar seu conhecimento

1.

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

2.

Quais são as semelhanças entre contêineres e máquinas virtuais?

3.

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