30
Construção e provisionamento de ambientes de desenvolvimento virtualizados Thiago Rodrigues Eng. de Software Sr. CI&T - PHPSP

Construção e provisionamento de ambientes de desenvolvimento virtualizados

Embed Size (px)

Citation preview

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

Quem nunca?

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

Solução Ráááááá...

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.

Principais ferramentas de virtualização

Vagrant e DockerMáquinas virtuais vs Containers

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 ;)