Sitemap

Spring Boot e Docker

6 min readApr 4, 2021

--

Nesse passo a passo irei discutir uma solução para rodar uma aplicação construída em Spring Boot em uma container do Docker. Não entraremos nos detalhes de como é o funcionamento básicos destas tecnologias, o foco aqui é apenas integrar ambas.

Para concluir nosso objetivo, basicamente iremos criar nossa própria imagem Docker e iremos rodar um executável JAR do nosso projeto desenvolvido em Spring Boot. Então vamos lá!

Aplicação Spring Boot

Para este exemplo, iremos usar uma aplicação que desenvolvi um tempo atrás (sinta-se a vontade em usar algum projeto que você mesmo já trabalhou). Basicamente é uma api implementada em Spring Boot que receberá uma imagem e retornará possíveis textos encontrados nesta imagem usando técnicas de OCR.

É importante entendermos como a aplicação funciona, pois é, a partir deste entendimento, que definiremos como a nossa imagem será ser construída. Por exemplo, se nossa aplicação necessita de algum banco de dados, para ser executada (para persistência de dados), precisaremos providenciar esse recurso em nossa imagem, e assim por diante.

Neste projeto foi usado o Tesseract OCR (é um componente de código aberto que pode ser usado para extrair texto de imagens). O projeto Tesseract nasceu nos laboratórios da Hewlett Packard no final dos anos 80 e desde 2006 o Google está encarregado de seu desenvolvimento.

OBS: Para rodar o projeto localmente é necessário instalar o Tesseract em sua máquina. Caso esteja usando Linux em qualquer distribuição Debian, basta rodar:

sudo apt install tesseract-ocr-por

Estaremos instalando o Tesseract com a versão em português (podemos trabalhar com mais de 130 idiomas!). Basicamente com este comando o Tesseract já é instalado com o arquivo por.traineddata. Este arquivo traineddata existe para cada idioma e é um arquivo em um formato específico do Tesseract. Ele contém vários arquivos de componentes não compactados que são necessários para o processo de OCR.

Agora é necessário adicionar a dependência tess4j no pom.xml do projeto:

<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.1.0</version>
</dependency>

O serviço REST de exemplo possui um método POST no controlador. O código do controlador é este:

A classe do código anterior possui uma anotação @RestController que a identifica como um controlador API Rest. Em seguida é definida um atributo que indica qual linguagem que queremos usar (“por” se refere à português). O método traduzir, possui uma anotação @PostMapping . Esta anotação indica que esta API será exposta como um método POST e seu endpoint localmente será:

http://localhost:8080/ocr

Também podemos notar que o argumento do método possui uma anotação @RequestParam¸ que pode ser usada para informar o nome e o tipo de parâmetro no corpo da solicitação para o método. Para nosso propósito, esperamos um arquivo MultiPart. Por fim, o método chama o Tesseract e adiciona o resultado na resposta. Além de tratar algumas exceções, para caso ocorra algum erro. Caso queira testar segue uma collection no postman com a chamada local:

https://www.getpostman.com/collections/dc4e6c25b42145f90edc

O Dockerfile

Agora que já definimos o escopo da nossa aplicação, iremos discutir um pouco sobre a criação de uma imagem personalizada do Docker no qual será executado nossa aplicação, que seguirá as definições do nosso Dockerfile. O Dockerfile é uma receita que define como os containers do Docker serão executados. Precisaremos das seguintes definições:

Agora vamos ver a definição de cada linha deste Dockerfile:

  • A linha 1 informa que a imagem base que usaremos é a openjdk:11.0.4-jre-slim para o qual será gerada a nossa nova imagem. Basicamente nos fornece uma imagem com o Alpine (distribuição Debian) com o java instalado (Versão 11) .
  • As linhas 3 e 4 são responsáveis para fazer a instalação do Tesseract em nosso container.
  • Linha 6 à 8 estamos apenas verificando se a instalação do Tesseract ocorreu com sucesso.
  • Em seguida (linhas 11 e 12) definimos duas variáveis de ambiente, necessários para usarmos o Tesseract em nossa aplicação.
  • Linha 14 define que o diretório de trabalho (lugar onde serão copiados os arquivos, e criadas novas pastas) será a /app
  • Em seguida, linha 16, é feio a cópia do executável nossa aplicação local para dentro da imagem, renomeando-o para app.jar.
  • E por fim, linha 18, estaremos definindo a execução de um comando no Shell, para rodar nossa aplicação.

Todo o código deste artigo está neste repositório do github:

Executando a aplicação Spring Boot em um Container Docker

Com a nossa aplicação e o Dockerfile em mãos já somos capazes de construir um container Docker e rodar a nossa aplicação.

Suponho que você tenha o Docker instalado em sua máquina, instala-lo não é uma tarefa muito difícil, por isso pularei essa etapa, e para exemplificar, a partir de agora irei executar os testes no Windows.

Primeiramente precisamos construir a imagem do Docker a partir do arquivo Dockerfile, para isso basta rodar o comando a seguir na raiz do projeto:

docker build -t spring-boot-docker .

Assim criamos uma imagem com o nome “spring-boot-docker” e o ponto (.), no final do comando, garante que a imagem será criada com as definições prescritas no Dockerfile que está na raiz do projeto.

Se tudo estiver certo você receber de output algo parecido com a imagem:

Press enter or click to view image in full size

Podemos ver se tudo ocorreu bem listando todas as imagens presentes e verificando se a imagem que acabamos de construir está presente:

docker images -a

Próximo passo é rodar nossa imagem recém criada:

docker run -d -p 8080:8080 spring-boot-docker

A flag -d foi usada para que o processo seja executado em segundo plano, a -p para mapearmos a porta para localhost:8080. Se tudo ocorrer bem a saída que você receberá será semelhante à que você vê na imagem abaixo:

Por fim, vamos listar os containers e verificar o status com este comando:

docker ps

A imagem abaixo mostra os containersdo Docker em execução no momento, você deve ver algo parecido com isto:

Press enter or click to view image in full size

Visualizando Logs

Para garantirmos que está tudo rodando perfeitamente com a nossa aplicação, vamos analisar os logs do container que acabamos de subir:

docker logs 55edf50d7d9e

É necessário definir qual container queremos visualizar os logs, basta copiar o CONTAINER ID que obtivemos do comando anterior. Estamos com a nossa aplicação rodando em um container docker:

Press enter or click to view image in full size

Testando o aplicativo

Agora que o container está em execução, tentaremos acessar o serviço RESTful usando o Postman. Iremos acessar o endpoint em http://localhost:8080/ocre insira uma imagem para extração do texto.

Press enter or click to view image in full size

Para este exemplo utilizei essa imagem aqui:

E a aplicação nos retornou:

SPRING BOOT O
Alta produtividade no
desenvolvimento de aplicações

Conclusão

Se quiser, você pode usar outras imagens com textos para testar a aplicação, mas o mais importante aqui é que conseguimos construir uma imagem personalizada, a partir de um Dockerfile, e rodamos uma aplicação em Spring Boot em um container Docker. Essa abordagem, é uma de muitas outras para trabalharmos com essas duas tecnologias, porém esta que discutimos nesse artigo serve como base para criação de soluções mais robustas, levando em conta outras partes importantes no desenvolvimento de software como, por exemplo DevOps, e os paradigmas e potencial de se usar Docker no desenvolvimento. No próximo artigo espero poder discutir mais sobre tais estratégias envolvendo docker compose, maven, etc. Espero que este artigo tenha sido útil para seus objetivos e até a próxima!

--

--