Criando e enviando imagem Docker com Java e Maven

Neste tutorial vamos aprender a criar e publicar uma imagem docker de forma simples e fácil apenas usando comandos do maven em um projeto spring boot.
Requisitos
Para criar uma imagem docker a partir do maven, vamos precisar de algumas tecnologias.
O plugin Dockerfile Maven
Apache Maven, ou Maven, é uma ferramenta de automação de compilação, gerenciamento, construção e implantação de projetos. Com a chegada do docker, também surgiu a necessidade do processo de criação e envio de imagens ser mais simples e rápido, foi pensando nisso que o pessoal do spotify criou um plugin chamado dockerfile-maven, facilitando a criação e envio de imagens docker. Com o dockerfile-maven é possível incluir no ciclo de construção do maven a criação e o envio da imagem para um repositório.
Antes de criar o dockerfile-maven, o spotify também criou um plugin de geração e enviou de imagens docker com o maven chamado docker-maven-plugin que hoje encontra-se inativo, porém ainda existem muitas coisas na internet sobre ele, e acaba gerando muita confusão para quem pesquisa, porém quem entrar no github do docker-maven-plugin vai notar que está inativo, também notará uma recomendação para usar o dockerfile-maven no lugar.

Criando projeto java maven
Para seguimos com o tutorial, vamos precisar de um projeto java maven, para isso vamos criar nosso projeto baseado no Spring Boot a partir do template do spring Initializr
Na tela do spring initializr, vamos selecionar a opção Maven Project, a linguagem será Java e a versão do Spring Boot como 2.2.0, normalmente essas opções vem como default, com exceção da versão do Spring Boot que sempre será a ultima estável, também vamos adicionar a dependência do Spring Web.
Feito isso, vamos clicar em Generate para gerar e baixar o projeto.

Criando um serviço REST
Para prosseguir com os testes precisamos criar um serviço REST apenas para validação do nosso container assim que a imagem for gerada.
Vamos criar uma controller contendo apenas um método Http Get retornando uma simples String com o conteúdo: "Hello world". Então vamos criar uma classe, com o nome de HelloController e adicionar o seguinte conteúdo:
Criando o arquivo dockerfile
Antes de começarmos a criar nossa imagem docker precisamos do arquivo Dockerfile, já que o plugin dockerfile-maven necessita dele.
Com o passar do tempo e com a experiência no plugin docker-maven-plugin o próprio Spotify percebeu que a forma mais simples e fácil de criar imagens docker a partir de um projeto Java é fazer o desenvolvedor criar o arquivo Dockerfile.
Já que o plugin dockerfile-maven precisa de um arquivo Dockerfile, então vamos criá-lo.
Para isso crie na raiz do projeto um arquivo com o nome de Dockerfile e adicione o seguinte conteúdo:
A estrutura do nosso projeto com o arquivo Dockerfile ficará como na imagem abaixo:

Configurando o pom.xml do projeto
Para configurar o plugin dockerfile-maven precisamos editar o arquivo pom.xmldo nosso projeto.
Uma conta no docker hub é necessária para esse tutorial, já que vamos usá-lo como repositório de imagens docker, caso não tenha, você pode criar acessando a página do docker hub.
Vamos adicionar dentro da tag plugins as seguintes configurações, que encontra-se selecionada na imagem abaixo:

Entendendo a nova configuração no pom.xml
A configuração em si é muito simples, além de incluir a dependência do dockerfile-maven também adicionamos algumas tags, como a execution que incluindo uma etapa no ciclo de construção do maven para o build e push da imagem.
Dentro da tag configuration, adicionamos a tag useMavenSettingsForAuth, como o nome já diz, estamos ativando a autenticação via setting do maven. Não é necessária para criar uma imagem docker, apenas quando for enviar a imagem para um repositório.
Na tag repository, informei meu docker ID e o nome que queremos para a imagem. Se você possui um um docker ID, informe no lugar de fexx182, isso servirá para enviarmos para o docker hub.
Na tag com o nome de tag será a versão/tag da imagem.
E por fim, temos a tag JAR_FILE, que nada mais é do que o nosso pacote .jar.
O arquivo pom.xml completo ficará:
Criando a imagem docker com o dockerfile maven
Após criar o arquivo Dockerfile e adicionar as configurações necessárias no arquivo pom.xml, agora é hora de criamos a imagem docker usando comandos do maven. Para criamos a imagem é muito simples, precisamos apenas está no diretoria raiz do projeto e executar o seguinte comando maven:
mvn packageO comando mvn package cria um novo arquivo .jar dentro da pasta target que será usado para a nossa imagem docker.
Após executar o comando, já podemos consultar em nossas imagens docker local se a imagem do nosso projeto foi criada.
Execute o seguinte comando para listar as imagens docker disponíveis em seu sistema.
docker imagesApós isso podemos notar que a imagem com o nome do nosso projeto foi criada e a tag da imagem foi criada com base na versão da aplicação.

Testando o projeto com a imagem docker gerada
Para testarmos a imagem gerada, vamos acessar nossa aplicação através do serviço HelloController que criamos, vamos criar o container, para isso, execute o seguinte comando:

docker run -p 8080:8080 {seu_docker_id}/spring-docker-spotify:0.0.1-SNAPSHOTApós a aplicação subir, podemos acessar o endereço: http://localhost:8080/hello perceba que a mensagem "Hello world" aparecerá.
Enviando a imagem para o docker hub
Após usarmos o dockerfile-maven para criar a imagem docker, percebemos o quanto pode ser útil no dia a dia, e para ganhamos mais produtividade com o dockerfile-maven, podemos usá-los para enviar a imagem para um serviço de registro de imagens em nuvem, como o docker hub.
Para que isso seja possível, temos que configurar algumas coisas, porém é tão simples que uma das configurações nos já fizemos, que foi no pom.xml, a outra configuração fica no arquivo settings.xml do maven.
Configurando o settings.xml
Uma das etapas que temos que fazer para o dockerfile-maven consegui enviar nossa imagem para um repositório, é informar nossas credenciais no arquivosettings.xml do maven.
No arquivosettings.xml do maven e dentro da tag servers vamos adicionar o seguinte conteúdo:
Entendendo a nova configuração no arquivo settings.xml
id: registry do docker hub
username: docker hub ID
password: senha do docker hub
email: seu email
Após configuramos o arquivo settings.xml, é hora de enviar a imagem para o docker hub, para isso execute o comando abaixo:
mvn dockerfile:pushAgora podemos visualizar nossa imagem no docker hub. 😀

Conclusão
Nesse artigo passo a passo, aprendemos a usar o plugin do Spotify chamado dockerfile-maven em um projeto java maven, para que no ciclo de construção do maven fosse capaz de gerar uma imagem docker baseada em um arquivo dockerfile, logo após aprendemos a enviar a imagem para um serviço de registro de imagens em nuvem o docker hub.
Código fonte do tutorial, você pode acessar o meu github.