Construção e provisionamento de ambientes de desenvolvimento virtualizados
1. Construção e provisionamento de ambientes
de desenvolvimento virtualizados
Thiago Rodrigues
Eng. de Software Sr.
CI&T - PHPSP
2. Thiago Rodrigues
Bacharel em Sistemas de Informação pela
Universidade do Estado de Minas Gerais (UEMG);
Engenheiro de Software Sênior na CI&T
Programador PHP há 11 anos;
Evangelista PHPSP e co-organizador do PHPSP
Campinas
Entusiasta do software livre
Gammer
4. Agenda
● Ambiente de desenvolvimento
● Problemas comuns
● Virtualização como possível solução
● Vagrant
● Docker
● Conclusões
5. Ambiente de desenvolvimento
Definição quase formal:
Ambiente onde as aplicações são desenvolvidas.
Geralmente montado no computador do desenvolvedor.
Possui ferramentas necessárias para execução da aplicação.
Semelhante ao ambiente de produção (onde a aplicação será usada).
Contém ferramentas que auxiliam no desenvolvimento.
6. Exemplo de ambiente de desenvolvimento
Ambiente de um site feito em Drupal 8
● Drupal 8
● Composer
● Sistema operacional (Linux, Windows, etc)
● Servidor Web (Apache, Nginx, etc)
● PHP + módulos requeridos
● SGBD (MySQL, PostgreSQL, etc)
● Ferramentas de desenvolvimento (Drush, XDebug, scripts de build,
etc).
Em suma: a construção do ambiente não é simples, tampouco trivial.
7. Problemas comuns
Documentação
O que tem que instalar?
Qual versão?
É necessário definir alguma configuração?
Quem vai lembrar daqui 1 ano?
E se o projeto for engavetado e ressurgir no futuro?
Se algo mudar, alguém vai atualizar?
8. Problemas comuns
Atualizações & Contribuições
Como agir quando precisamos atualizar as configurações do ambiente?
Como garantir que todos os devs apliquem as mudanças?
Como as pessoas podem contribuir?
Precisamos que todos atualizem a versão do PHP para versão 7.1!
Troquem o valor da diretiva error_reporting para E_ALL no php.ini.
Todos atualizem o script de build para a nova versão!
9. Problemas comuns
Tempo de construção
Quanto tempo é necessário para preparar o ambiente?
Será necessário que outro desenvolvedor ajude no procedimento?
E se for necessário reinstalar o SO ou montar o ambiente em outra
máquina?
10. Problemas comuns
Outros problemas
Como lidar com as preferências pessoais de cada desenvolvedor?
Como lidar com problemas do ambiente? Ex: bug na versão da biblioteca
cURL do Ubuntu 14.04.
13. Solução
Virtualizar o ambiente de desenvolvimento
Isso permite:
● automação da construção (provisionamento);
● padronização do ambiente;
● versionamento do ambiente;
● independência do SO hospedeiro e das preferencias do usuário;
● reduz o tempo de preparação
● facilita atualizações & contribuições;
● dispensa documentação, basta um README.md informando como
provisionar.
15. Vagrant
Automatiza a criação e provisionamento de máquinas virtuais.
Abstrai detalhes das ferramentas de virtualização.
Prós:
- simples e fácil
- funciona bem em Linux, Windows e Mac
- extensível através de plugins
Contras:
- overhead do SO da máquina Virtual;
- destina-se somente para ambiente de desenvolvimento
16. Vagrant - conceitos básicos
Provider: ferramenta de virtualização. Pode ser: VirtualBox,
VMware, DigitalOcean, Amazon AWS, etc.
Box: pacote Vagrant contendo o ambiente. Existem diversos na internet.
É possível criar um do 0 ou usar um pronto.
https://atlas.hashicorp.com/boxes/search
Provisioner: método de provisionamento. Pode ser shell, Ansible, Chef,
Puppet, etc.
Vagrantfile: arquivo de configuração onde as opções acima são
especificadas.
17. Vagrant - ambiente com PHP + Apache + MySQL
cd ~/projetos/drupalcamp
vagrant init hashicorp/precise64
Vagrant.configure(2) do |config|
config.vm.box = "hashicorp/precise64"
config.vm.provision :shell, :path => "provisionamento.sh"
config.vm.network :forwarded_port, host: 2015, guest: 80
config.vm.synced_folder ".", "/files"
end
Código completo em: https://github.com/xthiago/palestra-vagrant-docker
19. Vagrant - Principais comandos
Subir a máquina virtual (VM):
vagrant up
Reiniciar a VM:
vagrant restart
Desligar a VM:
vagrant halt
Destruir VM:
vagrant destroy
Conectar-se na VM via SSH:
vagrant ssh
21. Docker + Docker Compose
Docker oferece um ecossistema muito além do ambiente de
desenvolvimento, que abrange também produção e deploy.
Docker Compose visa definir e executar containers docker através
de um único arquivo.
Prós:
- leve (principalmente em Linux)
- imagens são reutilizáveis e fácilmente extendidas;
- pode ser usado em produção;
- containers isolados;
Contras:
- necessita de VM no Windows e Mac;
- mais complicado que Vagrant;
22. Docker + Docker Compose - conceitos básicos
Imagem: é o template do container. Similar ao Box do Vagrant.
https://hub.docker.com/
Container: é a instância da imagem. A grosso modo é um processo
isolado do SO que possui acesso limitado a CPU, memória, file system e
rede.
São efêmeros, sendo necessário commitar alterações.
Dockerfile: arquivo que descreve ao Docker como construir uma
imagem.
docker-compose.yml: arquivo que especifica os serviços (containers), a
ligação entre eles, variáveis de ambiente, portas, etc.
23. Docker - ambiente com PHP + Apache + MySQL
Dockerfile
FROM php:7-apache
MAINTAINER Thiago Rodrigues <thiago@phpsp.org.br>
RUN apt-get update && apt-cache search xdebug && apt-get install -y
libfreetype6-dev libjpeg62-turbo-dev
libmcrypt-dev libpng12-dev
&& docker-php-ext-install -j$(nproc) iconv mcrypt pdo_mysql
RUN pecl install xdebug && docker-php-ext-enable xdebug
RUN a2enmod rewrite
Código completo em: https://github.com/xthiago/palestra-vagrant-docker
24. Docker - ambiente com PHP + Apache + MySQL
docker-compose.yml - parte 1
mysqlphpsp:
image: mysql:5.5
container_name: mysqlphpsp
ports:
- "2017:3306"
volumes:
- ./config/mysql/conf.d/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: name
MYSQL_USER: admin
MYSQL_PASSWORD: admin
Código completo em: https://github.com/xthiago/palestra-vagrant-docker
26. Docker Compose - Principais comandos
Subir containers:
docker-compose up -d
Listar containers:
docker-compose ls
Reiniciar os containers:
docker-compose restart
Desligar containers:
docker-compose stop
Destruir constainers (desligados):
docker-compose rm
Conectar-se ao container:
docker exec -it NOME_CONTAINER
27. Docker Compose - Prática
clique na imagem p/abrir o
vídeo no YouTube
28. Algumas recomendações
● Incluir arquivos do Vagrant/Docker no repositório de código
da aplicação.
○ permite que outros entendam e contribuam
○ facilita a distribuição de alterações
○ garante rastreabilidade das alterações - Algo saiu errado? Reverta ;)
● Mapear diretório de scripts do repositório no $PATH da VM/container.
● Vagrant: usar NFS para aumentar a performance
● Subir a imagem para o Docker Hub - poupa o tempo de construção.
○ Plus: integrar com Github para fazer builds automáticos
● Colocar arquivo Vagrantfile no gitignore. Incluir no repo versão com sufixo
.dist.
○ isso permite que devs façam pequenas customizações sem afetar
ambiente de outros. Ex: quantidade de memória RAM.
29. Conclusão
Ambas ferramentas são sólidas e oferecem recursos que mitigam
os problemas citados previamente.
use Vagrant se
● deseja algo mais simples
● não possui muito tempo para estudar
use Docker se
● possui uma arquitetura complexa
● almeja maior paridade com produção
● almeja uma ferramenta que possa ser usada em produção
● procura diversão ;)