Como rodar uma aplicação java com o docker

Fala galera, beleza?

Depois de um longo tempo  me dedicando a outros projetos, estou me reorganizando com o intuito de voltar a escrever para o blog.

Começarei contando uma historinha… Sabe aquela velha frase “Na minha máquina esta aplicação roda”? Pois é, quem nunca passou por isso? Cansei das vezes em que precisei analisar o porquê de um sistema não subir em outro ambiente e, no final, o problema era uma simples configuração.

No post de hoje, vamos aprender a rodar uma aplicação Java em um container Docker. Para isso, vou utilizar a app desenvolvida no post sobre Integração contínua com Travis e Heroku.

Se você ainda não sabe o que é o Docker, dá uma espiada no post O que é o docker?.

Docker

Se você realmente leu o post O que é o docker?, já entendeu que trata-se de uma tecnologia de código aberto, que permite manipular aplicações dentro de containers. Isso possibilita empacotar o nosso software dentro de uma unidade, contendo todo o necessário para a sua execução. Desse modo, conseguimos rodar esse container em qualquer lugar em que  o docker esteja instalado.

Portanto, chega de dar desculpas. Com o Docker, podemos implantar aplicações rapidamente, de modo confiável e estável, em qualquer ambiente.

Uma maravilha, não?

O arquivo Dockerfile

A grosso modo, este é o arquivo pelo qual podemos definir como será o nosso container. Vamos analisar o Dockerfile abaixo:

FROM openjdk:8u121-jre-alpine
ADD target/mytask.jar mytask.jar
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /mytask.jar"]

Linha 1 – FROM informa qual imagem base será utilizada para gerar a nossa imagem;
Linha 2 – ADD adiciona um arquivo local para dentro da nova imagem;
Linha 3 – EXPOSE expõe as portas do container. No nosso caso, a 8080 é a porta da aplicação;
Linha 4 – ENTRYPOINT informa qual comando será executado quando o container for iniciado.

Vamos utilizar uma imagem que já possui o Java instalado na versão 8 (openjdk:8u121-jre-alpine). O conteúdo depois do “:” (dois pontos) é onde definimos a tag da imagem. Há várias versões da imagem openjdk no Docker Hub.

Percebam também que precisaremos adicionar o jar da aplicação dentro da imagem (linha 2). Antes, porém, precisamos executar o comando do maven para gerar o nosso jar:

$ mvn clean package

Feito isso, estamos prontos para executar o comando de build do Docker e criar a nossa primeira imagem:

$ docker build -t mytask .

Com esse comando, estamos criando uma nova imagem e atribuindo um nome a ela, chamaremos de mytask. Esse comando deverá ser executado na raiz do projeto, pois é onde o arquivo Dockerfile se encontra. Caso a imagem definida no FROM do Dockerfile não exista, seu download será realizado para a máquina hospedeira.

Para verificar se a imagem foi construída com sucesso, execute o comando docker images no seu terminal e verifique se ela foi criada.

Subindo o container

Agora que temos uma imagem com o nosso software, vamos iniciar o container mytask-container executando o comando a seguir:

$ docker run -it -p 8080:8080 --name mytask-container mytask

O comando run irá subir um container com o nome (–name) mytask-container, baseado na imagem mytask.  Esse container será executado na porta 8080, definido pelo mapeamento feito com o parâmetro -p. 

Já o parâmetro -it, irá alocar um terminal para o container e tornará o processo interativo. Para mais detalhes sobre os parâmetros consulte a documentação oficial.

Agora você poderá acessar o endereço http://localhost:8080, no browser, e verificar a aplicação rodando. Simples, não?

Nos próximos posts, veremos como melhorar as configurações do container para subir a aplicação de outras formas. Percebam que, da forma utilizada, precisaremos gerar uma imagem para cada profile da aplicação, o que não é legal.

O post de hoje foi só um aperitivo de como usar o Docker para subir nossas aplicações. Espero que tenham curtido!  😎

E você, já usa o Docker no seu dia a dia? Compartilhe a sua experiência nos comentários…

Abraços e até a próxima!