Tutorial básico para construir y ejecutar una aplicación web Java sobre Tomcat utilizando Podman.
El repositorio contiene una pequeña aplicación WAR preparada para utilizarse como ejemplo en prácticas de contenedores.
.
├── Containerfile
├── sample.war
└── README.md
La aplicación muestra información básica del entorno donde está ejecutándose:
- Hostname del contenedor.
- Versión de Java.
- Versión de Tomcat.
- Hora del servidor.
También incluye un endpoint sencillo de health check.
- Linux
- Podman
- Git
- Acceso a Internet
Verificar la instalación:
podman versiongit clone https://github.com/emverdes/podman-tomcat-tutorial.git
cd podman-tomcat-tutorialLa imagen se construye a partir de CentOS Stream e instala Java y Tomcat.
FROM quay.io/centos/centos:stream9
LABEL maintainer="emverdes@gmail.com"
RUN dnf install -y java-11-openjdk tomcat iproute && \
dnf clean all
ADD sample.war /var/lib/tomcat/webapps/
EXPOSE 8080
CMD ["/usr/libexec/tomcat/server", "start"]podman build -t tomcat-demo:1.0 .Verificar:
podman imagespodman run -d \
--name tomcat1 \
-p 8008:8080 \
tomcat-demo:1.0Comprobar el contenedor:
podman psConsultar los logs:
podman logs tomcat1Acceder a la aplicación:
http://localhost:8008/sample/
Health check:
curl http://localhost:8008/sample/health.jspResultado esperado:
OK
La misma imagen puede utilizarse para crear varios contenedores:
podman run -d \
--name tomcat2 \
-p 8009:8080 \
tomcat-demo:1.0Probar ambas instancias:
curl http://localhost:8008/sample/
curl http://localhost:8009/sample/Cada contenedor tendrá un hostname diferente.
Add to a VirtualHost in your apache web server configuration. Replace localhost with the hostname of the host running your containers. Remember to open up the ports in your firewall if needed.
ProxyPass "/sample" "http://localhost:8008/sample"
ProxyPassReverse "/sample" "http://localhost:8008/sample"
<Proxy "balancer://mycluster">
BalancerMember "http://localhost:8008/sample"
BalancerMember "http://localhost:8009/sample"
</Proxy>
ProxyPass "/" "balancer://mycluster/"
ProxyPassReverse "/" "balancer://mycluster/"
- #setsebool -P httpd_can_network_connect on
- #setsebool -P httpd_can_network_relay on
Listar contenedores:
podman ps
podman ps -aDetener y arrancar un contenedor:
podman stop tomcat1
podman start tomcat1Ejecutar un comando dentro del contenedor:
podman exec tomcat1 hostnameAbrir un shell:
podman exec -it tomcat1 /bin/bashEliminar un contenedor:
podman rm -f tomcat1Para publicar la imagen se necesita una cuenta en Docker Hub y un repositorio público, por ejemplo:
tomcat-demo
Autenticarse desde Podman:
podman login docker.ioIngresar el usuario y la contraseña o token correspondiente.
Las imágenes publicadas en Docker Hub utilizan el formato:
docker.io/USUARIO/REPOSITORIO:TAG
Etiquetar la imagen local:
podman tag \
tomcat-demo:1.0 \
docker.io/USUARIO_DOCKER/tomcat-demo:1.0Verificar:
podman imagespodman push docker.io/USUARIO_DOCKER/tomcat-demo:1.0Comprobar desde Docker Hub que el repositorio contiene el tag:
1.0
Eliminar primero los contenedores que estén utilizando la imagen:
podman rm -f tomcat1 tomcat2Eliminar las referencias locales:
podman rmi tomcat-demo:1.0
podman rmi docker.io/USUARIO_DOCKER/tomcat-demo:1.0Verificar:
podman imagesEjecutar nuevamente utilizando directamente la imagen publicada:
podman run -d \
--name tomcat-public \
-p 8008:8080 \
docker.io/USUARIO_DOCKER/tomcat-demo:1.0Si la imagen no existe localmente, Podman la descargará del registry antes de crear el contenedor.
Verificar:
curl http://localhost:8008/sample/Un servidor Apache externo puede publicar la aplicación ejecutada dentro del contenedor.
Ejemplo:
ProxyPass "/sample/" "http://localhost:8008/sample/"
ProxyPassReverse "/sample/" "http://localhost:8008/sample/"En sistemas con SELinux puede ser necesario permitir que Apache realice conexiones hacia el backend:
sudo setsebool -P httpd_can_network_connect onCliente
|
| HTTP
v
Host Linux
|
| TCP/8008
v
+-----------------------+
| Container |
| |
| Tomcat :8080 |
| | |
| +-- sample.war |
+-----------------------+
Este ejemplo permite practicar:
- Imágenes y contenedores.
- Containerfiles.
- Construcción de imágenes.
- Mapeo de puertos.
- Logs.
- Ejecución de comandos dentro de contenedores.
- Múltiples instancias de una misma imagen.
- Tags.
- Container registries.
- Push y pull de imágenes.
- Integración entre contenedores y servicios tradicionales.