Docker: Colocando sua aplicação no container

Docker: Colocando sua aplicação no container

O Docker é uma plataforma que vem ganhando cada vez mais atenção dos grandes players e caminha para tornar-se um padrão para aplicações na nuvem.

Neste tutorial vou mostrar como colocar sua aplicação no container além de explicar alguns conceitos.

Para criar seu próprio container você vai precisar de uma imagem base. Vou utilizar uma imagem oficial do Docker que já com o java e tomcat instalados:

Para baixar uma imagem do repositório utilize o comando:

docker pull [OPTIONS] NAME[:TAG]

 

Agora que temos a imagem oficial do Tomcat podemos instanciar containers a partir dela. Um conceito importante do Docker é a diferença entre containers e imagens. As imagens são imutáveis enquanto os containers são “instancias” dessa imagem. Todas as alterações no sistema de arquivos durante a execuçcão ficam no container. Após rodar um container podemos fazer o commit de suas alterações promovendo esse container para uma nova imagem.

Para rodar um container a partir da imagem utilize o comando:

 docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG…]

docker_run

Como o gif acima mostra  instanciei um container passando como argumento o executável do bash para ter acesso ao prompt de comando do container. As opções -t -i permitem interagir com o container e digitar comandos diretamente.

Como podemos ver nosso container já veio com o tomcat instalado. Vamos agora fazer deploy de um aplicativo java .war diretamente na pastar webapps do tomcat.

Vou usar neste exemplo o war do jenkins fazendo o download do arquivo para a pasta webapps do tomcat.

wget_jenkins

Enquanto nossa container está rodando vamos ver como obter algumas informações sobre ele. Vamos abrir outro terminal da maquina host e digitar:

docker ps 

docker_ps

O comando ps mostra a lista de containers ativos com algumas informações básicas como o id, status portas etc.

Também podemos ver quais arquivos foram alterados no sistema de arquivos com o comando:

docker diff <id_do_container>

docker_diff

Podemos ver no diff que único arquivo adicionado foi o jenkins.war

Vamos finalizar a execução do container saindo do bash com o comando exit e fazer commit das alterações. O comando ps com a opção -a lista os containers finalizados.

Para fazer o commit e gerar uma nova imagem a partir do container digite:

docker commit <container_id> <nome_da_nova_imagem>

docker_commit

Agora ao digitar docker images podemos visualizar a imagem “ricardomurad/tutorial” que contém nossa aplicação instalada.

Agora com a partir do comando  “docker run -d ricardomurad/tutorial catalina.sh run” podemos instanciar quantos containers forem necessários.

Todo este processo de criação da imagem pode ser automatizado e feito a partir de um único comando.

No próximo tutorial vou mostrar como criar um Dockerfile.

2 comments

  1. Muito legal o post, chegou a escrever o próximo que citou?

    Estamos adotando o uso do docker onde eu trabalho(Zenvia) e vimos muitos ganhos, o principal para mim foi testar as aplicações num ambiente mais real, fora os testes unitários agora estamos criando testes integrados subindo containers com a aplicação e suas dependências e rodando testes em ambientes identicos a produção de forma simples. Como as aplicações são Java, adotamos dois plugins bem massa para integrar com docker e rodar nossos testes: docker-maven-plugin e maven-failsafe-plugin a qual atendeu bem nossas necessidades para automatizar e integrar com o jenkins.

    Outra dica massa é usar o dockerhub para guardar / versionar as imagens, a integração dele com o bitbucket é demais, permitindo com o webhook num simples commit já criar a imagem.

    Ótimo post e certamente o primeiro passo é fazer todas aplicações gerarem suas images com o Dockerfile, acredito que um segundo momento seja integrar elas fazendo que elas rodem com todas suas dependencias satisfestas(docker-compose) e por fim e não menos importante automatizar.

    Um passo mais ousado mas já uma realidade e começar a fazer deploy dos containers, dai os dev pira =)

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *