construção e provisionamento de ambientes de desenvolvimento virtualizados
TRANSCRIPT
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Thiago RodriguesEng. de Software Sr.CI&T - PHPSP
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
Agenda
● Ambiente de desenvolvimento
● Problemas comuns
● Virtualização como possível solução
● Vagrant
● Docker
● Conclusões
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.
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.
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?
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!
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?
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.
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.
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
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.
Vagrant - ambiente com PHP + Apache + MySQL
cd ~/projetos/drupalcampvagrant 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
Vagrant - ambiente com PHP + Apache + MySQL
vim provisionamento.sh
#!/usr/bin/env bashsudo apt-get install -y php5 apache2 libapache2-mod-php5 php5-mysql mysql-serversudo rm -rf /var/www/sudo ln -sf /files /var/wwwecho "<?php phpinfo(); ?>" > /var/www/index.phpecho ">>> Provisionamento finalizado. Acesse: http://127.0.0.1:2015"
Código completo em: https://github.com/xthiago/palestra-vagrant-docker
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
Vagrant - Prática
clique na imagem p/abrir o vídeo no YouTube
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;
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.
Docker - ambiente com PHP + Apache + MySQL
Dockerfile
FROM php:7-apacheMAINTAINER Thiago Rodrigues <[email protected]>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
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
Docker - ambiente com PHP + Apache + MySQL
docker-compose.yml - parte 2
phpsp: build: . container_name: phpsp command: "/data/php-apache.sh" volumes: - .:/var/www/phpsp - ./config/apache/phpsp.conf:/etc/apache2/sites-enabled/phpsp.conf - ./config/php/php.ini:/usr/local/etc/php/php.ini - ./config/php:/data ports: - "2016:80" links: - mysqlphpsp environment: APACHE_LOG_DIR: /var/log/apache2 working_dir: /var/www/phpsp
Código completo em: https://github.com/xthiago/palestra-vagrant-docker
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
Docker Compose - Prática
clique na imagem p/abrir o vídeo no YouTube
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.
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 ;)
Contato
+ PHP dia 20/agosto em Campinas:
phpspima.com.br