Seu ambiente de teste com Docker

No mundo de dev, de tempos em tempos aparece algo bem legal que parece mágica.

  • Github usando repositórios GIT pela internet com repositórios públicos gratuitos.

  • Rails nasceu e foi fantástico. Scaffolding era porta de entrada mágica para desenvolvimento web rápido e preciso.

  • Toda linguagem agora existe um repositório de dependência (ruby - gem, python - pip, javascript nodejs - npm)

  • Vagrant é outro cara que mostrou que não precisa ter dor para subir uma máquina virtual.

O docker veio para ser um apanhado geral. Você entrega uma imagem(container) e pronto. É só rodar e sua aplicação está disponível para uso.

Da mesma forma que você sobe uma instância você a destrói. Talvez seja esse o grande motivo que o docker caiu na graça dos devs.

Uma maquina pode ter múltiplas instâncias dockers com versões de mysql e python diferentes em cada instância e elas não irão entrar em conflito (isso é lindo demais... até caiu uma lágrima..), ou seja, ele age como uma camada fina por cima do seu sistema operacional.

sugestão de @stefanteixeira

O @stefanteixeira mandou essa imagem que traduz bem a idéia dos containers.

No nível macro o docker funciona da seguinte forma:

  • Existe tipo um cliente/server do Docker, onde suas imagens ficam armazenadas na nuvem.

  • Assim como no github, no docker vc tem repositórios (imagens) públicas ilimitadas mas eles te dão uma privada de graça, ou seja, para muitas empresas a solução free cai muito bem ( e se precisar de mais.. 12 dólares para o primeiro pacote eh barato demais).

  • Você precisa instalar o client docker na máquina em que você quer fazer o deploy.

  • Ou vc gera uma imagem a partir de uma receita dockerfile_

  • Você abre o client docker e manda rodar sua imagem, gerando seu contêiner.

And thats it!

TL:DR Po os caras fizeram um video introdutório! da uma assistida!


TL:DR2 Po! Eles fizeram um tutorial com linha de comando para você aprender como utilizar o garoto com as funções básicas .. por que será que eu estou fazendo esse post?! => https://www.docker.com/tryit/


Setup

Primeiro, crie sua conta aqui => https://hub.docker.com/account/signup/

Espero que seu inglês básico seja bom, pois eles explicam nos mínimos detalhes como instalar o client do docker => https://docs.docker.com/installation/#installation

Depois de criado e instalado, você pode rodar os seguintes comandos para ver se esta tudo ok.

boot2docker init
#saídas do console no proceso de inicialização
boot2docker up
#saida do console no processo de subir um instancia

Vai ser exibido qual IP e porta em que sua instância (container) irá subir.

Vamos dar um tempo e criar a imagem da sua aplicação.

Criando a imagem do seu aplicativo.

tl:dr3 http://docs.docker.com/reference/builder/

Provavelmente você quer saber como o docker pode te ajudar no dia a dia de teste, correto? bom, a partir daqui você vai precisar da ajuda do time de desenvolvimento da sua aplicação pois é preciso mapear toda e qualquer dependência que você tenha.

Vamos criar criar um arquivo de "receita" (dockerfile) para criar imagem da sua aplicação com as dependência que ela precisa.

nano Dockerfile

Você pode usar outras imagens do docker como base para a sua.

Para exemplo, vou colocar uma aplicação simples em nodejs rodando.

Primeiro crie uma pasta separada onde vai ficar seu container.
Dentro da pasta crie um arquivo sem file_type (sem extensão) chamado dockerfile.

FROM ubuntu:14.04
    
RUN apt-get update
RUN apt-get curl -y
RUN curl -sL https://deb.nodesource.com/setup | sudo bash - 
RUN sudo apt-key add nginx_signing.key
RUN apt-get update
RUN apt-get install -y nodejs
RUN apt-get install nginx
RUN apt-get install git python-virtualenv
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm /etc/nginx/conf.d/default
RUN mkdir -p /var/www

Vou assumir que você não é muito familiarizado com ambiente linux, então vou explicar algum dos comandos:

Se tiver um tempo e alguns trocados sobrando, leia DEVOPS NA PRATICA => http://www.casadocodigo.com.br/products/livro-devops

  • Primeiro eu defino qual base vou utilizar para minha imagem: FROM ubuntu:140.04

  • O comando RUN basicamente executa uma função na linha de comando, ou seja, comandos linux como LS rm ou mkdir podem ser usados.

  • RUN apt-get update e os comandos seguintes na verdade pedem para instalar os aplicativos que vamos precisar para rodar a minha aplicação que no exemplo deste post seria um app nodejs e também um servidor web que neste exemplo é o nginx

  • RUN echo "daemon off;" >> /etc/nginx/nginx.conf Teoricamente após instalar o nginx, o docker finaliza a instância (container) e neste caso estamos dizendo para ele não fazer isso.


WORKDIR /var/www
RUN git clone https://github/enderecoApp app
ADD meuDirConfig/ngninxConfig.conf /etc/nginx/conf.d/meuapp.conf
ADD meuDirConfigs/scriptStartApp.sh /usr/bin/start_server
RUN chmod +x /usr/bin/start_server
	
WORKDIR /var/www/app

EXPOSE 80
    
ENTRYPOINT /usr/bin/start_server
  • WORKDIR /var/www e RUN git clone define o local que eu quero baixar minha aplicação do github e para qual pasta ela irá.

  • O comando ADD adiciona o arquivo de configuração do nginx e define onde ele está na minha máquina e para onde eu quero que ele vá no container.

  • Adicionei um arquivo para iniciar a aplicação (um arquivo do tipo npm start ou similar junto também o nginx).

  • RUN chmod +x transforma nosso arquivo de script em um executável.

  • EXPOSE configura o container para responder pela porta 80.

  • ENTRYPOINT define qual será o ponto de entrada para container.

Pronto, é só salvar o arquivo e mandar criar a imagem.

docker build -t docker_user_name/containerName .

O parâmetro -t serve para tagear a imagem, melhorando a busca depois.

Agora é a hora de ir tomar um café...

Assim que a imagem do container estiver pronta, você pode rodar ele através do comando:

docker run -p 80:80 -d docker_user_name/containerName

O parâmetro -d é para subir o container em background e o parâmetro -p serve para fazer a relação da porta privada para porta publica do container, que neste caso é a mesma.

Agora é só acessar o IP que o docker já mostrou no boot e pronto, pronto para acessar sua aplicação.

Também não deixe de conferir => http://docs.docker.com/articles/dockerfile_best-practices

Considerações

As possibilidades são muitas!

  • Você pode montar um script no jenkins para que após cada deploy, ele subir uma instância da sua aplicação e o jenkins rodar seu scripts de smoketests do cucumber! (Alguém se habilita a fazer esse post?)

  • Geralmente não temos ambiente de teste pois a maquina disponibilizada para tal é a pior possível. Com o mundo cloud e a possibilidade de escalar seu ambiente, e com a simplicidade de usar o mesmo container em produção e em teste, facilita muito a vida da equipe de desenvolvimento, que não tem que ficar brigando com tester e reclamando que o problema reportado é de ambiente .

referências:


Este artigo não é final e está em constante mudança.

#todo:

  • adicionar aplição de teste no github
  • adicionar no github a receita inteira
  • adicionar no github arquivo de configuração do ngnix de exemplo
  • adicionar no github arquivo para dar start no serviço
  • adicionar no docker imagem de container exemplo

Sobre o Autor: Leonardo Galani é Agile Tester, dev, gamer, dj and etc. Mantém o fórum http://agiletesters.com.br | http://leonardobg.com.br (profile)| http://lazytester.com (blog em inglês)
http://br.linkedin.com/in/leonardogalani/