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.



