Como Colocar um Projeto Java em um Contêiner Docker com Docker Compose
Este guia mostra como configurar um projeto Java com banco de dados PostgreSQL em contêineres Docker. Vamos usar o Dockerfile para definir a imagem do contêiner do aplicativo Java e o docker-compose.yml
para orquestrar o aplicativo e o banco de dados.
Estrutura do Projeto
Aqui está a estrutura de diretórios esperada para o projeto:
/seu-projeto
├── Dockerfile
├── docker-compose.yml
├── target/
│ └── hurr-0.0.1-SNAPSHOT.jar
├── sql/
│ └── seus-scripts.sql
1. Dockerfile para Configurar o Contêiner Java
Primeiro, vamos analisar o Dockerfile para o contêiner Java, que será responsável por executar o aplicativo:
# Usando uma imagem do JDK 21 da Amazon Corretto como base
FROM amazoncorretto:21
# Definindo o diretório de trabalho dentro do contêiner
WORKDIR /app
# Copiando o JAR da aplicação para o contêiner
COPY target/hurr-0.0.1-SNAPSHOT.jar /app/app.jar
# Copiando todos os scripts SQL para o diretório /app/sql no contêiner
COPY sql/ /app/sql/
# Variável de ambiente para o tempo de execução Java
ENV JAVA_OPTS=""
# Expondo a porta que a aplicação usa
EXPOSE 8080
# Comando para rodar a aplicação
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
Explicação do Dockerfile
- Imagem Base:
amazoncorretto:21
é usada como a base da imagem, fornecendo o JDK 21 necessário para rodar o aplicativo. - Diretório de Trabalho:
WORKDIR /app
define/app
como o diretório de trabalho dentro do contêiner. - Cópia do JAR da Aplicação:
COPY target/hurr-0.0.1-SNAPSHOT.jar /app/app.jar
copia o arquivo JAR compilado para o contêiner. - Cópia de Scripts SQL:
COPY sql/ /app/sql/
copia todos os scripts SQL para o diretório/app/sql
no contêiner, caso sejam necessários para inicializar o banco de dados. - Variável de Ambiente:
ENV JAVA_OPTS=""
permite definir variáveis de execução Java para ajustes de memória e outros parâmetros de execução. - Exposição de Porta:
EXPOSE 8080
indica a porta que o aplicativo usará para se comunicar com o exterior. - Comando de Inicialização:
ENTRYPOINT
inicia a aplicação usando o comandojava -jar /app/app.jar
, aplicando as variáveis de ambienteJAVA_OPTS
.
2. Arquivo docker-compose.yml para Orquestração
O arquivo docker-compose.yml
define como os serviços do aplicativo Java e do banco de dados PostgreSQL interagem.
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
environment:
- JAVA_OPTS=-Dspring.datasource.url=jdbc:postgresql://db:5432/hurr?currentSchema=hurr
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=postgres
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: hurr
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Explicação do docker-compose.yml
- Serviço
app
:- Build:
build
define que a imagem do serviço será construída a partir doDockerfile
na raiz do projeto. - Variáveis de Ambiente:
JAVA_OPTS
: Configura o endereço do banco de dadosdb
, o nome do banco (hurr
), e o schema (hurr
), além das credenciais de usuário e senha.SPRING_DATASOURCE_USERNAME
eSPRING_DATASOURCE_PASSWORD
: Definem o usuário e a senha do banco de dados.
- Portas:
ports
mapeia a porta8080
do contêiner para8080
na máquina host. - Depends_on:
depends_on
define que o serviçoapp
só iniciará após o serviçodb
estar em execução.
- Build:
- Serviço
db
:- Imagem do PostgreSQL:
postgres:15
usa uma imagem oficial do PostgreSQL na versão 15. - Variáveis de Ambiente: Configuram o nome do banco (
POSTGRES_DB
), o usuário (POSTGRES_USER
) e a senha (POSTGRES_PASSWORD
) para o banco de dados. - Portas:
ports
mapeia a porta5432
do contêiner para5432
no host, permitindo que o banco seja acessado localmente. - Volume:
volumes
cria um volume persistente (postgres-data
) para armazenar dados do banco.
- Imagem do PostgreSQL:
- Volume
postgres-data
:- Esse volume garante que os dados do banco de dados persistam, mesmo se o contêiner for reiniciado.
3. Iniciando a Aplicação com Docker Compose
Para iniciar os contêineres do aplicativo Java e do banco de dados PostgreSQL, execute o seguinte comando:
docker-compose up --build
Esse comando cria e inicia os contêineres, exibindo os logs diretamente no terminal. A aplicação estará disponível em http://localhost:8080
e o banco de dados PostgreSQL estará disponível na porta 5432
.
4. Verificando a Configuração
- Acessando a Aplicação: Acesse
http://localhost:8080
para verificar se o aplicativo está rodando corretamente. - Acessando o Banco de Dados: Você pode conectar-se ao banco PostgreSQL usando um cliente SQL e os seguintes parâmetros:
- Host:
localhost
- Porta:
5432
- Banco de Dados:
hurr
- Usuário:
postgres
- Senha:
postgres
- Host:
Conclusão
Com essa configuração, você tem um ambiente Docker completo para rodar um projeto Java com PostgreSQL. Esse setup facilita o desenvolvimento e a replicação do ambiente em outras máquinas. Além disso, o uso de variáveis de ambiente torna a configuração flexível e adaptável a diferentes ambientes, como desenvolvimento, testes e produção.