Contexto

Debido a que XAMPP fue descontinuado (o eso parece), me fue necesario buscar otros medios de usar PHP sin tener que instalarlo en el sistema. En lo personal XAMPP era perfecto porque encasulaba, incluyendo la base de datos, lo evita que instalaras algo externo, sin embargo, XAMPP se quedó en la versión 8.2 y al parecer ya no habrá más actualizaciones.

Por lo que ahora, busqué la manera de usar docker con la última versión de laravel y l aúltima versión de PHP, es decir, laravel 12, y PHP 8.4.

En resumen, debido a que los datos en base de datos en mariadb (es el más simple) no son persistentes en docker, la base de datos estará en el host (con fedora 42 en mi caso) el código también estará en el host, y solo se enviará al docker para procesarse y visualizarse en el puerto 81 en el host.

Instalar Docker en Fedora 42

Para la instalación de docker en fedora 42, seguir éste tutorial, debido a que es extenso y no lo pondré aquí:

https://blog.linuxitos.com/post/instalar-docker-fedora-42

Configuración del proyecto

Desde la temrinal (o nautilus, como lo prefieran) Ir al directorio donde se ubicará el proyecto y crear una carpeta con el nombre del proyecto, en éste ejemplo se usará el nombre de lavdockerv1:

Para la configuración se deben usar rutas absolutas, es decir, si el proyecto se creará en la carpeta personal, se deberá usar la ruta completa /home/user/www/lavdockerv1

En éste ejemplo, se tiene en la carpeta personal un directorio llamado www por lo que se pondrá el proyecto ahí:

1.- Crear directorio principal:

Pueden usar files para crear todo, no es necesario la terminal, sin embargo, si la quieren utilizar, aquí los comandos:

mkdir /home/$USER/www/lavdockerv1/

2.- Crear archivo docker-compose.yml

Usar su editor favorito para crear el archivo

gnome-text-editor www/lavdockerv1/docker-compose.yml

En éste archivo añadir lo siguiente:

services:
  laravel:
    build:
      context: ./docker
    container_name: laravel12_php84
    ports:
      - "81:80"  # Puerto externo 81 redirige al puerto 80 del contenedor
    volumes:
      - ./src:/var/www/html  # Laravel real montado aquí
    extra_hosts:
      - "host.docker.internal:host-gateway"  # Acceso al host para la DB externa

3.- Crear archivo Dockerfile

Crear directorio docker:

mkdir /home/$USER/www/lavdockerv1/docker/

Añadir el siguiente contenido

gnome-text-editor /home/$USER/www/lavdockerv1/docker/Dockerfile
# Usa PHP 8.4 con Apache
FROM php:8.4-apache

# Instala dependencias necesarias para Laravel y extensiones PHP
RUN apt-get update && apt-get install -y \
    git unzip zip libzip-dev libpng-dev libonig-dev libxml2-dev \
    libnsl-dev libaio1 \
    && docker-php-ext-install pdo pdo_mysql zip mbstring gd

# Activa mod_rewrite de Apache (para rutas amigables en Laravel)
RUN a2enmod rewrite

# Copia la configuración personalizada de Apache
COPY apache/vhost.conf /etc/apache2/sites-available/000-default.conf

# Establece directorio de trabajo dentro del contenedor
WORKDIR /var/www/html

4.- Crear archivo vhost.conf

mkdir /home/$USER/www/lavdockerv1/docker/apache
gnome-text-editor /home/$USER/www/lavdockerv1/apache/vhost.conf

Dentro de éste archivo colocar:

<VirtualHost *:80>
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

5. Crear directorio src para Laravel

El proyecto de Laravel, es decir, el código real debe estar dentro del directorio src, así que al crear el proyecto, se deberá indicar de la siguiente manera:

composer create-project laravel/laravel /home/$USER/www/lavdockerv1/src/

Una vez creado el proyecto, podría ser de utilidad añadir los archivos index.php y .htacces:

Archivo index.php

Para fines en desarrollo y no levantar el proyecto en el contenedor en cada inicio, el index.php, arranca el proyecto directo sin necesidad del artisan serve:

<?php

use Illuminate\Foundation\Application;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// Determine if the application is in maintenance mode...
if (file_exists($maintenance = __DIR__.'/storage/framework/maintenance.php')) {
    require $maintenance;
}

// Register the Composer autoloader...
require __DIR__.'/vendor/autoload.php';

// Bootstrap Laravel and handle the request...
/** @var Application $app */
$app = require_once __DIR__.'/bootstrap/app.php';

$app->handleRequest(Request::capture());

Archivo .htaccess

Contiene la protección de archivos, y conversión de la rutas sin usar .php, por ejemplo,

# Disable directory browsing
Options All -Indexes

# ----------------------------------------------------------------------
# Rewrite engine
# ----------------------------------------------------------------------

# Turning on the rewrite engine is necessary for the following rules and features.
# FollowSymLinks must be enabled for this to work.
<IfModule mod_rewrite.c>
	Options +FollowSymlinks
	RewriteEngine On

	# If you installed CodeIgniter in a subfolder, you will need to
	# change the following line to match the subfolder you need.
	# http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
	# RewriteBase /

	# Redirect Trailing Slashes...
	RewriteCond %{REQUEST_FILENAME} !-d
    	RewriteRule ^(.*)/$ /$1 [L,R=301]

	# Rewrite "www.example.com -> example.com"
	RewriteCond %{HTTPS} !=on
	RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
	RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

	# Checks to see if the user is attempting to access a valid file,
    # such as an image or css document, if this isn't true it sends the
    # request to the front controller, index.php
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule ^(.*)$ index.php/$1 [L]

	# Ensure Authorization header is passed along
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    ErrorDocument 404 index.php
</IfModule>

# Disable server signature start
    ServerSignature Off
# Disable server signature end

<Files .env>
order allow,deny
Deny from all
</Files>

6.- Configurar archivo .env

En éste archivo se deben configurar la url del proyecto, y la configuración de la base de datos:

[...]APP_URL=http://localhost
[...]

[...]
DB_HOST= 192.168.x.x #ip del host donde esté la bd
DB_PORT=3306 #puerto
DB_DATABASE=BDLavDockerv1 #nombre bd
DB_USERNAME=user
DB_PASSWORD=password
[...]

7.- Iniciar Docker

Finalmente se inicia

composer create-project laravel/laravel /home/$USER/www/lavdockerv1/src/

Desde el navegador iniciar: http://localhost:81/

Y eso sería todo, ahora se podrá usar la versión que sea de PHP con laravel que se desee, ideal para diferentes proyectos. Lamento lo de XAMPP pero sí era necesario migrar, aunque si regresa lo seguiré usando.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *