He traspasado todas mis aplicaciones que tenía en heroku a un vps propio y además he aprovechado para dockerizarlas todas, incluyendo bases de datos y otros servicios web. Concretamente he dockerizado:
Instalación de docker en el VPS
Docker
En primer lugar he tenido que instalar docker y docker compose. Para la instalación de docker en ubuntu 22.04 server :
Actualizamos la lista de paquetes del S.O. y actualizamos el S.O.
Añadimos una serie de paquetes de requisitos previos.
Se agrega la clave GPG para el repositorio oficial de Docker a nuestro S.O.
Y por último ya podremos añadir el repositorio a nuestro S.O. Podemos comprobar que se ha añadido una línea en /etc/apt/source.list.
Actualizamos la base de datos ya que hay una línea nueva (compruebe en el listado que sale) y comprobaremos antes de instalar que vamos a instalar desde el repositorio (y no desde Ubuntu Server).
Por último, podremos instalar el paquete (paquete pesado de aproximadamente 400 MBytes). Como no puede ser de otra manera hay que asegurar que Docker engine está arrancado y si reinicia el servicio en el arranque del S.O. anfitrión.
Manualillo de systemctl
Resolución del problema de permisos de docker para un usuario no root
Docker-Compose
Actualización de la lista de repositorios
Instalación de docker-compose
Comprobamos el estado del servidor docker y las versiones respectivamente
Creación de los contenedores y docker-compose
En primer lugar me he creado una carpeta docker en el home, que irá alojando los scripts y ficheros necesarios. Tiene la siguiente estructura:
Vamos a utilizar para el certificado de autenticación del servidor https Let’s encrypt.
Instalación y generación del certificado Let’s encrypt
Para la instalación de la aplicación certbot de Let’s encrypt para generar los certificados, recomiendo seguir las instrucciones de la siguiente página https://certbot.eff.org/instructions?ws=other&os=ubuntufocal está preseleccionado para Ubuntu server.
La página indicada anteriormente, es la única que funciona actualmente con Ubuntu Server 22.04, el resto de tutoriales que he visitado se encuentran obsoletos al haber cambiado a snap la aplicación de certbot de Let’s encrypt y el repositorio de github ya no funciona tampoco como se esperaba en instrucciones antiguas.
Una vez terminado nos generará la siguiente salida:
Generamos el certificado que es válido para tomcat .p12.
Recuerda cambiar las rutas por las tuyas
Contenedor para Spring Boot
Copiamos los ficheros necesarios en nuestra carpeta de nuestro nuestra carpeta en el home de /docker/docker-java/: estando en la raíz de esta el fichero .jar y .p12.
Generación de los scripts de docker
En primer lugar, vamos a crear un Dockerfile para que contenga la imagen (para Ubuntu server) y realice la copia de los ficheros necesarios (el .jar y el certificado) hacia nuestro contenedor.
Dockerfile
Tendremos que cambiar el nombre del certificado y del fichero del proyecto compilado .jar
En segundo lugar, vamos a crear el script de docker-compose.yml que creará nuestro servicio web y expondrá el puerto 8443 por defecto.
docker-compose.yml
Tendremos que cambiar el nombre del servicio y del contenedor
Proyecto Spring Boot
Vamos a añadir al fichero aplication.properties la configuración para que el servidor tomcat que crea Spring, escuche por el puerto https, que por defecto es el 8443 en lugar del 443. Y el certificado que hemos creado previamente para que nuestro servidor funcione con Let’s encrypt.
aplication.properties
Tendremos que cambiar: el certificado, la contraseña y el alias con el que creamos anteriormente.
Generamos el fichero .jar mediante el comando de mvn para compilar
Para ver la diferencia entre mvn package y mvn install, consulta este enlace
Ahora en la carpeta /target del proyecto tendremos el fichero .jar que pasaremos por ftp a nuestra carpeta en el home de /docker/docker-java/nombre_aplicacion que contendrá a su vez los ficheros de Dockerfile y docker-compose.yml, junto a nuestro certificado .p12. Para que todo se pueda copiar en el contenedor de docker, según las instrucciones de nuesto Dockerfile.
Finalmente, debemos tener la siguiente estructura de ficheros en la carpeta de docker:
En la página oficial del Spring Boot hay también un tutorial que indica con mayor detalle lo realizado anteriormente https://spring.io/guides/topicals/spring-boot-docker/ incluyendo aspectos de seguridad como la creación de un usuario diferente a root dentro del contenedor de docker.
Contenedor para Laravel
Para Laravel vamos a utilizar un servidor ngnix con la última versión por seguridad. para ello crearemos varios ficheros que describiré a continuación:
Generación de los scripts de docker
Dockerfile
docker-compose.yml
nginx.conf
Sustituye mi dominio mi_dominio por el tuyo
Finalmente, debemos tener la siguiente estructura de ficheros en la carpeta de docker:
Y en la carpeta src vamos a copiar todo el contenido de Laravel.
Levantamos el contenedor de docker como demonio y con la compilación activada
Con esto ya tenemos una versión de Laravel Dockerizada y funcionando.
Contenedor para Flask
Tenemos nuestra aplicación python con flask en la carpeta app y los certificados en la carpeta certs y el fichero de requirements al mismo nivel que los de docker.
Generación de los scripts de docker
Dockerfile
nginx.conf
app.py
Sustituye mi dominio mi_dominio_web por el tuyo
Contenedor para Nginx
Copiamos los ficheros necesarios en nuestra carpeta de nuestro nuestra carpeta en el home de /docker/docker-ngnix/: estando en la raíz de esta el fichero docker-compose.yml y nginx.conf, las carpetas: cers, site-content y templates.
Generación de los scripts de docker
docker-compose.yml
Generación del script de configuración de ngnix
nginx.conf
Sustituye mi dominio mi_dominio_web por el tuyo
Generación del resto de ficheros y carpetas
En la carpeta certs tienes que tener una copia de los ficheros generados por certbot, son los ficheros: fullchain.pem y privkey.pem.
En la carpeta site-content el index.html de tu web con todo su contenido. Este es un ejemplo de redirección de mi página, por si te sirve de ejemplo.
site-content/index.html
Contenedor para PostgreSQL
La dockerización de PostgreSQL es una de las más sencillas que hay, solamente tenemos que crear un docker-compose y levantar el contenedor.
Generación del scripts de docker
docker-compose.yml
En la carpeta ./db que se creará automáticamente tendremos todos los ficheros de la base de datos para poder consultar y/o modificar lo que necesitemos desde fuera del contenedor.
Contenedor para mySQL
La dockerización de MySQL es una de las más sencillas que hay, solamente tenemos que crear un docker-compose y levantar el contenedor.
Generación del scripts de docker
docker-compose.yml
En la carpeta ./db que se creará automáticamente tendremos todos los ficheros de la base de datos para poder consultar y/o modificar lo que necesitemos desde fuera del contenedor.
Contenedor para MongoDB
La dockerización de MongoDB es una de las más sencillas que hay, solamente tenemos que crear un docker-compose y levantar el contenedor.
Generación del scripts de docker
docker-compose.yml
En la carpeta ./db que se creará automáticamente tendremos todos los ficheros de la base de datos para poder consultar y/o modificar lo que necesitemos desde fuera del contenedor.
Fuentes:
https://certbot.eff.org/instructions
https://wstutorial.com/rest/spring-boot-with-lets-encrypt.html