segunda-feira, 8 de setembro de 2014

Iniciando com o Docker

Acredito que precisamos estar ligados em tudo aquilo que acontece no mundo da TI, precisamos ser cuidadosos com as novidades mas acima de tudo ter uma opinião bem fundamentada sobre as coisas. Eu comecei esse post com essa frase pois tenho passado por um processo profissional em que tenho conhecido muita coisa nova (principalmente aquilo que se refere a ferramentas para escalabilidade), sempre que posso eu ainda leio sobre qualidade de código, design e arquitetura até porque, é disso que eu gosto e acredito que seja meu minha melhor qualidade. Mas, como eu já disse precisamos estar ligado no mundo e pensando nisso vou tentar iniciar uma serie de posts (não quero prometer nada) em que eu falo sobre ambiente de desenvolvimento, tanto em dev como live. A principio eu queria ter uma versatilidade em meus ambientes de desenvolvimento sem estar muito atrelado a uma unica máquina, e ai eu fui pesquisar sobre a Vagrant que, é uma forma de virtualizar um ambiente bem feito, mas que no fim das contas é muito pesado para aquilo que eu preciso fazer e para meu hardware em alguns momentos. Foi então que no PHP Conference 2013 eu vi a grande figura Elton Minetto falando sobre Docker, ele deu apenas uma pincelada mas já me interessou ir pesquisar pois a proposta dele me pareceu bem interessante. Mas espera ai, qual é a proposta dele afinal?

Segundo o próprio site o Docker é uma plataforma aberta para aplicativos distribuídos para desenvolvedores e administradores de sistemas.  Ele é uma abstração, que adiciona recursos e simplifica o uso dos linux containers (LXC), que são uma forma de isolamento de processos e sistemas, é quase uma virtualização, porém mais leve e integrada ao host. Linux-only. O Docker te permite criar pequenas aplicações chamadas de "containers", que isolam o Sistema Operacional base e toda a pilha de dependência de sua app de forma leve em espaço e consumo. Muitas pessoas dizem que ele é o Vagrant para produção pois são VMs muito leves, que podem rodar em cima de outras VMs. Imagina o seu uso? Podemos aplica-lo em diversas aplicações com ambientes diferentes (apache, nginx, tomcat...) em uma mesma maquina ou vm e sem perder muito em recursos.


Alem de resolver o nosso problema em ambientes dev/live ele tem mais(tipo vendedor hein). O Docker trabalha com um sistema de arquivos empilhaveis, que permite que os passos para configuração do container funcione de forma incremental. Tipo os o versionamento do git/mercurial. Então imagine o processo, atualizou uma lib: commit. Mudou a versão do php: commit, terminou uma nova versão: Tag. E depois de tudo isso é só dar um push, temos uma atualização compartilhada dentro das pessoas que participam do seu projeto ;) .



Ok, estou convencido o Docker é fóda! Como eu começo?

Antes de começar, o Docker é para Linux então, se vc não usa linux vai ter que virtualizar ;)
1º Instalando

No meu caso, eu estou usando o Ubuntu 14.04, então é mais do mesmo, instale o docker.io via apt-get e crie um link para usar docker, caso vc queira usar a ultima versão sempre de uma olhada aqui:

$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
2º Em seguida, adicione a chave do repositório Docker para o seu chaveiro local.
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
3º Agora adicione o repositório Docker ao seu sources list, atualize e instale o pacote lxc-docker 
$ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker
4º Adicioner seu usuario no grupo do docker
Assim vc nao vai precisar ficar fazendo sudo docker lalala.
sudo gpasswd -a myusername docker

5º Autentique-se no docker hub (se n tem conta crie uma aqui)

docker login

6º Suba um container do docker que eu fiz com php-fpm e nginx em sua maquina, a primeira vez que vc rodar esse command vai demorar um pouco pois será feito um pull da imagem.

docker run -v /var/www:/usr/share/nginx/www:rw --expose=80 --dns=127.0.0.1 -i -t pvgomes/php /bin/bash

Preste atenção em algumas coisas desse commando, primeira fazemo um docker run (executar o container) depois passamos um diretorio /var/www fazendo um link com /usr/share/nginx/www e dando premissão de leitura e escrita (rw), isso significa que vamos fazer um link de um path do container com a sua máquina (assim na configuração do nginx apontariamos para /share/nginx/www/seuprojeto), depois expomos a porta 80 e passamos o dns. Pronto vc tem um container do docker rodando :)

Meu objetivo nesse post foi apenas introduzir o Docker, no próximo vamos passar a utilizar o container de fato.

Valeu!