Construindo imagem Docker em projetos Java
Docker se tornou o padrão no setor de containers e conta com suporte dos maiores fornecedores do ecossistema Linux. Com toda certeza o Docker se tornou padrão para implantação de serviços ou aplicativos baseado em servidor.
Mas como podemos gerar uma imagem Docker da nossa aplicação e qual a melhor forma de fazer isso?
Nesse artigo trago 2 exemplos de plugins que utilizo em meus projetos para criar imagens Docker.
Primeiramente vamos falar do Jib. Ele é um construtor de imagens para containers, desenvolvido em Java, tem plugins tanto para o Maven como para o Gradle, não é necessário ter nenhum arquivo de configuração como o Dockerfile, e o mais legal de tudo é que ele separa o aplicativo em varias camadas, caso tenha apenas alteração no código fonte da aplicação, apenas a camada do código é reconstruída, caso tenha alguma nova dependência adicionada a aplicação apenas essa camada é reconstruida.
Segue exemplo da configuração do plugin do Jib utilizando Maven, onde podemos definir o nome da imagem, definir as flags para a JVM e qual a classe Main.
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.6.0</version>
<configuration>
<from>
<image>openjdk:15-jdk-slim-buster</image>
</from>
<to>
<image>gasparbarancelli/blog:${build.number}</image>
</to>
<container>
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
<jvmFlag>-Xmx2048m</jvmFlag>
</jvmFlags>
<mainClass>com.gasparbarancelli.BlogApplication</mainClass>
</container>
</configuration>
</plugin>
Com o plugin configurado agora podemos executar a seguinte tarefa (Goal) no Maven.
# Para construir a imagem sem o Docker Daemon.
mvn compile jib:build
# Para construir a imagem utilizando o Docker daemon.
mvn compile jib:dockerBuild
Para verificarmos que a imagem foi construída com sucesso, podemos digitar o seguinte comando.
docker images | grep blog
Para o segundo exemplo vamos utilizar um plugin desenvolvido pelo Spotify.
Devemos criar em nosso projeto o arquivo Dockerfile, esse arquivo deve conter as configurações necessárias para construir nossa imagem, por melhor pratica devemos adicionar esse arquivo dentro do projeto, no meu caso adicionei o arquivo no seguinte diretorio src/main/docker. Repare que nesse arquivo configuramos a imagem base, adicionamos o artefato gerado pelo maven dentro da imagem e também definimos o comando que deve ser executado ao iniciar o container docker.
FROM openjdk:15-jdk-slim-buster
ADD blog.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT [ "sh", "-c", "java -Xms512m -Xmx2048m -jar /app.jar"]
Depois de configurarmos o Dockerfile podemos adicionar o plugin do maven.
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>gasparbarancelli/blog</imageName>
<imageTags>${build.number}</imageTags>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
Com o plugin configurado agora podemos executar a seguinte tarefa (Goal) no Maven.
mvn compile docker:build
Assim como no exemplo anterior, para verificarmos que a imagem foi construída com sucesso, podemos digitar o seguinte comando.
docker images | grep blog