O que é conteinerização?

23 de maio de 2022 // 13 min read

image

Quando implementado com sucesso, o DevOps pode transformar a confiabilidade do software, tornando o ciclo de vida de desenvolvimento de software (SDLC) mais previsível por meio de uma combinação de práticas culturais e de automação que favorecem a colaboração profunda e lançamentos incrementais. Com menos chance de variação, menos problemas relacionados ao código chegam à produção.

Mas não é apenas no código propriamente dito que esses problemas podem surgir. O que funciona no computador de uma pessoa pode se comportar de forma diferente no laptop de um colega, ou pior ainda, em um servidor de produção. A conteinerização é um tipo de tecnologia que pode ser usada em práticas de DevOps para garantir que o ambiente de software seja consistente de um computador para outro durante as fases de desenvolvimento, teste e produção.

No GitHub, fornecemos ferramentas que ajudam as empresas a adotar e gerenciar contêineres em suas práticas de DevOps. Por meio dessa experiência, identificamos as principais áreas que as organizações precisam levar em consideração para integrar contêineres com sucesso no SDLC.

Neste guia, responderemos às seguintes perguntas:

  • O que é conteinerização?
  • Quais são os benefícios da conteinerização?
  • Qual é o papel da conteinerização em DevOps?
  • Quais são algumas ferramentas comuns de conteinerização?
  • Como o GitHub incorpora ferramentas de conteinerização?

O que é conteinerização?


A conteinerização empacota o código do software com dependências e um sistema operacional na forma de um aplicativo independente que pode ser executado em outro computador. Esses ambientes virtualizados são estruturalmente leves e, de maneira comparativa, exigem pouca potência de computação. Eles também podem ser executados em qualquer infraestrutura subjacente e são portáteis ou podem ser executados consistentemente em qualquer plataforma.


Ao agrupar o código do aplicativo, os arquivos de configuração, bibliotecas do sistema operacional (OS) e todas as dependências, os contêineres ajudam a resolver um problema comum no desenvolvimento de software: o código desenvolvido em um ambiente geralmente manifesta mensagens de bugs e erros quando transferido para outro ambiente. Por exemplo, um desenvolvedor pode criar um código em um ambiente Linux e depois transferi-lo para uma máquina virtual (VM) ou computador Windows e descobrir que esse código não funciona mais como se esperava. Por outro lado, os contêineres são independentes da infraestrutura host e fornecem ambientes de desenvolvimento consistentes.

Mas o que torna os contêineres particularmente úteis é que eles são fáceis de compartilhar. Usando imagens de contêiner (arquivos que atuam como um instantâneo do código, da configuração e de outros dados do contêiner), você pode criar rapidamente ambientes consistentes em cada estágio do SDLC. Isso ajuda as organizações a criar ambientes reproduzíveis que são rápidos e fáceis de trabalhar, desde o desenvolvimento e os testes até a produção.

Conteinerização de aplicativos

Normalmente, um contêiner cuida de apenas uma parte de um aplicativo, e as organizações utilizam diversos contêineres para isolar os componentes do aplicativo e executá-los em conjunto.

Isso pode ser tão simples quanto um contêiner para o servidor de aplicativos no back-end, outro para o sistema de banco de dados e talvez outro executando uma ferramenta de monitoramento. Porém, contêineres também podem ser usados para criar sistemas mais complexos. Em uma arquitetura de microsserviços, por exemplo, pode haver centenas ou até mesmo milhares de contêineres, cada um hospedando uma pequena parte de um aplicativo maior. Para gerenciar tantos contêineres, as equipes recorrem a ferramentas de orquestração de contêineres, como o Kubernetes, que permitem às organizações gerenciar contêineres com mais facilidade em ambientes de produção.

Isolar aplicativos dessa maneira pode facilitar o desenvolvimento de cada parte que os compõe, reduzir o risco de programas acessarem dados sem autorização e escalar para atender à demanda, implantando rapidamente mais contêineres conforme necessário. E como os contêineres incluem apenas os componentes especificamente necessários, há relativamente pouca diferença entre adicionar um novo contêiner e executar o aplicativo diretamente.

Virtualização versus conteinerização: qual é a diferença?

Contêineres geralmente são comparados com máquinas virtuais (VM) devido às semelhanças na forma como abstraem os sistemas operacionais da infraestrutura subjacente e porque às vezes são usados para tarefas semelhantes. Porém, existem diferenças fundamentais na maneira como contêineres e VMs funcionam.

A virtualização permite que as organizações executem diferentes sistemas operacionais e aplicativos ao mesmo tempo, usando a mesma infraestrutura ou recursos de computação. Por exemplo, uma organização pode usar VMs para executar o Windows e o Linux simultaneamente em um único servidor. Cada VM no servidor atua como um ambiente de “computação” autônomo e abstrato e utiliza todos os recursos necessários do servidor, ou computador, subjacente.

Em contraste com as VMs, a conteinerização utiliza os recursos de computação com mais eficiência, agrupando código, arquivos de configuração, bibliotecas e dependências, e não o sistema operacional inteiro. Em vez disso, a conteinerização utiliza um mecanismo de runtime no computador host que compartilha o sistema operacional subjacente em todos os contêineres provisionados.

Ao escolher usar contêineres ou VMs, você deve avaliar as consequências dessas diferenças técnicas. Por exemplo, aplicativos monolíticos de longa execução podem ser mais adequados para uma VM, graças ao seu armazenamento e à sua estabilidade de longo prazo. Por outro lado, contêineres leves são muito mais apropriados para uma arquitetura de microsserviços em que a sobrecarga de muitas VMs seria impraticável.


Conteinerização Virtualização
Sistema operacional (SO) Contêineres usam o SO host, o que significa que todos os contêineres devem ser compatíveis com esse SO. VMs são efetivamente computadores separados que executam seu próprio SO. Por exemplo, uma VM pode executar o Windows mesmo quando o sistema operacional host é o Ubuntu.
Recursos de computação Contêineres são leves, usando apenas os recursos necessários para executar o aplicativo e o gerenciador de contêineres. VMs emulam um computador completo, o que significa que replicam grande parte do ambiente host. Isso usa mais memória, ciclos de CPU e espaço em disco.
Compartilhabilidade Imagens de contêiner são relativamente pequenas, facilitando o compartilhamento. Imagens de VM geralmente são muito maiores, pois incluem um SO completo.
Segurança Contêineres podem ser isolados apenas ligeiramente uns dos outros. Um processo em um contêiner pode acessar a memória usada por outro contêiner, por exemplo. Ao executar um SO separado, as VMs executadas no mesmo hardware ficam mais isoladas umas das outras do que os contêineres.
Orquestração Ferramentas como o Kubernetes tornam relativamente fácil executar vários contêineres juntos, especificando como e quando eles interagem. Ferramentas de gerenciamento de configuração, como o Terraform ou o Ansible, automatizam a implantação e a integração de VMs.
Armazenamento Contêineres são efêmeros, o que significa que permanecem ativos apenas pelo tempo que o sistema maior precisa deles. O armazenamento geralmente é feito fora do contêiner. VMs tendem a ter uma vida útil mais longa e incluem um sistema de arquivos próprio completo.

Os benefícios da conteinerização em DevOps

A essência do DevOps consiste em processos leves e reproduzíveis que automatizam o processo de desenvolvimento de software. No entanto, os aplicativos modernos estão cada vez mais complexos, especialmente à medida que se expandem e incluem muitos serviços diferentes.

Contêineres ajudam a simplificar essa complexidade por meio da maior padronização e repetibilidade, e isso se converte em um SDLC mais rápido, de maior qualidade e mais eficiente.

Os benefícios da conteinerização incluem:

  • Portabilidade: Até mesmo diferenças aparentemente pequenas no ambiente subjacente podem afetar a forma como o código é executado. É por isso que a frase "Funciona no meu computador" raramente faz sentido e, muitas vezes, é uma piada. É também por isso que a expressão "escreva uma vez, execute em qualquer lugar" tem sido uma meta recorrente para pessoas que buscam melhorar as práticas de desenvolvimento de software. Contêineres ajudam as organizações a fazer isso, agrupando todos os componentes necessários para um aplicativo em ambientes consistentes e portáteis que facilitam a padronização do desempenho desse aplicativo.

  • Escalabilidade: Contêineres podem ser implantados e configurados para funcionarem uns com os outros em uma arquitetura de sistema maior por meio do uso de ferramentas de gerenciamento de orquestração, como o Kubernetes. Essas ferramentas também podem ser usadas para automatizar o provisionamento de novos ambientes em contêineres, de forma que eles sejam dimensionados com base na demanda em tempo real. Isso significa que ambientes em contêineres adequadamente configurados podem ser rapidamente ampliados (ou reduzidos) com pouca ou nenhuma intervenção humana.

  • Independente da nuvem: Quando configurados para portabilidade, os contêineres podem ser executados em qualquer lugar, seja um laptop, um servidor bare metal ou uma plataforma de provedor de nuvem. E, como abstraem as diferenças subjacentes da plataforma, eles reduzem o risco de dependência por uma única plataforma. Você também pode usar contêineres para executar aplicativos em várias plataformas de nuvem e mudar de um provedor para outro.

  • Integração com o pipelinede DevOps: As plataformas de conteinerização geralmente são projetadas para serem inseridas em fluxos de trabalho de automação mais amplos. Isso as torna ideais para DevOps, em que ferramentas de CI/CD podem criar e destruir contêineres automaticamente para tarefas como testes ou até mesmo implantação em produção.

  • Uso eficiente de recursos do sistema: Ao contrário das máquinas virtuais, os contêineres geralmente são mais eficientes e exigem menos sobrecarga. Normalmente, não há um hipervisor ou sistema operacional adicional que seja nativo de um contêiner. Em vez disso, as ferramentas de contêiner fornecem estrutura suficiente para tornar cada contêiner um ambiente independente que aproveita os recursos compartilhados do sistema host sempre que possível, e isso inclui o sistema operacional subjacente.

  • Facilitação de lançamentos de software mais rápidos: Contêineres podem ser usados para simplificar aplicativos maiores e mais complexos, dividindo suas bases de código subjacentes em processos de runtime menores que funcionam em conjunto. Isso ajuda as organizações a acelerar cada etapa do SDLC, pois permite que os profissionais se concentrem em uma parte específica de um aplicativo, em vez de trabalharem com toda a base de código mais ampla.

  • Flexibilidade: Contêineres trazem uma flexibilidade inerente ao SDLC, permitindo que as organizações provisionem rapidamente mais recursos de computação para atender à demanda em tempo real. Eles também são frequentemente usados para criar redundâncias com o objetivo de promover a favorecer maior confiabilidade e aumentar o tempo de atividade dos aplicativos.

  • Maiores níveis de confiabilidade e segurança do aplicativo: Ao tornarem o ambiente do aplicativo parte do pipeline de DevOps, os contêineres estão sujeitos à mesma garantia de qualidade que o restante do aplicativo. E, embora os contêineres funcionem juntos, o ambiente isolado fornecido por um contêiner facilita o isolamento de problemas em uma parte do aplicativo, impedindo que eles afetem o sistema como um todo.

O papel da conteinerização no DevOps

Primeiro, uma observação: o DevOps é uma transformação organizacional que muda a maneira como as equipes constroem e agregam valor e tem normalmente um componente de software (embora você também possa fazer DevOps apenas com hardware). Os contêineres oferecem uma maneira mais moderna de desenvolver software com mais eficiência e em escala.

Resumindo, contêineres não são um requisito para criar uma prática de DevOps de sucesso, mas podem ser uma opção natural, dependendo das necessidades e prioridades da sua organização.

Isso porque eles podem ajudar a ampliar os benefícios do DevOps, em parte, tornando os testes mais confiáveis, criando ambientes para desenvolvedores mais próximos dos ambientes de produção e simplificando o processo de implantação.

Esse papel da conteinerização no DevOps geralmente se divide nos seguintes benefícios:

  • Maior confiabilidade: Processos automatizados e repetíveis garantem que testes e verificações de segurança sejam executados todas as vezes que o código recebe commit ou merge e é implantado. A mudança cultural de romper pontos de isolamento entre as equipes faz com que a qualidade se torne uma responsabilidade de todos. Os contêineres funcionam da mesma forma em todos os lugares, aumentando a confiabilidade dos testes.

  • Entrega mais rápida: A melhoria contínua, as arquiteturas de microsserviços e o pipeline de DevOps automatizado ajudam a garantir que as mudanças sejam mais fáceis de raciocinar, mais rápidas de desenvolver, mais simples de testar e tenham menos consequências indesejadas. Ao separar partes de um aplicativo em contêineres individuais, os profissionais de DevOps podem se concentrar em um aspecto da solução de cada vez, sem se preocuparem com as consequências indiretas que as mudanças em uma área possam ter em outros lugares.

  • Colaboração reforçada: O DevOps acaba com as equipes baseadas em funções e reúne as pessoas para trabalharem em prol de metas comuns de produto. A capacidade de compartilhamento dos contêineres facilita a colaboração das pessoas, pois elas podem trabalhar com o mesmo ambiente de aplicativos, independentemente do hardware que escolherem. O uso de um registro de contêineres (um diretório centralizado de contêineres) facilita a publicação e a localização de contêineres em uma organização.

Incorporação de contêineres no fluxo de trabalho de DevOps

Depois que um contêiner é construído, ele nunca deve mudar. Sempre que uma versão específica de um contêiner for implantada, ela se comportará da mesma maneira que em todas as outras vezes em que foi implantada.

Mas as coisas mudam. Então, como os contêineres incorporam novos pacotes com correções de segurança e novos recursos? Atualizar um contêiner significa criar uma nova versão e substituir explicitamente a versão anterior onde quer que ela esteja em uso. Mesmo que os componentes internos do novo pacote tenham mudado, os mantenedores do contêiner trabalham para evitar fazer alterações na maneira como ele interage com o mundo exterior.

No contexto de um pipeline de DevOps, essa repetibilidade significa que os testes executados em contêineres no pipeline de CI/CD se comportarão exatamente como se esse contêiner estivesse em produção, por exemplo. Isso torna os testes mais confiáveis e reduz a chance de problemas, bugs e erros de código afetarem os usuários finais.

De que outra forma os contêineres desempenham um papel no fluxo de trabalho de DevOps?

  • Codificar: Mesmo antes de uma linha de código ser escrita, os contêineres trazem um nível de padronização ao ambiente de desenvolvimento. Ao especificarem as versões de pacote exigidas por um aplicativo, os contêineres oferecem ambientes consistentes entre os laptops dos desenvolvedores. Isso reduz a chance de infiltração de bugs devido a diferenças de ambiente.

  • Compilar: Ao contrário da implantação direta em uma VM ou em um servidor bare metal, em que o destino deve estar ativo e pronto para uso, um contêiner pode ser compilado uma única vez e depois armazenado para implantação posterior. Isso dissocia a fase de compilação do ambiente de destino e significa que as compilações somente precisam acontecer quando o contêiner sofre alterações.

  • Testar: Contêineres ampliam a ideia de testes automatizados, possibilitando que todo o ambiente, e não apenas o código em si, seja testado. Isso permite a entrega de software de maior qualidade, pois o ambiente de teste corresponde ao ambiente de produção.

  • Liberação e implantação: A repetibilidade dos contêineres significa que, para alterar o código em produção, é necessário criar e implantar um novo contêiner. O resultado é que contêineres geralmente são efêmeros, o que afeta a maneira como as organizações arquitetam seus aplicativos e prova ser ideal em um modelo de microsserviços.

  • Operação: Contêineres reduzem o risco de implantar código atualizado ou dependências em um aplicativo em tempo real. Uma alteração feita em um contêiner fica isolada lá. Por exemplo, dois microsserviços em contêineres separados podem depender de versões diferentes da mesma biblioteca de codificação/decodificação JSON, sem o risco de que a alteração de um afete o outro.

Como os contêineres funcionam em CI/CD

Um pipeline de CI/CD pode ser considerado a esteira transportadora que impulsiona o fluxo de trabalho do DevOps. Para ser eficiente, um pipeline de CI/CD deve equilibrar velocidade com precisão. Sem velocidade, um fluxo de CI/CD corre o risco de gerar atrasos à medida que os commits são feitos com mais rapidez do que conseguem passar pelo pipeline. Sem rigor, as pessoas perderão a confiança no pipeline de CI/CD à medida que os problemas entrarem em produção.

Veja como a conteinerização aprimora os dois aspectos do CI/CD em estágios principais:

  • Integração: Ao usar contêineres, você não precisa começar do zero ao integrar alterações de código à base de código mais ampla. Você pode criar um contêiner base que já contenha as dependências do aplicativo e modificá-lo durante a fase de integração.

  • Testar: Contêineres podem ser rapidamente provisionados e desativados conforme necessário. Em vez de precisar manter manualmente ambientes de teste explícitos ou aguardar scripts de configuração para criar um ambiente, um contêiner pode ser provisionado e implantado automaticamente em grande escala. Dessa maneira, os testes são executados com mais rapidez e com menos necessidade de intervenção humana para criar ambientes de teste.

  • Lançamento: Após a aprovação de todos os testes, a fase de compilação de um pipeline de CI/CD resulta em uma imagem de contêiner que é então armazenada em um registro de contêineres. Quando essa imagem existe, grande parte do trabalho que normalmente seria realizada nas fases de lançamento e implantação já está concluída. Ferramentas de orquestração, como o Kubernetes, então se encarregam de gerenciar onde esses contêineres são implantados e como interagem.

Microsserviços e conteinerização

Uma arquitetura de microsserviços divide um aplicativo em pequenas unidades encarregadas de cumprir uma função específica. Por exemplo, um aplicativo bancário online pode ter um microsserviço que obtém taxas de câmbio em tempo real e expõe esses dados a outros microsserviços por meio de uma API interna. É importante ressaltar que o funcionamento interno do microsserviço não precisa ser público, apenas a API.

Para muitas organizações, DevOps, microsserviços e contêineres andam de mãos dadas. A filosofia do DevOps de melhoria contínua se encaixa perfeitamente no escopo focado dos microsserviços. E é comum que os microsserviços não tenham monitoração de estado, o que significa que eles não armazenam dados dentro de si mesmos e, em vez disso, dependem de serviços de dados especializados. Isso se encaixa na natureza de curto prazo dos contêineres, pois eles podem ser implantados ou destruídos sem se preocupar em como manter os dados que produzem e dos quais dependem.

Em uma arquitetura de microsserviços, há uma relação um-para-um entre cada instância de um microsserviço e um contêiner. Conforme a demanda cresce, a ferramenta de orquestração pode ser configurada para implantar mais contêineres para um determinado microsserviço e desativá-los quando a demanda diminui.

Ferramentas comuns de conteinerização

A primeira etapa para trabalhar com contêineres é entender a paisagem das ferramentas de contêineres. Elas se enquadram em duas categorias amplas:

  • Plataformas de contêineres: Ferramentas que se encarregam de criar e executar imagens de contêiner em um sistema operacional host. O Docker e o LXD são exemplos bem conhecidos.

  • Orquestração de contêineres: Ferramentas para implantar, escalar e gerenciar contêineres que funcionam em conjunto para potencializar um aplicativo. O Kubernetes é uma plataforma popular de orquestração de contêineres.

Vamos examiná-las com mais detalhes.

Plataformas de contêineres

A plataforma de contêineres é o conjunto de ferramentas que compilam, executam e distribuem os contêineres propriamente ditos. A mais conhecida deles é o Docker, que fornece uma plataforma de ponta a ponta para trabalhar com contêineres. E, graças a um conjunto cada vez maior de padrões abertos, existem alternativas que permitem escolher ferramentas diferentes para diferentes partes do processo. Podman é outro exemplo de plataforma que oferece uma maneira diferente de executar contêineres. Já a Kraken é um registro de código aberto para distribuição de contêineres.

Independentemente de você escolher uma solução completa ou escolher entre diferentes ferramentas, você precisará:

  • Processar manifestos de contêineres: São os arquivos de configuração que especificam o conteúdo do contêiner, as portas que ele precisa usar e de quais recursos ele precisa.

  • Compilar imagens: São contêineres em repouso que estão prontos para serem implantados.

  • Armazenar e distribuir imagens: Frequentemente chamado de registro de contêineres, este é um repositório central que pode ser vinculado ao seu sistema de CI/CD para fins de automação. Também pode ser usado manualmente por profissionais de DevOps.

  • Executar imagens: Crie e execute um ambiente isolado para o contêiner. No Linux, isso é relativamente simples. No Windows e no macOS, isso talvez exija que uma VM forneça um ambiente Linux a partir do qual você possa criar e executar imagens de contêiner.

Orquestração de contêineres

Arquiteturas de microsserviços maiores geralmente podem ter milhares de microsserviços, cada um em execução em um ou mais contêineres. Implantar, escalar e gerenciar as interações entre tantos contêineres não é um trabalho manual. Em vez disso, os profissionais de DevOps definem parâmetros (como os recursos necessários para um determinado conjunto de contêineres, quais contêineres precisam se comunicar entre si e assim por diante), mas uma plataforma de orquestração é necessária para executar todos esses contêineres em harmonia.

Assim como acontece com os contêineres propriamente ditos, várias ferramentas de orquestração estão disponíveis, e cada uma adota uma abordagem um pouco diferente. A mais comum é o Kubernetes, que é o mais próximo que o setor tem de uma ferramenta padrão de orquestração de contêineres. O Kubernetes foi originalmente criado pelo Google para gerenciar contêineres que alimentavam seu mecanismo de pesquisa. No entanto, existem alternativas. No lado do código aberto está a Openshift Container Platform da Red Hat, enquanto, no lado do SaaS, estão ofertas como o Kubernetes Service do Azure.

Crie sua prática de DevOps no GitHub

O GitHub é uma plataforma integrada que leva as empresas da ideia ao planejamento e à produção, combinando uma experiência de desenvolvedor focada com uma infraestrutura poderosa e totalmente gerenciada de desenvolvimento, automação e teste.

Compare os Planos de Preços >

Compare as Soluções de DevOps >


O GitHub ajuda nos esforços de longa data da empresa para acelerar o desenvolvimento, derrubando barreiras de comunicação, encurtando os ciclos de feedback e automatizando tarefas sempre que possível.”

Mike Artis, diretor de engenharia de sistemas da ViacomCBS


Passe do planejamento para a criação Aumente a velocidade dos desenvolvedores
Crie planos de roadmap junto à sua base de código e atribua tarefas aos membros da equipe rapidamente com quadros e tabelas de projeto poderosos que se integram totalmente ao seu projeto.

Saiba mais sobre o GitHub Issues >
Reduza o tempo de commit. Elimine o gerenciamento do ambiente e a alternância de contexto para seus desenvolvedores. Simplifique a aquisição e a manutenção de TI com um espaço seguro e gerenciado na nuvem.

Explore o Codespaces >


Automatize tudo Proteja seu código enquanto o escreve
---------- ----------
Automatize todos os seus fluxos de trabalho de desenvolvimento de software com o GitHub Actions. Escale de maneira confiável e segura com uma poderosa infraestrutura de desenvolvimento, teste e automação, totalmente gerenciada pelo GitHub.

Saiba mais sobre o GitHub Actions >
Proteja seu código, dependências, tokens e dados confidenciais durante todo o ciclo de vida de desenvolvimento de software e resolva vulnerabilidades automaticamente.


Veja como ajudamos você a manter a segurança >

Tags

Quer saber como o GitHub pode ajudar sua empresa?

Fale mais sobre suas necessidades

octocaptcha spinner