Kubernetes versus Docker: por que não os dois?

Câmara de testes de RF do IBM Spectrum Fusion com equipe de engenheiros

O Kubernetes ou o Docker são a melhor escolha (ou chega a ser uma escolha)?

Quando se trata de tecnologia de contêineres, dois nomes surgem como líderes de código aberto: Kubernetes e Docker. E, embora sejam tecnologias fundamentalmente diferentes que auxiliam os usuários no gerenciamento de contêineres, eles são complementares entre si e podem ser poderosas quando combinadas. Nesse sentido, optar por usar Kubernetes ou Docker não é uma questão de decidir qual opção é melhor; na realidade, eles não estão competindo entre si e podem ser usados em conjunto. Portanto, para a questão de saber se Kubernetes ou Docker é a melhor escolha, a resposta é: nenhum dos dois.

O fato de Kubernetes e Docker serem tecnologias de contêineres complementares esclarece outra pergunta frequente: o Kubernetes está substituindo o Docker?

Resumindo, não. Como o Kubernetes não é uma tecnologia concorrente, essa pergunta provavelmente deriva da notícia de 2021 de que o Kubernetes não ofereceria mais compatibilidade com o Docker como uma opção de tempo de execução de contêiner (ou seja, um componente de contêiner que se comunica com o kernel do sistema operacional (SO) em todo o o processo de conteinerização). No entanto, o Kubernetes e o Docker ainda são compatíveis e oferecem benefícios claros quando usados juntos, como vamos Explore em detalhes posteriormente nesta postagem. Primeiro, é importante começar com a tecnologia fundamental que une o Kubernetes e o Docker: os contêineres.

 

O que é um contêiner?

Um contêiner é uma unidade executável de software que empacota o código da aplicação com suas dependências, permitindo que ele seja executado em qualquer infraestrutura de TI. Um contêiner fica sozinho; ele é separado do sistema operacional host, geralmente Linux, o que o torna portátil em ambientes de TI.

Uma maneira de entender o conceito de contêiner é compará-lo a uma máquina virtual (VM). Ambos são baseados em tecnologias de virtualização, mas enquanto um contêiner virtualiza um sistema operacional, uma VM aproveita um hipervisor (uma camada de software leve entre a VM e o hardware de um computador) para virtualizar o hardware físico. 

Com a virtualização tradicional, cada VM contém uma cópia completa de um sistema operacional convidado (SO), uma cópia virtual do hardware necessário para executar o SO e uma aplicação (e suas bibliotecas e dependências associadas). Um contêiner, por outro lado, inclui apenas uma aplicação e suas bibliotecas e dependências. A ausência de um host convidado reduz significativamente o tamanho de um contêiner, tornando-o leve, rápido e portátil. Além disso, um contêiner usa automaticamente as configurações de DNS do host.

Os engenheiros podem usar contêineres para desenvolver rapidamente aplicações que são executadas de forma consistente em um grande número de sistemas distribuídos e ambientes de plataforma cruzada. A portabilidade dos contêineres elimina muitos dos conflitos decorrentes das diferenças de ferramentas e software entre equipes funcionais. 

Isso os torna particularmente adequados para fluxos de trabalho de DevOps, facilitando o caminho para desenvolvedores e operações de TI trabalharem juntos em todos os ambientes. Pequenos e leves, os contêineres também são ideais para arquiteturas de microsserviços, nas quais as aplicações são compostas de serviços menores e fracamente acoplados. E a containerização é frequentemente o primeiro passo para modernizar aplicações locais e integrá-las a serviços de nuvem.

O que é Docker?

O Docker é uma plataforma de conteinerização de código aberto. Basicamente, é um toolkit que torna mais fácil, seguro e rápido para os desenvolvedores construir, implementar e gerenciar contêineres. Esse toolkit também é conhecido como containerd.

Embora tenha começado como um projeto de código aberto, hoje também se refere à Docker, Inc., a empresa que produz o produto comercial Docker. Atualmente, é a ferramenta mais popular para criar contêineres, independentemente de os desenvolvedores usarem Windows, Linux ou MacOS.

Na verdade, as tecnologias de contêineres estavam disponíveis por décadas antes do lançamento do Docker em 2013. No início, os contêineres Linux (ou LXC) eram os mais predominantes. O Docker foi desenvolvido no LXC, mas a tecnologia personalizada do Docker rapidamente ultrapassou o LXC para se tornar a plataforma de conteinerização mais popular. 

Entre os principais atributos do Docker está sua portabilidade. Os contêineres do Docker podem ser executados em qualquer ambiente de desktop, data center ou nuvem. Apenas um processo pode ser executado em cada contêiner, de modo que uma aplicação possa ser executada continuamente enquanto uma parte dela estiver passando por uma atualização ou sendo reparada.

Algumas das ferramentas e terminologia comumente usadas com o Docker incluem o seguinte:

  • Docker Engine: o ambiente de tempo de execução que permite aos desenvolvedores construir e executar contêineres.
  • Dockerfile: um arquivo de texto simples que define tudo o que é necessário para construir uma imagem de contêineres do Docker, como especificações de rede do sistema operacional e locais de arquivos. É essencialmente uma lista de comandos que o Docker Engine executará para montar a imagem.
  • Docker Compose: uma ferramenta para definir e executar aplicações de vários contêineres. Ele cria um arquivo YAML para especificar quais serviços estão incluídos na aplicação e pode implementar e executar contêineres com um único comando via CLI do Docker.

Agora vamos revisitar por que o Kubernetes parou de oferecer compatibilidade com o Docker como um tempo de execução de contêiner. Como mencionado no início desta seção, o Docker é um containerd e não um tempo de execução de contêiner. Isso significa que o Docker fica sobre um tempo de execução de contêiner subjacente para fornecer aos usuários funcionalidades e ferramentas via uma interface do usuário. Para ter compatibilidade com o Docker como um tempo de execução, o Kubernetes teve que ter compatibilidade e implementar um tempo de execução separado conhecido como Docker Shim, que essencialmente ficava entre as duas tecnologias e ajudava na comunicação.

Isso foi feito em um período em que não havia muitos tempos de execução de contêineres disponíveis. No entanto, agora que existem (com a CRI-O. um exemplo de um desses tempos de execução de contêineres), o Kubernetes pode fornecer aos usuários muitas opções de tempo de execução de contêiner, muitas das quais usam a Container Runtime Interface (CRI) padrão, uma maneira para o Kubernetes e o tempo de execução de contêineres para se comunicarem de maneira confiável sem uma camada no meio atuando como intermediária.

No entanto, embora o Kubernetes não tenha mais compatibilidade especial com o Docker como um tempo de execução, ele ainda pode executar e gerenciar contêineres construídos com a Open Container Initiative (OCI), o formato de imagem do próprio Docker que permite usar Dockerfiles e construir imagens do Docker. Em outras palavras, o Dockers ainda tem muito a oferecer no ecossistema do Kubernetes.

Quais são as vantagens do Docker?

A plataforma de conteinerização Docker oferece todos os benefícios dos contêineres mencionados anteriormente, incluindo o seguinte:

  • Portabilidade leve: aplicações conteinerizadas podem migrar de qualquer ambiente para outro (onde quer que o Docker esteja operando) e operarão independentemente do sistema operacional.
  • Desenvolvimento ágil de aplicações: a conteinerização facilita a adoção de processos de CI/CD e aproveita metodologias ágeis, como DevOps. Por exemplo, aplicativos conteinerizados podem ser testados em um ambiente e implementados em outro em resposta a demandas de negócios em rápida mudança.
  • Escalabilidade: os contêineres do Docker podem ser criados rapidamente, e vários contêineres podem ser gerenciados de forma eficiente e simultânea.

Outras funcionalidades das APIs do Docker incluem a capacidade de rastrear e reverter automaticamente imagens de contêineres, usar contêineres existentes como imagens base para construir novos contêineres e construir contêineres com base no código-fonte da aplicação. O Docker é apoiado por uma comunidade de desenvolvedores vibrante que compartilha milhares de contêineres em toda a internet via Docker Hub.

Mas, enquanto o Docker se dá bem com aplicações menores, aplicações corporativas grandes podem envolver um grande número de contêineres (às vezes centenas ou até milhares), o que se torna insuportável para as equipes de TI encarregadas de gerenciá-los. É aí que entra a orquestração de contêineres . O Docker tem sua própria ferramenta de orquestração, o Docker Swarm, mas de longe a opção mais popular e robusta é o Kubernetes.

O Docker tem vários comandos utilizados na criação e execução de contêineres:

  • docker build : esse comando cria uma nova imagem do Docker a partir do código-fonte (ou seja, a partir de um Dockerfile e dos arquivos necessários).
  • docker create : esse comando cria uma nova imagem do Docker a partir de uma imagem sem iniciá-la, o que envolve a criação de uma camada de contêiner gravável sobre a imagem e a preparação.
  • docker run : esse comando funciona exatamente como o comando docker create  , exceto que requer a etapa adicional de executá-lo após a criação.
  • docker exec : esse comando é usado para executar um novo comando dentro de um contêiner que já está em execução.

O que é o Kubernetes?

O Kubernetes é uma plataforma de código aberto de orquestração de contêineres para programar e automatizar a implementação, o gerenciamento e o dimensionamento de aplicações conteinerizadas. Os contêineres operam em uma arquitetura de múltiplos contêineres chamada de "cluster". Um cluster do Kubernetes inclui um contêiner designado como um plano de controle que agenda cargas de trabalho para o restante dos contêineres (ou nós) no cluster.

O nó mestre determina onde hospedar as aplicações (ou contêineres do Docker), decide como reuni-las e gerencia sua orquestração. Ao agrupar contêineres que compõem uma aplicação em clusters, o Kubernetes facilita a descoberta de serviços e permite o gerenciamento de grandes volumes de contêineres ao longo de seus ciclos de vida. 

O Google lançou o Kubernetes como um projeto de código aberto em 2014. Agora, ele é gerenciado por uma fundação de software de código aberto chamada Cloud Native Computing Foundation (CNCF). Projetado para orquestração de contêineres em ambientes de produção, o Kubernetes é popular, em parte, devido à sua funcionalidade robusta, a uma comunidade ativa de código aberto com milhares de colaboradores e suporte e portabilidade nos principais provedores de nuvem (por exemplo, IBM Cloud, Google, Azure e AWS).

Quais são as vantagens do Kubernetes?

  • Implementação automatizada: o Kubernetes agenda e automatiza a implementação de contêineres em vários nós de computação, que podem ser VMs ou bare metal servers. 
  • Descoberta de serviços e balanceamento de carga: expõe um contêiner na internet e emprega balanceamento de carga quando ocorrem picos de tráfego para manter a estabilidade.
  • Funcionalidades de auto-scaling: inicia automaticamente novos contêineres para lidar com cargas pesadas, seja com base no uso da CPU, limites de memória ou métricas.
  • Recursos de autocorreção: o Kubernetes reinicia, substitui ou reagenda contêineres quando eles falham ou quando os nós morrem, e elimina contêineres que não respondem às verificações de integridade definidas pelo usuário.
  • Implementações e reversões automáticas: ele implementa alterações nas aplicações e monitora a integridade das aplicações em busca de problemas, revertendo as alterações se algo der errado.
  • Orquestração de armazenamento: monta automaticamente um sistema persistente de armazenamento local ou na nuvem de sua preferência conforme necessário para reduzir a latência e melhorar a experiência do usuário.
  • Provisionamento de volume dinâmico: permite que os administradores de clusters criem volumes de armazenamento sem precisar fazer chamadas manuais para seus provedores de armazenamento ou criar objetos.

Kubernetes e Docker: encontrando sua melhor solução de contêineres

Embora o Kubernetes e o Docker sejam tecnologias distintas, eles são altamente complementares e formam uma combinação poderosa. O Docker fornece a parte de conteinerização, permitindo que os desenvolvedores empacotem facilmente as aplicações em contêineres pequenos e isolados por meio da linha de comando. Os desenvolvedores podem, então, executar essas aplicações em seu ambiente de TI, sem ter que se preocupar com problemas de compatibilidade. Se uma aplicação for executada em um único nó durante o teste, ela será executada em qualquer lugar.

Quando a demanda aumenta, o Kubernetes fornece orquestração de contêineres Docker, agendando-os e implementando-os automaticamente em ambientes de TI para garantir alta disponibilidade. Além de executar contêineres, o Kubernetes oferece os benefícios de balanceamento de carga, autocorreção e lançamentos e reversões automatizados. Além disso, ele tem uma interface gráfica para facilitar o uso.

Para empresas que preveem que escalarão sua infraestrutura no futuro, pode fazer sentido usar o Kubernetes desde o início. E para aquelas que já usam o Docker, o Kubernetes usa contêineres e cargas de trabalho existentes enquanto enfrenta as questões complexas envolvidas na mudança para escalar. 

Integração para automatizar e gerenciar melhor as aplicações

Versões posteriores do Docker têm integração integrada com o Kubernetes. Essa funcionalidade permite que as equipes de desenvolvimento automatizem e gerenciem de forma mais eficaz todas as aplicações em contêineres que o Docker as ajudou a construir.

No final das contas, é uma questão de qual combinação de ferramentas sua equipe precisa para atingir suas metas de negócios. Confira como começar a usar esses tutoriais do Kubernetes e explorar o IBM Cloud Kubernetes Service para saber mais.

Ganhe um badge por meio de tutoriais gratuitos de Kubernetes baseados em navegador com o IBM CloudLabs.

Autora

Dê o próximo passo

Comece a utilizar uma plataforma Red Hat OpenShift totalmente gerenciada ou explore a flexibilidade do ecossistema do Kubernetes na IBM® Cloud. Acelere seu processo de desenvolvimento e implementação com soluções escaláveis e seguras, adaptadas às suas necessidades.

Explore o Red Hat OpenShift Explore o Kubernetes