Docker para desarrollar con tomcat

Las ventajas de utilizar docker para desarrollar y desplegar la aplicaciones nunca deja de sorprenderme. Conseguimos con una simple definición en texto crear máquinas con configuraciones exactas a ejecutar en todas partes. Una de las cosas en donde todavía no había aplicado docker es en la aplicaciones web que desarrollo en Java. Habitualmente se requiere de un servidor tomcat (con cierta versión de máquina virtual de java) y una base de datos (yo he trabajado con mysql mayoritariamente) con otra versión particular.

Dado que las versiones de base de datos y de tomcat y de java han sido muy variables con el tiempo y que los proyectos no solo hay que desarrollarlos y entregarlos sino que hay que mantenerlos, nos encontramos con una situación imposible en que cualquier combinación de estos elementos es posible y necesaria para probar cualquier mínimo cambio que queramos realizar (si hay cosas muy compatibles que se pueden hacer con versiones nuevas y muchas otras que no)… El caso es que esta vez voy a deciros cómo podemos olvidarnos de una vez por todas de estos problemas utilizando docker y docker-compose.

Si eres el desgraciado usuario de una versión de windows las cosas pueden ser un poco más complicadas, pero si usas un sistema operativo de verdad la instalación y puesta en marcha de docker es trivial e inmediata (ya lo he tratado antes en el blog). Voy a dar por hecho que ya tienes un proyecto Java a ejecutar con tomcat (si es con maven o gradle que te generen el .war automáticamente, mejor) y que ya tienes docker instalado en tu equipo (y docker-compose). Lo que sigue es lo que tienes que hacer para probar tu war en un tomcat con una versión determinada que use una base de datos de una versión determinada:

Crea un directorio docker al mismo nivel que tienes el pom.xml si usas maven y dentro de ese directorio crea el archivo docker-compose.yml

version: "3"
services:

  tomcat:
    container_name: miproyecto-tomcat
    image: tomcat:8-jdk8
    ports:
      - 8080:8080
    volumes:
      - ../target/miproyecto.war:/usr/local/tomcat/webapps/miproyecto.war
      - ../target/miproyecto:/usr/local/tomcat/webapps/miproyecto
    links:
      - "mysql:db"

  mysql:
    container_name: miproyecto-mysql
    image: mysql:8.0
    environment:
       MYSQL_ROOT_PASSWORD: "mipassword"
    volumes:
      - ../mysql:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: unless-stopped

En el directorio del pom.xml ejecuta lo siguiente:

mvn package

Esto te genera el war dentro de target y ya estarás en disposición de entrar dentro del directorio docker y ejecutar:

docker-compose up -d

Quiá la primera vez podrías querer ejecutarlo sin la opción -d para ver todo el log que sale (también es cierto que la primera vez se descarga todos los contenedores y tardará un poco). A partir de que haya arrancado podemos acceder a la aplicación en:

http://localhost:8080/miproyecto

También se puede acceder a la base de datos directamente:

mysql -h 127.0.0.1 -u root -p

Y yasta… En próximas entradas veremos como depurar con docker también.