{"id":4586,"date":"2025-06-01T14:54:37","date_gmt":"2025-06-01T20:54:37","guid":{"rendered":"https:\/\/linuxitos.com\/main\/?p=4586"},"modified":"2025-06-01T14:54:38","modified_gmt":"2025-06-01T20:54:38","slug":"laravel-en-docker-con-php-8-4-fedora-42","status":"publish","type":"post","link":"https:\/\/linuxitos.com\/main\/laravel-en-docker-con-php-8-4-fedora-42\/","title":{"rendered":"Laravel en Docker con PHP 8.4 | Fedora 42"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/laravel-docker.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"380\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/laravel-docker.png\" alt=\"\" class=\"wp-image-4588\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/laravel-docker.png 800w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/laravel-docker-300x143.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/laravel-docker-768x365.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Contexto<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00f3 en la versi\u00f3n 8.2 y al parecer ya no habr\u00e1 m\u00e1s actualizaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por lo que ahora, busqu\u00e9 la manera de usar docker con la \u00faltima versi\u00f3n de laravel y l a\u00faltima versi\u00f3n de PHP, es decir, laravel 12, y PHP 8.4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En resumen, debido a que los datos en base de datos en mariadb (es el m\u00e1s simple) no son persistentes en docker, la base de datos estar\u00e1 en el host (con fedora 42 en mi caso) el c\u00f3digo tambi\u00e9n estar\u00e1 en el host, y solo se enviar\u00e1 al docker para procesarse y visualizarse en el puerto 81 en el host.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/arquitectura-docker-laravel.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"400\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/arquitectura-docker-laravel.png\" alt=\"\" class=\"wp-image-4589\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/arquitectura-docker-laravel.png 800w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/arquitectura-docker-laravel-300x150.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/arquitectura-docker-laravel-768x384.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Instalar Docker en Fedora 42<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para la instalaci\u00f3n de docker en fedora 42, seguir \u00e9ste tutorial, debido a que es extenso y no lo pondr\u00e9 aqu\u00ed:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/blog.linuxitos.com\/post\/instalar-docker-fedora-42\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.linuxitos.com\/post\/instalar-docker-fedora-42<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Configuraci\u00f3n del proyecto<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Desde la temrinal (o nautilus, como lo prefieran) Ir al directorio donde se ubicar\u00e1 el proyecto y crear una carpeta con el nombre del proyecto, en \u00e9ste ejemplo se usar\u00e1 el nombre de <strong>lavdockerv1<\/strong>: <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para la configuraci\u00f3n se deben usar rutas absolutas, es decir, si el proyecto se crear\u00e1 en la carpeta personal, se deber\u00e1 usar la ruta completa <strong>\/home\/user\/www\/lavdockerv1<\/strong> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En \u00e9ste ejemplo, se tiene en la carpeta personal un directorio llamado www por lo que se pondr\u00e1 el proyecto ah\u00ed:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.- Crear directorio principal:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pueden usar files para crear todo, no es necesario la terminal, sin embargo, si la quieren utilizar, aqu\u00ed los comandos:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">mkdir \/home\/$USER\/www\/lavdockerv1\/<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2.- Crear archivo docker-compose.yml<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Usar su editor favorito para crear el archivo<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">gnome-text-editor www\/lavdockerv1\/docker-compose.yml<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En \u00e9ste archivo a\u00f1adir lo siguiente:<\/p>\n\n\n\n<pre style=\"background: rgb(245, 245, 245); border-radius: 6px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">services:\n  laravel:\n    build:\n      context: .\/docker\n    container_name: laravel12_php84\n    ports:\n      - \"81:80\"  # Puerto externo 81 redirige al puerto 80 del contenedor\n    volumes:\n      - .\/src:\/var\/www\/html  # Laravel real montado aqu\u00ed\n    extra_hosts:\n      - \"host.docker.internal:host-gateway\"  # Acceso al host para la DB externa<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3.- Crear archivo Dockerfile<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crear directorio docker:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">mkdir \/home\/$USER\/www\/lavdockerv1\/docker\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A\u00f1adir el siguiente contenido<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">gnome-text-editor \/home\/$USER\/www\/lavdockerv1\/docker\/Dockerfile<\/pre>\n\n\n\n<pre style=\"background: rgb(245, 245, 245); border-radius: 6px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\"># Usa PHP 8.4 con Apache\nFROM php:8.4-apache\n\n# Instala dependencias necesarias para Laravel y extensiones PHP\nRUN apt-get update && apt-get install -y \\\n    git unzip zip libzip-dev libpng-dev libonig-dev libxml2-dev \\\n    libnsl-dev libaio1 \\\n    && docker-php-ext-install pdo pdo_mysql zip mbstring gd\n\n# Activa mod_rewrite de Apache (para rutas amigables en Laravel)\nRUN a2enmod rewrite\n\n# Copia la configuraci\u00f3n personalizada de Apache\nCOPY apache\/vhost.conf \/etc\/apache2\/sites-available\/000-default.conf\n\n# Establece directorio de trabajo dentro del contenedor\nWORKDIR \/var\/www\/html<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4.- Crear archivo vhost.conf<\/h2>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">mkdir \/home\/$USER\/www\/lavdockerv1\/docker\/apache<\/pre>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">gnome-text-editor \/home\/$USER\/www\/lavdockerv1\/apache\/vhost.conf<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dentro de \u00e9ste archivo colocar:<\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background-color:#e3e3e363\"><code>&lt;VirtualHost *:80>\n    DocumentRoot \/var\/www\/html\/public\n\n    &lt;Directory \/var\/www\/html\/public>\n        AllowOverride All\n        Require all granted\n    &lt;\/Directory>\n\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n&lt;\/VirtualHost><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5. Crear directorio src para Laravel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El proyecto de Laravel, es decir, el c\u00f3digo real debe estar dentro del directorio src, as\u00ed que al crear el proyecto, se deber\u00e1 indicar de la siguiente manera:<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">composer create-project laravel\/laravel \/home\/$USER\/www\/lavdockerv1\/src\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez creado el proyecto, podr\u00eda ser de utilidad a\u00f1adir los archivos index.php y .htacces:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Archivo index.php<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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:<\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background-color:#eaeaea\"><code>&lt;?php\n\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Http\\Request;\n\ndefine('LARAVEL_START', microtime(true));\n\n\/\/ Determine if the application is in maintenance mode...\nif (file_exists($maintenance = __DIR__.'\/storage\/framework\/maintenance.php')) {\n    require $maintenance;\n}\n\n\/\/ Register the Composer autoloader...\nrequire __DIR__.'\/vendor\/autoload.php';\n\n\/\/ Bootstrap Laravel and handle the request...\n\/** @var Application $app *\/\n$app = require_once __DIR__.'\/bootstrap\/app.php';\n\n$app->handleRequest(Request::capture());<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Archivo .htaccess<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Contiene la protecci\u00f3n de archivos, y conversi\u00f3n de la rutas sin usar .php, por ejemplo, <\/p>\n\n\n\n<pre class=\"wp-block-code has-background\" style=\"background-color:#eeeeee\"><code># Disable directory browsing\nOptions All -Indexes\n\n# ----------------------------------------------------------------------\n# Rewrite engine\n# ----------------------------------------------------------------------\n\n# Turning on the rewrite engine is necessary for the following rules and features.\n# FollowSymLinks must be enabled for this to work.\n&lt;IfModule mod_rewrite.c>\n\tOptions +FollowSymlinks\n\tRewriteEngine On\n\n\t# If you installed CodeIgniter in a subfolder, you will need to\n\t# change the following line to match the subfolder you need.\n\t# http:\/\/httpd.apache.org\/docs\/current\/mod\/mod_rewrite.html#rewritebase\n\t# RewriteBase \/\n\n\t# Redirect Trailing Slashes...\n\tRewriteCond %{REQUEST_FILENAME} !-d\n    \tRewriteRule ^(.*)\/$ \/$1 &#91;L,R=301]\n\n\t# Rewrite \"www.example.com -> example.com\"\n\tRewriteCond %{HTTPS} !=on\n\tRewriteCond %{HTTP_HOST} ^www\\.(.+)$ &#91;NC]\n\tRewriteRule ^ http:\/\/%1%{REQUEST_URI} &#91;R=301,L]\n\n\t# Checks to see if the user is attempting to access a valid file,\n    # such as an image or css document, if this isn't true it sends the\n    # request to the front controller, index.php\n\tRewriteCond %{REQUEST_FILENAME} !-f\n\tRewriteCond %{REQUEST_FILENAME} !-d\n\tRewriteRule ^(.*)$ index.php\/$1 &#91;L]\n\n\t# Ensure Authorization header is passed along\n    RewriteCond %{HTTP:Authorization} .\n    RewriteRule .* - &#91;E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]\n&lt;\/IfModule>\n\n&lt;IfModule !mod_rewrite.c>\n    # If we don't have mod_rewrite installed, all 404's\n    # can be sent to index.php, and everything works as normal.\n    ErrorDocument 404 index.php\n&lt;\/IfModule>\n\n# Disable server signature start\n    ServerSignature Off\n# Disable server signature end\n\n&lt;Files .env>\norder allow,deny\nDeny from all\n&lt;\/Files><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">6.- Configurar archivo .env<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En \u00e9ste archivo se deben configurar la url del proyecto, y la configuraci\u00f3n de la base de datos:<\/p>\n\n\n\n<pre style=\"background: rgb(245, 245, 245); border-radius: 6px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">[...]APP_URL=http:\/\/localhost\n[...]\n\n[...]\nDB_HOST= 192.168.x.x #ip del host donde est\u00e9 la bd\nDB_PORT=3306 #puerto\nDB_DATABASE=BDLavDockerv1 #nombre bd\nDB_USERNAME=user\nDB_PASSWORD=password\n[...]<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7.- Iniciar Docker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente se inicia<\/p>\n\n\n\n<pre style=\"background: rgb(54, 63, 72); border-radius: 6px; border: 0px; box-sizing: border-box; color: white; font-family: menlo, monaco, monospace; font-style: inherit; font-weight: inherit; line-height: 15.68px; margin-bottom: 1.1em; max-width: 100%; outline: 0px; overflow: auto; padding: 13.125px 16.4062px; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;\">composer create-project laravel\/laravel \/home\/$USER\/www\/lavdockerv1\/src\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Desde el navegador iniciar: <a href=\"http:\/\/localhost:81\/\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:81\/<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/Screenshot-From-2025-06-01-14-52-49.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"664\" src=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/Screenshot-From-2025-06-01-14-52-49-1024x664.png\" alt=\"\" class=\"wp-image-4593\" srcset=\"https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/Screenshot-From-2025-06-01-14-52-49-1024x664.png 1024w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/Screenshot-From-2025-06-01-14-52-49-300x194.png 300w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/Screenshot-From-2025-06-01-14-52-49-768x498.png 768w, https:\/\/linuxitos.com\/main\/wp-content\/uploads\/2025\/06\/Screenshot-From-2025-06-01-14-52-49.png 1396w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Y eso ser\u00eda todo, ahora se podr\u00e1 usar la versi\u00f3n que sea de PHP con laravel que se desee, ideal para diferentes proyectos. Lamento lo de XAMPP pero s\u00ed era necesario migrar, aunque si regresa lo seguir\u00e9 usando. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u00f3 en la versi\u00f3n 8.2 y [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4588,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[337,1543,7,1541,1890],"tags":[1694,1561,1638,1690,1556,1587],"class_list":["post-4586","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-browser","category-developer","category-fedora","category-web-developer","category-web-development","tag-docker","tag-fedora","tag-laravel","tag-mariadb","tag-php","tag-xampp"],"_links":{"self":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/4586","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/comments?post=4586"}],"version-history":[{"count":5,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/4586\/revisions"}],"predecessor-version":[{"id":4594,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/posts\/4586\/revisions\/4594"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media\/4588"}],"wp:attachment":[{"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/media?parent=4586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/categories?post=4586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linuxitos.com\/main\/wp-json\/wp\/v2\/tags?post=4586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}