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