Laravel es un marco PHP gratuito, de código abierto y más popular que le permite desarrollar aplicaciones web escalables y flexibles fácilmente. Es un marco PHP simple, flexible y liviano, y tiene una sintaxis legible para desarrollar aplicaciones modernas y potentes desde cero.
Laravel es la mejor opción si estás buscando diseñar una aplicación de próxima generación.
En este tutorial, mostrará cómo acoplar una aplicación web utilizando el marco Laravel y NGINX como servidor web en el servidor Ubuntu 22.04.
Prerrequisitos
- Un servidor corriendo con Ubuntu 22.04 con un mínimo de 2 GB de RAM y 10 GB de disco.
- Una contraseña de root configurada en tu servidor Cloud.
Empezamos
Antes de empezar, te recomendamos que actualices los paquetes a la última versión. Puedes hacerlo ejecutando el siguiente comando:
# apt-get update && apt-get upgrade -y
Después, tendrás que instalar algunos paquetes requeridos en tu sistema. Puedes instalarlos todos ejecutando el siguiente comando:
# apt-get install apt-transport-https ca-certificates curl software-properties-common -y
Una vez que todos los paquetes estén instalados, puedes proceder al siguiente paso.
Instala Docker y Docker Compose
A continuación, tendrás que instalar Docker y Docker Compose en tu servidor. Por defecto, la última versión de Docker no está disponible en el repositorio por defecto de Ubuntu 22.04, por lo que tendrás que añadir el repositorio para este fin.
Primero, descarga y añade la llave GPG utilizando el siguiente comando:
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Después, añade el repositorio Docker con el siguiente comando:
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list
Una vez que esté añadido el repositorio, actualiza tu sistema e instala Docker y Docker Compose ejecutando el siguiente comando:
# apt-get update && apt install docker-ce docker-compose -y
Una vez que la instalación se haya completado, puedes comprobar el estado del servicio de Docker con el siguiente comando:
# systemctl status docker --no-pager
Descarga Laravel e Instala Dependencias
A continuación, tendrás que descargar el framework de Laravel e instalar las dependencias requeridas con la imagen de Docker PHP composer.
Primero, descarga la última versión de Laravel con el siguiente comando:
# git clone https://github.com/laravel/laravel.git laravel
A continuación, instala las dependencias requeridas con el siguiente comando:
# cd laravel && docker run --rm -v $(pwd):/app composer install
Deberías ver el siguiente resultado al terminar la instalación:
@php artisan package:discover --ansi
INFO Discovering packages.
laravel/sail .......................................................... DONE
laravel/tinker ........................................................ DONE
nesbot/carbon ......................................................... DONE
nunomaduro/collision .................................................. DONE
nunomaduro/termwind ................................................... DONE
spatie/laravel-ignition ............................................... DONE
85 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
@php artisan vendor:publish --tag=laravel-assets --ansi --force
INFO No publishable resources for tag [laravel-assets].
El comando más arriba creará un contenedor temporal y copiará los contenidos de tu directorio ~/laravel en el contenedor.
Dockerizando Laravel
A continuación, necesitarás crear un nuevo archivo docker-compose.yml y un archivo Docker para tu proyecto Laravel.
Primero, crea un archivo docker-compose dentro de tu directorio ~/laravel:
# nano ~/laravel/docker-compose.yml
Añade las siguientes líneas:
version: '3'
services:
# PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: php:8.2-fpm-bookworm
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
# NGINX Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
# MySQL Service
db:
image: mysql:latest
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: oSFrJiZ1y67nbA41L0pdzOtA5R
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- dbdata:/var/lib/mysql/
- ./mysql/my.cnf:/etc/mysql/my.cnf
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
#Volumes
volumes:
dbdata:
driver: local
Guarda y cierra el archivo cuando hayas terminado. Después, crea un archivo Docker para crear y personalizar imágenes con todo el software requerido por tu aplicación dentro del directorio ~/laravel:
# nano ~/laravel/Dockerfile
Añade las siguientes líneas:
FROM php:8.2-fpm-bookworm
# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/
# Set working directory
WORKDIR /var/www
RUN apt-get update && apt-get install -y \
build-essential \
wget \
lsb-release \
gnupg \
curl
# Add repo MySQL
RUN curl -s https://dev.mysql.com/downloads/repo/apt/ | grep mysql-apt-config \
| grep href | awk -F '=' '{gsub(/&p/, "", $4); print "https://dev.mysql.com/get/"$4}' \
| xargs wget -O mysql-apt-config.deb \
&& dpkg -i mysql-apt-config.deb && apt update
# Install dependencies
RUN apt-get update && apt-get install -y \
mariadb-client \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
nano
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
# Install extensions
RUN install-php-extensions gd pdo_mysql mysqli mbstring zip exif pcntl
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Add user for laravel application
RUN groupadd -g 1000 nginx
RUN useradd -u 101 -ms /bin/bash -g nginx nginx
# Copy existing application directory contents
# COPY . /var/www
# Copy existing application directory permissions
# COPY --chown=www:www . /var/www
# Change current user to www
USER nginx
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Guarda y cierra el archivo cuando hayas terminado.
Configura PHP, MySQL y NGINX para Laravel
A continuación, necesitarás crear un directorio PHP dentro de tu directorio ~/laravel y crear el local.ini dentro del directorio ~/laravel/php:
# mkdir ~/laravel/php ; nano ~/laravel/php/local.ini
Añade las siguientes líneas:
upload_max_filesize=40M
post_max_size=40M
Guarda y cierra el archivo cuando hayas terminado. Luego necesitarás crear el directorio nginx/conf.d dentro de tu directorio ~/laravel y crear un archivo app.conf para la configuración de Nginx:
# mkdir -p ~/laravel/nginx/conf.d ; nano ~/laravel/nginx/conf.d/app.conf
Añade las siguientes líneas:
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
Guarda y cierra el archivo cuando hayas terminado. Posteriormente, crea el directorio MySQL dentro de tu directorio ~/laravel y crea el archivo my.cnf con los ajustes requeridos:
# mkdir ~/laravel/mysql ; nano ~/laravel/mysql/my.cnf
Añade las siguientes líneas:
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log
Despliega Laravel con Nginx y MySQL Services
A este punto hemos definido todos los servicios en el archivo docker-compose y creado un archivo de configuración para cada servicio. Después, crea una copia del archivo por defecto .env.example con el siguiente comando:
# cp .env.example .env
Ahora ejecuta el siguiente comando para descargar todas las imágenes requeridas y construir servicios de contenedor basados en la configuración 'docker-compose.yml' con el siguiente comando:
# docker-compose up -d
Una vez que el proceso esté completo, puedes comprobar los contenedores activos con el siguiente comando:
# docker ps
Deberías ver el siguiente resultado:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07ac3fc0fbfa nginx:alpine "/docker-entrypoint.…" 2 minutes ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp webserver
a50984eff65e php:8.2-fpm-bookworm "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp app
7857e21e6d26 mysql:latest "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp db
Configura el Contenedor de Laravel
Después, necesitarás modificar el archivo .env con la app contenedor para Laravel.
Puedes editar fácilmente cualquier archivo dentro del contenedor con el comando "docker-compose exec". Primero, abre el archivo .env dentro de la app contenedor con el siguiente comando:
# docker-compose exec app nano .env
Cambia las siguientes líneas:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=oSFrJiZ1y67nbA41L0pdzOtA5R
Guarda y cierra el archivo. Ahora genera la llave de aplicación de Laravel y limpia la cache con el siguiente comando:
# docker-compose exec app php artisan key:generate && docker-compose exec app php artisan config:cache
Después, migra la base de datos utilizando el siguiente comando:
# docker-compose exec app php artisan migrate
Accede a la Interfaz Web de Laravel
A este punto, has dockerizado Laravel con NGINX y MySQL. Ahora, abre tu navegador web y escribe la URL http://TU-servidor-ip. Serás redirigido al panel de control de Laravel por defecto:
¡Felicidades! Has Dockerizado una aplicación web utilizando el framework de Laravel y NGINX como servidor web en un servidor Cloud con Ubuntu 22.04.
Recuerda, si tienes consultas sobre esta u otra cuestión relacionada con tus servidores en Clouding, no dudes en escribir a soporte@clouding.io ¡Estamos a tu lado para lo que necesites, consúltanos!