Como configurar o comando de inicialização de uma aplicação Java EE no Docker

DockerBeginner
Pratique Agora

Introdução

O Docker revolucionou a forma como desenvolvemos, empacotamos e implantamos aplicações, incluindo aplicações Java EE (Enterprise Edition). Neste tutorial, guiá-lo-emos através do processo de configuração do comando de inicialização para uma aplicação Java EE a executar num contêiner Docker, garantindo uma implantação e execução sem problemas da sua aplicação web.

Introdução aos Contêineres Docker

Docker é uma plataforma popular de contentores que permite aos desenvolvedores empacotar e implantar aplicações de forma consistente e repetível. Os contêineres são unidades leves, autónomas e autocontidas que encapsulam uma aplicação, as suas dependências e o ambiente de execução necessário.

O que é um Contêiner Docker?

Um contêiner Docker é uma unidade de software padronizada que empacota o código da aplicação, as dependências e a configuração num único pacote portátil e executável. Os contêineres estão isolados do sistema operativo hospedeiro e de outros contêineres, garantindo uma implantação de aplicações consistente e fiável.

Benefícios do Uso de Contêineres Docker

  • Ambientes Consistentes: Os contêineres garantem que a aplicação e as suas dependências são empacotadas em conjunto, eliminando o problema de "funciona na minha máquina".
  • Escalabilidade e Flexibilidade: Os contêineres podem ser facilmente escalados para cima ou para baixo, permitindo uma utilização eficiente dos recursos e uma implantação rápida de aplicações.
  • Portabilidade: Aplicações em contêineres podem ser executadas em qualquer sistema que suporte Docker, independentemente da infraestrutura subjacente.
  • Eficiência Melhorada: Os contêineres são leves e partilham o kernel do sistema operativo hospedeiro, resultando em tempos de inicialização mais rápidos e menor consumo de recursos.

Arquitetura Docker

Docker utiliza uma arquitetura cliente-servidor, onde o cliente Docker comunica com o daemon Docker, que é responsável por construir, executar e gerir contêineres Docker.

graph LD
    subgraph Arquitetura Docker
        client([Cliente Docker])
        daemon([Daemon Docker])
        client -- API --> daemon
        daemon -- Images/Containers --> storage([Armazenamento Docker])
    end

Instalação e Configuração do Docker

Para começar com Docker, precisa de instalar o motor Docker no seu sistema. O processo de instalação varia dependendo do seu sistema operativo. Neste tutorial, usaremos Ubuntu 22.04 como exemplo.

## Instalar Docker no Ubuntu 22.04
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

Depois de o Docker estar instalado, pode verificar a instalação executando o seguinte comando:

docker version

Isto irá mostrar as informações de versão do cliente e daemon Docker.

Configurando o Comando de Inicialização para uma Aplicação Java EE

Ao executar uma aplicação Java EE num contêiner Docker, é necessário configurar o comando de inicialização para garantir que a aplicação é lançada e gerida corretamente dentro do contêiner.

Compreendendo o Comando de Inicialização

O comando de inicialização para uma aplicação Java EE num contêiner Docker é normalmente definido usando as instruções CMD ou ENTRYPOINT no Dockerfile. A instrução CMD especifica o comando padrão a ser executado quando o contêiner é iniciado, enquanto a instrução ENTRYPOINT define o comando base para o contêiner.

Aqui está um exemplo de um Dockerfile que define o comando de inicialização para uma aplicação Java EE:

FROM openjdk:11-jdk-slim
COPY target/my-java-ee-app.war /app/
WORKDIR /app
CMD ["java", "-jar", "my-java-ee-app.war"]

Neste exemplo, a instrução CMD especifica que a aplicação Java EE deve ser iniciada executando o comando java -jar my-java-ee-app.war.

Personalizando o Comando de Inicialização

Em alguns casos, pode ser necessário personalizar o comando de inicialização para a sua aplicação Java EE. Isto pode ser feito modificando a instrução CMD ou ENTRYPOINT no Dockerfile.

Por exemplo, se a sua aplicação Java EE necessitar de argumentos de linha de comando adicionais ou variáveis de ambiente, pode modificar a instrução CMD da seguinte forma:

FROM openjdk:11-jdk-slim
COPY target/my-java-ee-app.war /app/
WORKDIR /app
CMD ["java", "-Xmx512m", "-Dmy.app.env=production", "-jar", "my-java-ee-app.war"]

Neste exemplo, a instrução CMD inclui opções JVM adicionais (-Xmx512m) e uma variável de ambiente personalizada (-Dmy.app.env=production) que são passadas ao comando Java quando o contêiner é iniciado.

Sobrescrevendo o Comando de Inicialização

Também pode sobrescrever o comando de inicialização ao executar o contêiner Docker usando o comando docker run. Isto pode ser útil se precisar de executar um comando ou script diferente dentro do contêiner, ou se quiser passar argumentos adicionais à aplicação.

docker run -d -p 8080:8080 my-java-ee-app-image java -jar /app/my-java-ee-app.war --spring.profiles.active=dev

Neste exemplo, o comando docker run sobrescreve o comando de inicialização definido no Dockerfile e executa a aplicação Java EE com um perfil Spring específico (--spring.profiles.active=dev).

Implantando a Aplicação Java EE no Docker

Depois de configurar o comando de inicialização da sua aplicação Java EE, pode prosseguir para a construção e implantação da imagem Docker.

Construindo a Imagem Docker

Para construir a imagem Docker da sua aplicação Java EE, pode usar o comando docker build. Supondo que tem um Dockerfile no diretório atual, pode executar o seguinte comando:

docker build -t my-java-ee-app .

Isto criará uma nova imagem Docker com a etiqueta my-java-ee-app com base nas instruções no Dockerfile.

Executando o Contêiner Docker

Após a construção da imagem Docker, pode executar a aplicação Java EE num contêiner Docker usando o comando docker run:

docker run -d -p 8080:8080 my-java-ee-app

Este comando iniciará um novo contêiner baseado na imagem my-java-ee-app e mapeará a porta 8080 no host para a porta 8080 no contêiner.

Verificando a Implantação

Para verificar se a aplicação Java EE está a funcionar corretamente no contêiner Docker, pode usar os seguintes comandos:

## Listar contêineres em execução

## Visualizar os logs do contêiner em execução

## Aceder à aplicação num navegador web

O comando docker ps listará todos os contêineres em execução, incluindo o que está a executar a sua aplicação Java EE. Pode então usar o comando docker logs para visualizar os logs da aplicação e garantir que foi iniciada corretamente.

Finalmente, pode aceder à aplicação em execução num navegador web, navegando para http://localhost:8080.

Escalando a Aplicação

Um dos principais benefícios de executar uma aplicação Java EE no Docker é a capacidade de escalar facilmente a aplicação. Pode executar várias instâncias do contêiner Docker para lidar com um aumento de tráfego ou carga.

Para escalar a aplicação, pode usar uma plataforma de orquestração de contêineres como o Docker Compose ou o Kubernetes. Estas ferramentas permitem definir o número desejado de instâncias de contêiner e gerir automaticamente a implantação e escalamento da aplicação.

Aqui está um exemplo de um ficheiro Docker Compose que define uma implantação escalável da aplicação Java EE:

version: "3"
services:
  app:
    image: my-java-ee-app
    ports:
      - 8080:8080
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        order: rolling-update

Neste exemplo, a secção deploy especifica que a aplicação deve ser implantada com 3 réplicas e que as atualizações devem ser efetuadas usando uma estratégia de atualização gradual.

Resumo

Seguindo os passos descritos neste tutorial, aprenderá a configurar corretamente o comando de inicialização para uma aplicação Java EE a executar num contêiner Docker. Este conhecimento ajudará a garantir uma implantação e execução suaves da sua aplicação web, aproveitando o poder e a flexibilidade dos contêineres Docker.