[:pb]Um contêiner é uma unidade padrão de software, que empacota o código e todas as suas dependências, para que um aplicativo seja executado de maneira rápida e confiável quando movido de um ambiente de computação para outro. Uma imagem de contêiner é um pacote de software leve, independente e executável, que inclui tudo o necessário para executar um aplicativo: código, runtime, ferramentas do sistema, bibliotecas e configurações do sistema.

A conteinerização de aplicativos é um método de virtualização no nível do sistema operacional, usado para implantar e executar aplicativos distribuídos, sem iniciar uma máquina virtual (VM) inteira para cada aplicativo. Vários aplicativos ou serviços isolados são executados em um único host e acessam o mesmo kernel do sistema operacional. Os contêineres trabalham em sistemas bare-metal (servidores físicos de inquilino único ou servidores dedicados), instâncias em nuvem e máquinas virtuais, no Linux e alguns sistemas operacionais Windows e Mac.

 

Como a conteinerização de aplicativos funciona

 

Os contêineres de aplicativos consomem menos recursos do que uma implantação semelhante em máquinas virtuais, porque os contêineres compartilham recursos sem um sistema operacional completo para sustentar cada aplicativo. O conjunto completo de informações a serem executadas em um contêiner é uma imagem. O mecanismo de contêiner implementa essas imagens nos hosts.

A tecnologia de contêiner de aplicativos mais comum é o Docker, especificamente o Docker Engine de código aberto e os contêineres baseados no runtime universal runC. O Docker Swarm é uma ferramenta de cluster e agendamento, com a qual os administradores e desenvolvedores de TI podem definir e gerenciar um cluster de nós do Docker como um único sistema virtual.

O produto mais competitivo é o mecanismo de contêiner rkt do CoreOS, que se baseia nas especificações do App Container (appc) como seu formato padrão de contêiner aberto, mas também pode executar imagens de contêiner do Docker. Existe uma preocupação por parte de usuários e parceiros do ecossistema em ficar dependentes de fornecedores de conteinerização de aplicativos, mas isso é amenizado, em parte, pela grande quantidade de tecnologia de código aberto que apoia os produtos de contêiner.

A conteinerização de aplicativos trabalha com microsserviços e aplicativos distribuídos, pois cada contêiner opera independentemente de outros e utiliza recursos mínimos do host. Cada microsserviço se comunica com outros, por meio de interfaces de programação de aplicativos, com a camada de virtualização de contêiner capaz de expandir os microsserviços para atender à crescente demanda por um componente de aplicativo e distribuir a carga.

Com a virtualização, os desenvolvedores podem apresentar um conjunto de recursos físicos como máquinas virtuais descartáveis. Essa configuração também incentiva a flexibilidade. Por exemplo, se um desenvolvedor desejar obter uma variação da imagem padrão, ele poderá criar um contêiner que contenha apenas a nova biblioteca em um ambiente virtualizado.

Para atualizar um aplicativo, um desenvolvedor pode fazer alterações no código da imagem do contêiner e reimplementar essa imagem para execução no sistema operacional host.

 

Conteinerização de aplicativos x contêineres de virtualização e de sistemas

 

A virtualização de um servidor separa o sistema operacional e o aplicativo, do hardware ou dos recursos virtuais subjacentes. Uma camada de hipervisor existe entre a memória, a computação e o armazenamento, e o sistema operacional, os aplicativos e os serviços.

Cada aplicativo é executado na sua própria versão de sistema operacional. Isso permite que aplicativos diferentes no mesmo host usem versões diferentes de sistema operacional, mas também consome mais recursos do que contêineres e exige mais licenças de sistemas operacionais do que uma configuração em contêiner.

Contêineres podem ser executados dentro de máquinas virtuais, o que significa que uma máquina host pode ter vários sistemas operacionais rodando vários contêineres, todos compartilhando os mesmos recursos físicos. Os contêineres de aplicativos criam um espaço seguro para o código dos aplicativos consumirem recursos do host, sem reconhecer ou depender da existência de outros aplicativos usando o mesmo sistema operacional.

Contêineres de sistema desempenham uma função semelhante às máquinas virtuais, mas sem a virtualização de hardware. Os contêineres de sistema, também chamados de contêineres de infraestrutura, incluem o sistema operacional do host, as bibliotecas de aplicativos e o código de execução. Os contêineres de sistema podem hospedar contêineres de aplicativos.

Embora os contêineres de sistema também dependam de imagens, eles geralmente permanecem ativos por mais tempo e não são efêmeros como os contêineres de aplicativos. Um administrador pode atualizar e alterar contêineres de sistema com ferramentas de gerenciamento de configuração, em vez de destruir e reconstruir imagens quando ocorre uma alteração.

 

 

 

Figura. Os contêineres não consomem tanto espaço quanto as máquinas virtuais porque cada contêiner compartilha o sistema operacional do host.

 

 

Benefícios e desvantagens da conteinerização de aplicativos

Os defensores da conteinerização apontam para ganhos de eficiência em memória, CPU e armazenamento, em comparação com a virtualização tradicional e a hospedagem de aplicativos físicos. Sem a sobrecarga exigida pelas VMs, é possível suportar muitos mais contêineres de aplicativos na mesma infraestrutura.

 

Portabilidade é outro benefício. Desde que o sistema operacional seja o mesmo nos sistemas, um contêiner de aplicativos pode ser executado em qualquer sistema e em qualquer nuvem, sem exigir alterações no código. Não há variáveis de ambiente do sistema operacional hospedado ou dependências da biblioteca para gerenciar.

 

Reprodutibilidade é outra vantagem das aplicações em contêiner, e é uma das razões pelas quais a adoção do contêiner geralmente coincide com o uso de uma metodologia DevOps. Durante todo o ciclo de vida do aplicativo, da criação do código ao teste e produção, os sistemas de arquivos, os binários e outras informações permanecem os mesmos. Todos os componentes do desenvolvimento se tornam uma imagem. O controle de versão no nível da imagem substitui o gerenciamento de configuração no nível do sistema.

 

Uma desvantagem potencial da conteinerização é a falta de isolamento do sistema operacional principal. Como os contêineres de aplicativos não são isolados do sistema operacional host em uma VM, alguns especialistas alertam que as ameaças à segurança têm acesso mais fácil a todo o sistema.

Os scanners de segurança e as ferramentas de monitoramento podem proteger o hipervisor e o sistema operacional, mas não os contêineres de aplicativos. Por outro lado, a conteinerização também oferece benefícios de segurança, devido ao maior isolamento dos pacotes de aplicativos e de sistemas operacionais mais especializados e de menor tamanho que os executam. Devem ser definidas políticas para determinar os níveis de privilégio dos contêineres para criar implantações seguras.

A conteinerização de aplicativos é uma metodologia corporativa de TI relativamente nova e em rápido desenvolvimento, que gera mudanças e instabilidade. Melhorias na tecnologia podem solucionar bugs e aumentar a estabilidade da tecnologia de contêineres. Outro ponto negativo da conteinerização é a falta de profissionais capacitados. Em comparação com o campo de virtualização de servidores, há uma escassez de administradores que entendam os contêineres e como trabalhar com eles.

A dependência de um sistema operacional também pode representar um problema, mas os desenvolvedores já estão escrevendo aplicativos para serem executados em sistemas operacionais específicos. Se uma empresa precisar executar um aplicativo Windows em contêiner localizado em servidores Linux, ou vice-versa, uma camada de compatibilidade ou máquinas virtuais interligadas resolveria o problema, mas isso aumentaria a complexidade e o consumo de recursos.

 

Conclusão

 

A conteinerização é uma tendência importante no desenvolvimento de software e sua adoção provavelmente aumentará em volume e velocidade. Grandes players como Google e IBM estão fazendo grandes apostas em contêineres. Além disso, um enorme ecossistema está se formando para possibilitar a conteinerização.

Os defensores da conteinerização acreditam que ela permite aos desenvolvedores criar e implantar aplicativos de forma mais rápida e segura do que os métodos tradicionais.

Embora a conteinerização ainda seja cara, espera-se que seus custos caiam significativamente à medida que os ambientes de conteinerização se desenvolvam e amadureçam. É provável que a conteinerização se torne um novo padrão para o desenvolvimento de software.

Os desafios para estruturação e execução do seu projeto podem ser superados com o acompanhamento de uma consultoria experiente, para desenvolver uma estratégia e um planejamento adequados, que oriente tanto as decisões referentes às soluções técnicas e conceituais, visando atender as necessidades corporativas com o melhor retorno sobre o investimento.

 [:]