Substituindo Vagrant por Docker

Compartilho aqui minha experiência prestando o devido reconhecimento para a ferramenta, mostro também o quão simples e facilitador pode ser o uso do docker como plataforma de desenvolvimento.


Nos últimos dias, comecei a trabalhar em um projeto que tinha o ambiente configurado com Vagrant. Já tendo um pouco de experiência com docker, constatei que o processo de configuração estava sendo oneroso, se comparado ao docker. Existiam também alguns problemas de desempenho, ele rodava de forma imprevisível, às vezes com loads muito demorados outras vezes normal.

Sugeri à equipe o uso do Docker. Com liberdade e tempo livre para pesquisar uma solução, fui em frente! 🤞

Missão dada:

O objetivo seria facilitar a vida de quem ingressa no projeto, simplificando a instalação. Não sendo necessário deslocar um segundo desenvolvedor no processo de setup(existiam muitas minúcias), focando o tempo no entendimento do projeto e nas tarefas.

Configurar um ambiente de desenvolvimento Docker do zero era uma novidade. Minhas experiências anteriores foram alguns ajustes de ambiente e na maioria das vezes só usar o que meu antigo colega desenvolvedor Backend/DevOp tinha concebido. Esse processo sempre foi simples e transparente.

Poderia aqui aprofundar o que é o Docker, mas essa não é a intenção… Para isso já existe um ótimo livro(usado como referência nos meus estudos) ou a própria documentação do Docker. Sugiro que quem desconheça docker leia ao menos os primeiros capítulos do livro antes de prosseguir.

Direto ao ponto:

Antes de tudo é preciso instalar o docker. Os testes foram feitos usando Docker for mac e Docker for Windows (Microsoft Windows 10). No mac não tive nenhum problema com a instalação, no entanto, no windows foi necessário habilitar o Hyper-V na bios e no sistema. Vale destacar que não é possível usar o Hyper-V na versão Windows Home .

O projeto em questão deve rodar em um ambiente PHP/Apache/Mysql,
trata-se de um site relativamente grande em WordPress…
O que impediu desenvolver de forma local foi uma lib (Image Magick). Para alguns muito problemática de instalar no macOS porém trivial no linux.

Procurarei um ambiente pronto com a lib que precisava. O que encontrei foi uma iso do WordPress que já vem com PHP e Apache mas sem a lib.

O Mysql foi colocado em outro container e para administrar o banco de dados optei por adicionar o phpMyAdmin em um terceiro container.

Docker Compose

Docker-compose: Geralmente com o aumento do número de containers em execução, fica evidente a necessidade de um melhor gerenciamento da sua comunicação, pois é ideal que os serviços consigam trocar dados entre os containers. (livro)

Foi criado um arquivo docker-compose.yml (abaixo): e um arquivo chamado .env para configurar as variáveis de ambiente.

Meu Docker Compose (Gist)

Wordpress:

version: '2'
services:
wordpress:
image: wordpress
container_name: environmentwp
build:
context: ./
dockerfile: Dockerfile
ports:
- "80:80"
environment:
WORDPRESS_DB_PASSWORD: ${MYSQL_ROOT_USER}
WORDPRESS_DB_NAME: ${MYSQL_HOST}
volumes:
- ./site:/var/www/html

Na Linha 6 é onde defini a imagem, image: wordpress. Como já mencionado, essa ISO contém Apache, PHP e demais libs, maiores detalhes podem ser vistos aqui na documentação oficial.

Na linha 8 é onde o build do container é declarado. Para isso é preciso criar um arquivo Dockerfile. O processo de build permite efetuar mudanças na ISO. Aqui ele foi usado para adicionar o Image Magick.

Foi estabelecido o mapeamento, a porta 80 do container foi mapeada na porta 80 da máquina local assim como as varáveis de ambiente relativas ao banco de dados do Wordpress. É importante prestar atenção à chave volumes: nela é feito o mapeamento de onde o conteúdo do repositório estará linkado na unidade do container: nesse caso o conteúdo do diretório ./site: será mapeado dentro do container em/var/www/html.

Dockerfile:

MySQL:

image: mysql
container_name: ${MYSQL_HOST}
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
ports:
- "8989:3306"
volumes:
- "./data/db/mysql:/var/lib/mysql"

De forma equivalente ao que foi feito no Wordpress, escrevi a definição do container responsável pelo banco. Ele usa a ISO default do MySQL, proveniente do docker hub. O que destaco nesta configuração é o mapeamento do volume neste caso ./data/db/mysql: para /var/lib/mysql no container.

phpMyAdmin:

myadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
“8080:80”
environment:
PMA_ARBITRARY=1
PMA_HOST=${MYSQL_HOST}
depends_on:
mysqldb

Em algumas circunstâncias o phpMyAdmin pode ser útil 😜. Nesse projeto, precisamos algumas vezes usar o banco em produção ou testar alguma configuração específica, por isso adicionei phpMyAdmin que facilita os processos de exportar/importar. Atenção aqui ao mapeamento do ambiente com o host na linha: PMA_HOST=${MYSQL_HOST}

Arquivo .env

No arquivo .env são definidas as variáveis de ambiente.

MYSQL_HOST=mysql
MYSQL_DATABASE=database_name
MYSQL_ROOT_USER=user
MYSQL_ROOT_PASSWORD=userpassword
MYSQL_USER=dev
MYSQL_PASSWORD=devpassword

Rodando:

Para rodar esse ambiente é necessário executar os seguintes comandos:

$ docker-compose build
$ docker-compose up

Só é necessário executar o comando docker-compose build apenas quando forem adicionados comandos ao Dockerfile, por isso rodamos ele uma vez.

Tarefa finalizada: 🙌

Existem inúmeras maneiras de utilizar o Docker. Essa é só mais uma, procurei fazer com que o ambiente seja facilmente compreendido através desse artigo.

Pude perceber que o setup ficou bem mais rápido do quando instalávamos Vagrant e Vitualbox. Embora boa parte do tempo fosse gasto no processos de download(mais de uma hora). Quando configuramos o ambiente com o docker pela primeira vez gastamos em média 15 minutos o que também é um tempo considerável. A maior diferença foi na execução que está regular com loads normais.

Caso queira o ambiente completo com todos os arquivos e estrutura fiz um repositório e coloquei aqui.

Links úteis:

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.