Hace unos días, un colega me comento sobre un hosting como alternativa a DigitalOcean, el hosting se llama Clouding.io y como justo tenia ganas de escribir un artículo sobre cómo Dockerizar fácilmente un proyecto de Laravel, me pareció el momento justo para ambas cosas.
Pero en este artículo no vamos a crear una VPS utilizando LaraDock como vimos en este post de LaraDock, ya que a veces es una alternativa un poquito pesada y veremos una mejor 😃.
Así que acompáñenme a ver este bonito artículo!
Comenzando con Clouding.io
Primero debemos ingresar a la web oficial de Clouding, www.clouding.io y ya nos encontramos con una pagina bonita e intuitiva.
No me voy a detener en la registración porque es realmente fácil. Solamente debemos ingresar nuestro usuario (que es una cuenta de correo) y una contraseña. Después, sólo hemos de validar una cuenta de correo, un número de teléfono y una tarjeta con 3D Secure. Y listo! ya tendremos acceso a nuestro panel de cliente. Y listo, ya tenemos nuestro usuario! 😉
Así que, una vez que iniciemos sesión nos encontraremos con el dashboard donde podremos crear todos los servicios que queramos.
Vamos a hacer click en el botón naranja para crear nuestra primer VPS.
Y la siguiente pagina vemos todas las opciones que nos ofrece Clouding para crear una VPS a nuestro gusto. Cabe aclarar que luego podemos escalar las características del servidor.
Creando una VPS con Docker
Al igual que Digital Ocean, Clouding.io nos ofrece la posibilidad de crear nuestra VPS con distintos sistemas operativos, ya sean Windows o Linux, pero también podemos crear una VPS con distintas APPs ya instaladas y configuradas para facilitarnos las cosas. Esto nos va a servir para nuestro propósito de Dockerizar nuestro proyecto Laravel.
- Primero debemos ponerle un nombre a nuestro server.
- Luego vamos a hacer click en la pestaña APP.
- Elegimos Docker.
- Y por ultimo, elegimos la versión Ubuntu 18.04, que será el sistema operativo anfitrión del servidor.
Eligiendo las características para nuestro servidor
El segundo paso es elegir las características que tendrá nuestro servidor que, obviamente dependerá del proyecto que estés desarrollando. Pero en nuestro caso, para instalar Laravel con Docker, las siguientes características nos alcanzarán tranquilamente para que funcione todo!
Estableciendo el Backup de nuestro servidor
El segundo paso es elegir si queremos que Clouding.io nos genere automáticamente backups de nuestro servidor, esto la verdad que es muy bueno porque nos olvidamos de tener que instalar un sistema que realice esto por nosotros. En este caso Clouding lo hace por nosotros 🤘.
Una vez que activamos el «check» de Backup, se nos habilita la frecuencia y el numero de backups que se hará por día. En mi configuración puse que todos los días genere dos backups nuevos.
Últimos paso, poner nuestras claves SSH
Y así de fácil llegamos al último paso donde podemos activar nuestra red privada con los distintos servidores que hayamos creado. En este caso no es posible porque es nuestro primer server.
También podemos configurar nuestras claves SSH para ingresar a la VPS sin la necesidad de ingresar usuario y contraseña en el login.
Por último hacemos click en Enviar.
Clouding.io comenzará a crear nuestro servidor y nos brindara una IP para que podamos acceder a nuestra VPS.
Instalando Laravel con Docker en Clouding.io
Una vez que hayamos recibido el email de Clouding.io (llega bastante rápido) informándonos que nuestro servidor está listo para utilizarse, eso vamos a hacer!
Abrimos una terminal, si estas en iOS o Linux, o Putty si estas en Windows. Y nos conectamos por SSH a la IP de nuestro servidor de Clouding.
Una vez que ingresamos, ejecutamos los siguientes comandos para instalar las últimas actualizaciones:
$ sudo apt-get update && apt-get upgrade
Y también vamos a instalar Docker Compose:
$ apt install docker-compose -y
Clonando nuestro proyecto Laravel
Ya tenemos todo listo para subir nuestro proyecto, así que, debes clonar tu proyecto al server, si es que lo tienes subido a Github. O si quieres empezar un proyecto nuevo, te recomiendo que clones el repo de Github de Laravel directamente ya que no tenemos composer porque nuestra VPS está muy livianito (no tiene ni PHP, ni Apache, ni MySQL, ni nada de nada. Solamente git, Docker y alguna que otra cosita más).
Dockerizando nuestro proyecto Laravel
Ahora que tenemos nuestro proyecto Laravel en el servidor, vamos a crear un par de archivos que generarán el ambiente de ejecución.
Creando el archivo docker-compose.
Primero debemos entrar a la carpeta de nuestro proyecto y, en la raíz del mismo, vamos a crear un archivo llamado docker-compose.yml con el siguiente contenido:
En la primer linea del archivo tenemos version: 3
que hace referencia a la versión de docker-compose que vamos a utilizar. Luego empezamos a definir los servicios que necesitamos para cualquier aplicación de Laravel.
Expliquemos cada servicio
Con la palabra clave services
definimos 4 servicios: app, mysql, nginx y redis.
- app: es un servicio creado por nosotros. El nombre de la imagen de este servicio será «laravel-app», también es un nombre creado por nuestra cuenta. Y esta imagen se construirá con un Dockerfile que se encontrará en la ruta .cloud/docker (ya veremos que es el Dockerfile y donde ponerlo). Ponemos también la clave
depends_on
con los valores mysql y redis, esto le dice a docker-compose que antes de construir el servicio app, construya primero los servicios mysql y redis. - mysql: el siguiente servicio que definimos es para la base de datos. En este caso le decimos a docker-compose que construya el servicio con una imagen pre-creada llamada mysql:8 (el 8 hace referencia a la versión de mysql que se va a instalar). Hay miles de imágenes de docker ya creadas por usuarios y las puedes encontrar aquí. Con la clave
environment
definimos el usuario y password root que tendrá la base de datos. - nginx: luego definimos el servicio nginx, también haciendo uso de una imagen de DockerHub.
- redis: y lo mismo para redis. Definimos un servicio redis con una imagen alojada en DockerHub.
Creando nuestra imagen Docker
Primero vamos a crear algunas carpetas donde pondremos archivos importantes:
$ mkdir .cloud/docker $ mkdir .cloud/nginx $ cd .cloud/docker
Ahora que estamos dentro de .cloud/docker
, vamos a generar nuestra imagen Docker creando a un archivo llamado Dockerfile con el siguiente contenido:
Bueno en este archivo hay varias cosas, pero lo principal es que con FROM php:7.4-fpm estamos diciendo que nuestra imagen se creará a partir de la imagen oficial de PHP, versión 7.4-fpm, que está alojada en DockerHub.
Luego instalamos las distintas librerías y extensiones en el sistema operativa que se encontrará dentro de nuestro container. También instalamos Composer y hacemos un par de cositas más que no tienen mucha importancia, pero si quieren saber más, siempre pueden buscar en la documentación de Docker.
Creando una configuración de nginx
Ahora crearemos la configuración de nginx necesaria para que quede todo listo. Así que, nos movemos a la ruta .cloud/nginx
y creamos el archivo nginx.conf con el siguiente contenido:
Es una configuración normal de nginx pero lo más importante a resaltar es que en el parámetro fastcgi_pass
pusimos el nombre de nuestro servicio de docker-compose, ojo ahí 😉!
Configurando el archivo .env
Otro punto importante que tenemos que tener en cuenta cuando dockerizamos una app Laravel, es que en el archivo .env del proyecto, en la variable DB_HOST
debemos establecerla con el nombre del servicio de mysql. En nuestro caso, al servicio también le pusimos mysql de nombre, así que la variable del archivo .env quedaría: DB_HOST=mysql
.
¡Y eso es todo, ya podemos arrancar nuestro Laravel 🤘!
Arrancando nuestra aplicación Laravel Dockerizada
Para correr nuestra aplicación debemos pararnos en la raíz de nuestro proyecto y ejecutar el comando:
$ docker-compose up -d
Ahora, si ingresas al navegador con la IP de nuestro servidor, veremos nuestra aplicación funcionando.
Comandos importantes a tener en cuenta
Como nuestra aplicación está corriendo en un contenedor de Docker, todo lo que sean comandos artisan o comandos de compilación de assets, debemos ejecutar los comandos de la siguiente forma:
Por ejemplo, para ejecutar el install de composer hacemos:
$ docker-compose run --rm --no-deps app composer install
Para ejecutar un comando artisan, por ejemplo hacemos:
docker-compose run --rm --no-deps app php artisan storage:link
Y, para ejecutar node con yarn, hacemos:
$ docker run --rm -it -v $(pwd):/app -w /app node yarn dev
Sobre el servicio de Clouding.io
Punto a favor de Clouding.io es que fue realmente muy fácil crear un servidor con las características que quería, según mi proyecto.
Otro punto a favor fue que envíe un email al soporte de Clouding para ver qué tan rápido respondían y su respuesta tardó en llegar un poco menos de 2 horas. Con respecto a otros servicios que he probado, fue bastante rápido. Acá la evidencia:
Otro punto a favor es que, tanto el soporte como la web de Clouding están en español y eso me pareció muy bueno para compartir con ustedes que somos todos habla hispana.
El punto negativo, es que el valor es un poco elevado con respecto con otros servicios de hosting pero creo que no es significante para el servicio que brindan.
Espero que les haya gustado esta forma de dockerizar sus aplicaciones Laravel, que hayan aprendido cómo crear imágenes de docker y cómo utilizar docker-compose. Los animo a probar Clouding.io que me esta funcionando muy lindo y me cuenten como les fue. Nos vemos en la próxima.
Excelente artículo mi estimado, así como lo tienes con Docker compose lo hice para DO y me funciona de maravilla.
Vaya promo coone
Tengo un problema al ejecutar el comando para composer:
/application/vendor does not exist and could not be created.
A alguien más le ocurrió? como lo solucionó?
detalle con el comando, falta el sudo en el segundo comando de la linea.
sudo apt-get update && sudo apt-get upgrade
Muchas gracias por la corrección Joaquín.
Tengo una pregunta, cómo hago para poder manejar dominios virtusles en local