As equipes DevOps estão sob crescente pressão para entregar mais funcionalidades aos clientes rapidamente. Os provedores de nuvens oferecem uma solução através de plataformas escaláveis com excelentes integrações de CLI e API. Infelizmente, as interfaces expostas pelos provedores de nuvens podem ser incompatíveis. Mas algumas ferramentas nativas das nuvens ajudam as equipes DevOps a construir soluções personalizadas para qualquer provedor de nuvens.

Duas dessas ferramentas são o Vagrant e o Docker. Entender o que eles fazem e como eles trabalham juntos é a chave para tirar o máximo proveito do seu ambiente de nuvens.

Vagrant é uma ferramenta para construir e gerenciar ambientes de máquinas virtuais (VM) em um único fluxo de trabalho. Se você está construindo VMs locais para rodar com hypervisors ou apenas VMs em nuvem, o Vagrant fornece um formato de configuração consistente, CLI única e provisionadores compartilhados para instalar software e alterar configurações.

O Docker fornece a capacidade de empacotar software e suportar configurações em imagens executadas consistentemente em múltiplas plataformas. O Docker permite que as equipes DevOps tenham confiança de que o software será executado em um ambiente de trabalho local da mesma forma que é executado em uma plataforma de nuvem gerenciada.

Apesar de Vagrant e Docker compartilharem o objetivo de criar ambientes repetíveis, eles o fazem de maneiras diferentes, porém complementares. Este artigo explora como Vagrant e Docker atingem seus objetivos.

O que é Docker?

Docker é uma plataforma aberta para o desenvolvimento, envio e execução de aplicativos. Ele permite às equipes DevOps empacotar softwares personalizados, aplicativos de suporte e bibliotecas, bem como instruções para configuração, rede, montagem de arquivos, verificações de saúde e lançar scripts em um artefato autocontido chamado imagem.

As imagens são executadas em ambientes simples e isolados chamados contêineres. Ao contrário das VMs, que normalmente alocam uma quantidade fixa de memória e limitam severamente o uso da CPU, os contêineres são muito mais elásticos, consumindo apenas a quantidade de memória e CPU necessária.

Isso permite que muitos contêineres lado a lado funcionem com eficiência, reduzam custos e aumentem o alcance. No entanto, os contêineres não são considerados tão seguros quanto as VMs. Resumindo, os contêineres não são uma solução ideal para executar código não confiável.

Docker
Docker

Por que usar Docker (vs Vagrant)?

As equipes de DevOps normalmente usam o Docker para implantar e executar aplicativos da web. Isso inclui aplicativos nativos de nuvem que se integram a filas de mensagens ou são hospedados em plataformas de função como serviço (FaaS) que respondem a eventos e acionadores baseados em nuvem.

Plataformas como o Kubernetes se baseiam no Docker, permitindo a orquestração de contêineres em escala. Além disso, todos os provedores de nuvem suportam a capacidade de executar contêineres Docker em suas ofertas de plataforma como serviço (PaaS). Agora é raro encontrar um PaaS que não suporte o Docker.

O Docker também pode distribuir e executar ferramentas baseadas na CLI, com todas as ferramentas nativas populares da nuvem oferecendo imagens Docker incorporando sua CLI.

Quais são os benefícios do Docker?

O Docker resolve um problema comum enfrentado pelos processos tradicionais de implantação de software, onde aplicativos personalizados podem exibir resultados diferentes quando executados em uma estação de trabalho local de um desenvolvedor e em um ambiente de produção. Estas diferenças são frequentemente o resultado de desenvolvedores executando versões diferentes de linguagens de programação, tendo configurações diferentes para suportar aplicativos como servidores web, ou executando sistemas operacionais completamente diferentes do ambiente de produção. Essas diferenças levam a problemas de suporte que saltam de uma equipe para outra com comentários como: “Na minha máquina ela funciona”.

Como as imagens Docker incluem o código para aplicativos personalizados, todos os aplicativos de suporte e bibliotecas, as imagens são executadas em contêineres que fornecem resultados mais consistentes, independentemente de onde elas são executadas.

As imagens do Docker são fáceis de distribuir usando registros como o Docker Hub, permitindo que as equipes DevOps compartilhem imagens entre si rapidamente e implantem as imagens usando as várias plataformas de hospedagem. Por exemplo, você encontrará o Docker atrás da suíte de desenvolvimento DevKinsta WordPress da Kinsta.

Onde pilhas de aplicativos mais complexas são necessárias, como a implantação de um banco de dados ao lado de um aplicativo backend, ou uma coleção de microsserviços relacionados, Docker Compose fornece a capacidade de criar e conectar vários contêineres Docker com um único comando. Todos os contêineres, configurações associadas e configurações de rede são definidas em um único arquivo YAML. Docker Compose então lê este arquivo para criar e gerenciar múltiplos contêineres como uma única unidade.

Docker também desfruta de suporte near-universal através dos principais provedores de nuvens, o que significa que as equipes DevOps são prejudicadas pela escolha ao executar suas imagens Docker na nuvem.

O que é Vagrant?

Por décadas, as Máquinas Virtuais têm provado ser uma solução confiável e segura para particionamento e provisionamento de recursos computacionais. As VMs continuam sendo os serviços mais populares expostos pelos provedores de nuvem e muitas soluções comerciais e de código aberto para equipes estão procurando executar as VMs on-premises.

Entretanto, esta variedade representa um desafio para as equipes DevOps. Cada solução expõe um CLI e API diferentes para criar e gerenciar VMs, dificultando manter a consistência entre ambientes de desenvolvimento local e plataformas baseadas em nuvem.

A Vagrant oferece uma solução abstraindo as diferenças subjacentes entre plataformas VM, permitindo que as equipes DevOps forneçam novas VMs com uma única CLI e uma sintaxe de configuração consistente. Equipes que adotam o Vagrant podem criar VMs consistentes, independentemente de serem executadas no local ou em um ambiente de nuvem e podem facilmente alternar entre ambientes. O Vagrant tem uma infinidade de usos diferentes, inclusive como um substituto de MAMP (macOS, Apache, MySQL/MariaDB e PHP, Perl ou Python).

Vagrant
Vagrant

Por que usar o Vagrant (vs Docker)?

É possível iniciar uma Máquina Virtual e configurar manualmente o sistema operacional instalando manualmente o software e editando os arquivos de configuração. Isso não é ideal, pois o processo não é repetível, o que significa que as Máquinas Virtuais devem ser recriadas manualmente para diferentes sistemas operacionais e provedores. Isso também torna quase impossível entender como uma VM foi configurada posteriormente.

Uma prática melhor é automatizar o processo necessário para configurar uma máquina virtual. A Vagrant fornece uma única ferramenta para automatizar o processo de build de Máquinas Virtuais para muitos provedores. A Vagrant também fornece uma grande seleção de VMs de alta qualidade na Vagrant Cloud que as equipes DevOps podem usar para iniciar suas próprias VMs.

Quais são os benefícios da Vagrant?

As equipes DevOps que utilizam o Vagrant têm uma única ferramenta para aprender independentemente se estão construindo VMs para plataformas on-premises, plataformas de nuvem, ou ambas. Você pode facilmente ajustar os arquivos de configuração do Vagrant e reexecutá-los ou revisá-los em uma data posterior para entender como uma VM foi construída.

Vagrant também permite que as equipes DevOps migrem para a nuvem ou entre provedores sem redesenhar o processo que eles usam para construir VMs.

As Máquinas Virtuais criadas pela Vagrant fornecem um alto nível de isolamento, muitas vezes aproveitando o suporte especializado de virtualização integrado em CPUs modernas. Isso faz das Máquinas Virtuais, e ferramentas que as criam, como a Vagrant, a melhor escolha onde a segurança e o isolamento são uma alta prioridade.

Muitas distribuições Linux, tais como Ubuntu e Fedora, também fornecem requisitos oficiais do Vagrant nos quais as equipes de DevOps podem confiar. Isso reduz o tempo necessário para criar máquinas virtuais personalizadas.

Vagrant vs Docker: Uma análise mais detalhada

Tanto Vagrant quanto Docker tornam as equipes DevOps mais eficientes, automatizando a construção, distribuição e execução de aplicativos de software.

Docker atinge este objetivo com um formato de embalagem personalizado na forma de imagens e um ambiente de execução leve por contêineres. Os contêineres executam consistentemente entre plataformas, dando às equipes DevOps maior confiança de que seu software funciona como esperado. Docker é bem suportado pelas plataformas de nuvem PaaS e FaaS, permitindo às equipes DevOps escolher a melhor plataforma para suas necessidades.

Muitos contêineres podem coexistir em uma única hospedagem, principalmente – mas não completamente – isolados uns dos outros enquanto compartilham o mesmo pool de recursos. Isso permite que os contêineres possam ser escalados eficientemente.

A Vagrant atinge esta meta fornecendo um método consistente para a construção de Máquinas Virtuais com os fornecedores existentes. É uma escolha ideal para equipes que já investiram em Máquinas Virtuais, confiando em seu alto nível de isolamento, segurança, controle e customização.

Docker também fornece a melhor solução ao executar código confiável enquanto minimiza os custos de computação. Os contêineres são razoavelmente isolados uns dos outros, mas incorrem muito pouco em despesas gerais. Isso significa que muitos contêineres podem funcionar simultaneamente em um sistema operacional compartilhado. Máquinas Virtuais fornecem a melhor solução quando as equipes precisam de altos níveis de isolamento e segurança ou requerem a capacidade de executar muitos sistemas operacionais diferentes lado a lado, com a Vagrant fornecendo uma solução conveniente para construir VMs de forma automatizada e repetível.

Vagrant e Docker não são tecnologias mutuamente exclusivas, e ambas as ferramentas podem ser usadas lado a lado. Por exemplo, as equipes DevOps podem usar o Docker para desenvolver e executar aplicativos enquanto usam Vagrant para recriar ambientes especializados para reproduzir problemas. O Docker pode até mesmo ser executado em uma VM criada pela Vagrant, talvez para testar novas versões do Docker ou para testar ferramentas distribuídas como imagens Docker em um ambiente isolado.

Resumo

As equipes DevOps têm muitas escolhas ao construir, distribuir e executar aplicativos.

Docker fornece um formato de imagem personalizado e um ambiente de execução de contêineres que permite o uso de recursos em larga escala e eficiente, sendo suportado em todas as plataformas PaaS e FaaS.

As Máquinas Virtuais oferecem ambientes de execução seguros e isolados de muitos provedores de VMs em nuvem e on-premises, com a Vagrant abstraindo muitas diferenças para fornecer uma única CLI e uma sintaxe de configuração consistente para instanciar as Máquinas Virtuais entre os provedores.

Antes de começar a desenvolver seu próximo aplicativo, dê uma olhada em como o serviço de Hospedagem de Aplicativos da Kinsta pode tirar vantagem dos Dockerfiles para gerenciar a implantação do seu código.

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.