A aplicação desenvolvida é um de crud javaweb com tomcat e o postgres.
Usamos como domínio apenas uma entidade pessoa.
É uma simples aplicação para o uso didático,sendo assim não foram abordados
conceitos de segurança e validação de dados por exemplo.
Focamos apenas em criar um container para aplicação java e um container para o
banco de dados da aplicação junto ao docker.
Concebido para resolução de atividade da disciplina de POS
Curso Análise e Desenvolvimento de Sistemas
IFPB Campus Cajazerias
Professor da disciplina Ricardo Job
Antes de tudo obtenha o Docker
- Java instalado
- Maven instalado
- Docker instalado
- IDE de sua preferência
Mas como estamos usando o Docker para a implantação pode usar apenas um Editor de texto como o Sublime ou Notepad++ ...
Se você gosta mais do estilo de deixar a IDE ajudar você a completar o código pode
usar o Netbeans ou o Eclipse.
Dentro do seu projeto crie uma diretório com o nome postgres
, e dentro crie um
arquivo nomeado Dockerfile
, juntamente com mais dois arquivos create.sql e insert.sql,falaremos deles
e do seu conteúdo logo mais.
O arquivo Dockerfile teve ter o seguinte conteúdo:
FROM postgres
ENV POSTGRES_USER postgres
ENV POSTGRES_PASSWORD 12345
ENV POSTGRES_DB pos-cliente
COPY create.sql /docker-entrypoint-initdb.d/
COPY insert.sql /docker-entrypoint-initdb.d/
Como percebemos no arquivo acima, estamos configurando o postgres
indicando o user ,o password e o nome do banco que será criado para receber os dados
da aplicação.
Nas últimas duas linhas estamos informando ao docker, que após ele criar o banco de dados
ele deve ler o conteúdo dos dois arquivos create.sql
que vai criar a tabela e insert.sql
que vai inserir no nossso banco pos-cliente.
Sensacional não?
CREATE TABLE pessoa(
id serial,
nome character varying(80) NOT NULL,
cpf character varying(14) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO pessoa(nome, cpf) VALUES ('Kiko','123.132.121-31');
INSERT INTO pessoa(nome, cpf) VALUES ('Chaves','123.132.121-31');
INSERT INTO pessoa(nome, cpf) VALUES ('Chiquinha', '123.132.121-31');
INSERT INTO pessoa(nome, cpf) VALUES ('Madruga', '123.132.121-31');
INSERT INTO pessoa(nome, cpf) VALUES ('Florinda', '123.132.121-31');
docker build -t elefante/banco ./postgres
-t
: qual a tag que vamos atribuir a essa imagem
./postgres
: caminho para o arquivo Dockerfile do postgres que está dentro da pasta postgres
*elefante/banco
: nome da imagem que atribuimos
Depois que você executar o comando acima , caso você não tenha a imagem
do postgres, o docker vai providenciar para você automaticamente, claro
isso acontece porque descrevemos assim no Dockerfile.
docker image ls
ou
docker images
docker run -p 5433:5432 -d --name banco elefante/banco
-p
: o bind entre a porta do host local com a porta do container
-d
: o container será executado em background não obstruindo o terminal
--name
: o nome do container
banco
: nome da container
Acima nós configuramos a porta do postgres para 5433 , que nesse caso foi a porta
que eu configurei na minha aplicação java, a porta apos :
é a porta do container que nós criamos.
FROM tomcat
COPY target/Aplicacao.war ${CATALINA_HOME}/webapps
FROM
: diz qual a imagem que precisamos
COPY
: diz o caminho de onde copiar os arquivos .war para a implantação
${CATALINA_HOME}/webapps
: lugar onde vamos armazenar os gloriosos arquivos
Este arquivo Dockerfile
, deve obrigatoriamente estar dentro do diretório raiz do seu projeto.
Vale ressaltar que o nome Aplicacao
foi o finalName que eu demos para a aplicação
dentro do pom.xml.
É por esse nome que vamos chamar o sistema no browser.
<build>
<finalName>Aplicacao</finalName>
</build>
E claro dentro da pasta WEB-INF
temos que ter uma outro diretório chamado lib
que deve conter as bibliotecas jstl.jar
e standart.jar
, caso contrario teremos
problemas ao carreagar o nosso sistema no browser.
docker build -t imagem-da-aplicacao-java .
-t
: qual a tag que vamos atribuir a essa imagem
.
: caminho relativo (ou absoluto) para o arquivo Dockerfile
Depois que você executar o comando acima , caso você não tenha a imagem
do tomcat, o docker vai providenciar para você automaticamente, óbvio,
isso acontece porque descrevemos essa ação no Dockerfile do projeto em questão.
FROM tomcat
COPY target/Aplicacao.war ${CATALINA_HOME}/webapps
docker image ls
ou
docker images
docker run -p 8080:8080 -d --name app --link banco:host-banco imagem-da-aplicacao-java
-p
: o bind entre a porta do host local com a porta do container
-d
: o container será executado em background* não obstruindo o terminal
--name
: o nome do container
--link
: para o docker vincular o banco do conteiner ao host-banco que referenciado no nosso projeto java no arquivo DbUtil.java
Agora vá até o browser a abra o seu projeto: http://localhost:8080/Aplicacao
Acima nós configuramos a porta do tomcat para 8082 lembra?
No meu caso como ainda estou usando o Docker Toolbox no windows abro a aplicação em http://192.168.99.100:8080/Aplicacao.war/
Para agilizar o processo de desenvolvimento vamos criar dois arquivos .sh:
run.sh
O arquivo run.sh deve conter o seguinte conteúdo:
docker build -t elefante/banco ./postgres
docker run -p 5433:5432 -d --name banco elefante/banco
mvn clean package
docker build -t imagem-da-aplicacao-java .
docker run -p 8080:8080 -d --name app --link banco:host-banco imagem-da-aplicacao-java
nonrun.sh
docker stop app
docker kill app
docker rm app
docker rmi -f imagem-da-aplicacao-java
docker stop banco
docker kill banco
docker rm banco
docker rmi -f elefante/banco
Assim uma vez que você já tenha as imagens e os containers criados,
não é mais necessário digitar todas as vezes os comandos de criar a imagem do banco de dados,
criar o container desse banco, e depois criar a imagem da aplicação web, criar o
o container apos cada atualização de seu projeto.
Simplesmente abra digite no docker:
sh run.sh
Vai fazer tudo de uma só vez :
- O docker vai criar a imagem do banco
- O dockar vai criar o container desse banco e iniciar o mesmo
- O maven vai criar o arquivo .war do projeto
- Vai criar a imagem da aplicação
- Por último criar e iniciar o container da aplicação
sh nonrun.sh
Vai fazer tudo de uma só vez :
-
O docker vai parar o container da Aplicacao
-
O docker vai matar o container
-
Remover o container da aplicação
-
Vai remover a imagem da aplicação do Docker
-
O docker vai parar o container do banco elefante
-
O docker vai matar o container
-
Remover o container do banco
-
Remover a imagem do banco
-
O maven vai limpar o projeto
docker container ls
docker ps -a
docker stop <container_id | container_name>
- Java - Lingugem de programação
- Postgres - Banco de dados
- Maven - Gerenciador de dependencias
- Tomcat - Servidor Web usado para a implantação do projeto
- Docker - Gerenciador de containers onde podemos usar o container do Tomcat...
- NetBeans - Usado para escrever o codigo fonte do projeto
Nós usamos o Git .
- Wellington Lins
- Ao professor Ricardo Job
- Aos colegas do ifpb