Vagrant e Docker - Como provisionar ambientes utilizando essas ferramentas

Olá pessoal, tudo bem? Esses dias fui desafiado no #DesafioAgileTesters2016 a escrever um post sobre Vagrant e Docker, por este motivo não escrevi a continuação da série dos posts sobre Jenkins. Por falar nisso você pode conferir o primeiro post da série Deixando o Jenkins fazer o trabalho manual , não deixe de conferir e deixar seus comentários :).

Para não fugir do assunto da série, vamos voltar ao primeiro passo: Aprender a como provisionar (instalar/configurar) o Jenkins. Neste post aprenderemos a fazer este primeiro passo usando Vagrant e logo depois com Docker.

Quando comecei a utilizar ferramentas para provisionamento de ambientes, fazia muita confusão na utilização do Vagrant e Docker. Aprofundando os estudos vi que para criar uma imagem personalizada com Vagrant tinha que utilizar uma ferramenta de provisionamento e a que mais vi exemplos foi o Puppet. Ao estudar Docker, pude observar que com um arquivo dockerfile eu teria uma ferramenta que faz tudo que o Vagrant e Puppet faz. A grosso modo, podemos dizer que sim, só que o Vagrant é a ferramenta para criar a "máquina", que pode utilizar vários provedores de máquinas virtuais (VMWare, VirtualBox entre outros) e para personalizar essa máquina, pode ser utilizada diversas ferramentas (Puppet, Docker, Ansible, Shell Script, Chef entre outras).

Minha primeira tentativa foi provisionar uma máquina utilizando shell script, bom funcionou! Mas manter o script de provisionamento com shell script não tem uma boa legibilidade, então vi que era possível provisionar com Ansible (esta ferramenta está no backlog de posts) e ficou muito mais simples manter o script de provisionamento. Agora vamos arregaçar as mangas e por a mão na massa e mostrar a diferença da utilização das ferramentas.

Vagrant

Executaremos a sequência de passos abaixo:

|Primeiro passo:

vagrant init [box-name]

Para conseguir o nome dos box basta acessar a URL.

Irei mostrar o exemplo com o box ubuntu/trusty64. Comando que será executado:
|vagrant init ubuntu/trusty64

Feito isso, será criado um arquivo Vagrantfile como mostra a imagem abaixo:

Ao abrir o Vagrantfile, podemos observar que é adicionado o comando de configuração de qual box será utilizado para provisionar a máquina.

| Segundo passo:

Adicionar quanto de memória terá nossa máquina, isso mesmo, ao utilizar o Vagrant deixamos reservado uma quantidade fixa de memória.

| Terceiro passo:

Adicionar qual ferramenta será utilizada para fazer o provisionamento, neste exemplo, para deixá-lo mais simples irei utilizar shell script.

| Quarto passo:

Adicionar os comandos para provisionar, no nosso caso, os comandos para provisionar o Jenkins.

|Quinto passo:

Antes de executar o comando para provisionar a máquina, vamos adicionar alguns TLGs (Toques de leveza e graciosidade).

Adicionei um nome para o host name, o nome da máquina no Virtual Box e adicionei a porta 8080 para fazer o bind e acessar o Jenkins como localhost:8080.

Agora vamos executar o comando para subir e provisionar a máquina com o Jenkins.

|vagrant up --provider virtualbox

Esta será a saída do resultado da execução do comando acima.

Feito isso temos nosso Jenkins provisionado pelo Vagrant.

Docker

Agora para provisionar o Jenkins com o Docker seguiremos os passos abaixo:

| docker run -d --name jenkins-desafio -p 8082:8080 jenkins

Neste comando o container irá rodar em background utilizando o -d. A porta que será feito o bind com o container é a 8082.

Você deve está pensando: Com o Docker é muito mais simples! E eu lhe respondo que sim, mas apesar das ferramentas fazerem a mesma coisa, são utilizadas com propósitos diferentes. Podemos usá-las em conjunto, o Vagrant cria a máquina e a personalização fica por conta do Docker. A principal diferença nas ferramentas:

Docker
  • Compartilha os recursos da máquina (memória, disco e etc), mas não reservado;
  • Containers são mais leves, já que não precisam de um ambiente virtual completo;
  • Inicialização muito rápida.
Vagrant
  • Traz todo o sistema operacional;
  • Traz usuários do sistema operacional;
  • Compartilha os recursos da máquina (memória, disco e etc), mas reservados, mesmo quando não utilizado.

Concluindo…

Quando precisamos isolar nossa aplicação do sistema operacional, a melhor opção na minha opinião é utilizar o Vagrant. Caso contrário, usar Docker para provisionar sua aplicação antes de executar seus testes automatizados não faz mal a ninguém :). Espero que tenham gostado e não se esqueçam, seus comentários são sempre bem vindos, até breve!

Rafael Chiavegatto

Analista de testes na FPF tech, possui mais de 7 anos de experiência em testes. Conhecimento em metodologias ágeis, automatização de testes, agile testing e da cultura DevOps.

Manaus - Amazonas