Guia Passo a Passo: Deploy de uma API REST Java no Docker
Tags: api, docker, java, restapi
Published: 2023-11-29 20:35:05

**Introdução**
O Docker é uma ferramenta poderosa que simplifica o processo de empacotar, distribuir e executar aplicativos em contêineres. Neste guia, vamos explorar como fazer o deploy de uma API REST Java em um contêiner Docker.

**Pré-requisitos**
•	JDK instalado
•	Maven instalado
•	Docker instalado
•	Conta no Docker Hub
•	Intellij ou uma IDEA de sua preferência (no exemplo será utilizado Intellij).
Conhecimento básico do Docker e do Docker Compose.

Se gostou do artigo, lhe serviu deixe um like ou um comentário, é sempre bom saber, obrigado e até logo.

**Passo 1: Criando o repositório Docker Hub**

Acesse o site: https://hub.docker.com/
Caso não possua, crie uma conta o processo é bem simples, após criar a conta, siga os passos abaixo:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/66qsqcjlohzsfglp57ca.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1n6a222hehc3hulmicch.png)

Quanto a regra de criação do nome do repositório: O nome do seu repositório deve conter uma combinação de caracteres alfanuméricos e pode conter os caracteres especiais ., _ ou -. As letras devem ser minúsculas.

Clique em Create e após isso, verá essa tela:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mnp6vbjgelpzn2849lrz.png)


**Dê atenção ao destaque em vermelho**, ali terá o **seu nome de usuário** no meu caso: diegobr e o **nome do repositório**: dockerapirest
**Grave essas duas informações, pois iremos utilizá-la a seguir**.


**Passo 2: Preparando o Projeto**
Certifique-se de ter um projeto Java Spring Boot pronto para ser empacotado. Se você ainda não tem um, pode criar um rapidamente usando o Spring Initializer.
Recomendo usar essas dependências para melhor didática, será necessário para o teste mais a frente:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wsyer2cgco56qveejnrc.png)



Você, pode iniciar um do zero: https://start.spring.io/
Ou você pode usar o exemplo do artigo, acessando aqui: https://github.com/diegoSbrandao/Deploy-Docker-Exemplo


Abra o pom.xml e vá até o final em plugins, conforme imagem abaixo, você irá adicionar esse trecho de código:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w1q4rt9nmfn1vfgzfndk.png)

**IMPORTANTE: Na linha 16 <repository>  </repository> você deve alterar, para o nome do seu usuário e nome do seu repositório no Docker Hub.**

```
           <plugin>
				<groupId>com.spotify</groupId>
				<artifactId>dockerfile-maven-plugin</artifactId>
				<version>1.4.13</version>
				<executions>
					<execution>
						<id>default</id>
						<goals>
							<goal>build</goal>
							<goal>push</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
					<repository>diegobr/dockerapirest</repository>
					<tag>${project.version}</tag>
					<buildArgs>
						<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
					</buildArgs>
				</configuration>
			</plugin>
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mz31c0ozrpdpuvq94q8h.png)
A princípio ficará assim seu pom.

**Explicação de cada linha da configuração do plugin:**


Declaração do plugin

A tag <plugin> declara o uso do plugin dockerfile-maven-plugin. Ela fornece as seguintes informações:
groupId: com.spotify - Identifica o fornecedor do plugin, Spotify.
artifactId: dockerfile-maven-plugin - Identifica o artefato do plugin, dockerfile-maven-plugin.
version: 1.4.13 - Especifica a versão do plugin, 1.4.13.


Execução do plugin
A tag <executions> define as fases e metas de execução do plugin. Neste caso, há uma única execução com o ID default. Ela executa duas metas:

build: Constrói a imagem Docker usando o Dockerfile especificado no projeto.
push: Envia a imagem Docker construída para o repositório especificado.


Configuração do plugin
A tag <configuration> define os parâmetros de configuração do plugin. Ela inclui as seguintes configurações:
useMavenSettingsForAuth: true - Indica que as credenciais de autenticação devem ser recuperadas do arquivo Maven settings.xml.
repository: seu nome/nome repositorio - Especifica o repositório Docker Hub para onde a imagem será enviada.

tag: <span class="math-inline">\{project\.version\}\ - Define a tag da imagem Docker para a versão atual do projeto. 4. `buildArgs`: `JAR_FILE={project.build.finalName}.jar- Define um argumento de build chamadoJAR_FILE` que define o valor para o nome do arquivo JAR gerado pela compilação do projeto. Este argumento é usado no Dockerfile para especificar o arquivo JAR a ser incluído na imagem.


**Passo 3: Dockerfile**

Na raiz do projeto crie o arquivo Dockerfile, lembrando ele deve ter exatamente este nome e NENHUMA extensão.
Existe várias formas de cria-lo, eu deixo a abaixo uma delas:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5cn803h97w28pzrs1ter.png)

Com o arquivo Dockerfile criado, vamos usar a configuração para subirmos nossa imagem:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a4o2zf55vbqqqhnktqtu.png)

```
FROM eclipse-temurin:17-jdk-alpine
RUN mkdir app
ARG JAR_FILE
ADD /target/${JAR_FILE} /app/spring-docker-spotify.jar
WORKDIR /app
ENTRYPOINT java -jar spring-docker-spotify.jar

```
**Explicação:**
--FROM eclipse-temurin:17-jdk-alpine
Esta linha especifica a imagem base para o contêiner Docker. A imagem eclipse-temurin:17-jdk-alpine é um ambiente de execução Java leve baseado no OpenJDK 17 e no Alpine Linux.

-- RUN mkdir app
Esta linha cria um diretório chamado app dentro do contêiner. Este diretório será usado para armazenar os arquivos do aplicativo.

-- ARG JAR_FILE
Esta linha define um argumento chamado JAR_FILE. O valor deste argumento será especificado ao construir a imagem Docker.

-- ADD /target/${JAR_FILE} /app/spring-docker-spotify.jar
Esta linha copia o arquivo JAR do diretório target para o diretório app no contêiner. O argumento JAR_FILE é usado para especificar o nome do arquivo JAR.

-- WORKDIR /app
Esta linha define o diretório de trabalho para o contêiner como o diretório app. Isso significa que quando o contêiner for iniciado, quaisquer comandos executados serão executados a partir do diretório app.

-- ENTRYPOINT java -jar spring-docker-spotify.jar

Esta linha define o ponto de entrada para o contêiner. O entrypoint é o comando que será executado quando o contêiner for iniciado. Neste caso, o entrypoint é o comando java, que é usado para executar o arquivo JAR. A opção -jar especifica que o comando java deve executar um arquivo JAR. O argumento spring-docker-spotify.jar especifica o nome do arquivo JAR a ser executado.


**Passo 4: Criando a imagem.**
Importante tenha logado no Docker Desktop.

Antes de criarmos, considere alterar a versão da aplicação do pom, conforme exemplo abaixo:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ykktp3lb4urqibcqqu1.png)

Agora iremos empacotar e criar nossa imagem, no terminal da raiz do projeto onde estão pom.xml, use o comando: mvn package


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mf1mwallmztdczvlg29.png)

Se tudo ocorrer conforme esperado, terá esse resultado no console:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yuqzxp9r0feoqn6q1kvr.png)


Utilize o comando: docker images, deve aparecer conforme abaixo, sua imagem:
 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/37qk5w0p52xust9nwswb.png)

Agora, vamos subir a imagem para o Docker Hub no passo 5.


**Passo 5: Subindo imagem no Docker Hub**

Para subir sua imagem você irá utilizar os comandos abaixo:

```
docker tag nome-da-imagem:tag nome-do-usuario/nome-do-repositorio:tag

docker push nome-do-usuario/nome-do-repositorio:tag
```

Exemplificando, no caso do exemplo o meu ficará assim:

`docker tag diegobr/dockerapirest:1.0.0 diegobr/dockerapirest:tag`
informação como pode ver retiradas daqui.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qvo8br31b50n4l46jr0k.png)

Após incluir o comando acima:
 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7zqyana37uixevr1z6z.png)

Nada será mostrado, isto é normal e esperado.

E agora damos o comando de push:
`docker push diegobr/dockerapirest:1.0.0`

Após o comando a imagem será montada e enviada.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bmqk7qh3mfa7mnk8dwkk.png)


Vá ao seu repositório e escolhe a opção Tag:
 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eku8wftsb675zoyw2e2u.png)


Você verá o número da tag que criou e o pull da sua imagem Docker.

**Passo 6: Testando spring actuator.**


Para testar, apaguei toda a imagem que tinha da api, conforme imagem abaixo:
 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/odrd91a638qyrluxvi5b.png)

E vou utilizar a imagem que subi para testar, para isso: simplesmente copiamos o Docker pull conforme destaque em vermelho, no caso estou utilizando o bash do git, mas pode ser qualquer terminal.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tppfkiy3x9jxky57eepx.png)

Imagem baixada e agora vamos testar:
 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mi0tv9ir21jco7r0undd.png)

Utilize o comando abaixo para rodar a imagem:

```
docker run -p 8080:8080 diegobr/dockerapirest:1.0.0
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7anbciuoe28megmrblzx.png)


Agora, abrimos um navegador ou use postman ou insomnia, caso prefira, e utilize esse endereço: http://localhost:8080/actuator/health
Conforme, pode ver na imagem a aplicação foi deploy no Docker com sucesso.

_**Se seguiu até aqui, meu muito obrigado, se gostou do artigo, lhe serviu deixe um like ou um comentário, é sempre bom saber, obrigado e até logo.**_



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z75paljgm0asv0igkdy6.png)