Docker Laravel · 10 min read · Nov 25, 2025

Dockerizando Laravel con Nginx MySQL y Docker Compose en Ubuntu 18.04 LTS

Laravel es un marco de trabajo PHP gratuito y de código abierto que implementa el patrón de diseño MVC (Modelo-Vista-Controlador). Está diseñado para ser fácil de usar y permite a los desarrolladores crear aplicaciones tanto simples como complejas en poco tiempo. Laravel fue creado por Taylor Otwell en 2011, como un intento de proporcionar una alternativa avanzada al marco de trabajo CodeIgniter (CI). En 2011, Laravel lanzó la versión 1 y la versión 2, y la última versión 5.6 viene con más y mejores características como soporte de línea de comandos (CLI) llamado ‘artisan’, soporte para diferentes sistemas de bases de datos, mejoras en las rutas, etc.

En esta guía, vamos a mostrarte cómo dockerizar el proyecto Laravel con PHP-FPM, base de datos MySQL y el servidor web Nginx utilizando Docker Compose en el servidor Ubuntu 18.04. Vamos a crear una nueva imagen de docker para el proyecto Laravel, y luego crear el script docker-compose.yml que contiene algunos servicios incluyendo, la App/Laravel en sí, el servidor web Nginx y la base de datos MySQL.

Requisitos previos

  • Ubuntu 18.04
  • Privilegios de root

Lo que haremos:

  1. Instalar Docker y Docker Compose
  2. Descargar Laravel e instalar dependencias
  3. Dockerizando el proyecto Laravel - Definir el servicio de la App Laravel
  • Definir el servicio HTTP de Nginx
  • Definir el servicio de base de datos MySQL
  • Crear un host virtual de Nginx para Laravel
  • Crear Dockerfile para la App Laravel
  1. Construir el proyecto Laravel
  2. Post-Instalación de Laravel

Paso 1 - Instalar Docker y Docker Compose

Primero, vamos a instalar los paquetes Docker y Docker Compose en el sistema Ubuntu. Y estaremos utilizando los paquetes de Docker del repositorio oficial de Ubuntu.

Antes de continuar, necesitamos actualizar los repositorios en el sistema Ubuntu. Simplemente ejecutando el siguiente comando.

sudo apt update

Ahora instala los paquetes Docker y Docker Compose usando el comando apt a continuación.

sudo apt install docker.io -y  
sudo apt install docker-compose -y

Los paquetes Docker y Docker Compose deberían estar ahora instalados en el sistema, verifícalo usando los siguientes comandos.

docker version  
docker-compose version

Como resultado, obtendrás la versión de Docker y Docker Compose en el sistema.

Verificar versión de docker

A continuación, necesitamos asignar al usuario no root al grupo docker para poder ejecutar el contenedor Docker para usuarios no root.

Para este caso, vamos a agregar al usuario llamado ‘hakase’ al grupo docker ejecutando el siguiente comando.

usermod -a -G docker hakase

Y después de eso, inicia sesión en el shell del usuario ‘hakase’ y ejecuta el comando ‘hello-world’ de docker.

su - hakase  
docker run hello-world

Ahora se te mostrará el mensaje ‘Hello World’ de Docker, y la instalación de Docker se ha completado.

Agregar usuario docker

Paso 2 - Descargar Laravel e instalar dependencias

En este paso, vamos a descargar el marco web Laravel en el directorio home de ‘hakase’ y luego instalar las dependencias de Laravel usando la imagen de docker ‘composer’ de PHP. Así que asegúrate de que estás conectado al servidor como un usuario no root.

Descarga el proyecto Laravel en el directorio ‘myapp’ y entra en él.

git clone https://github.com/laravel/laravel.git myapp/  
cd myapp/

Ahora ejecuta el siguiente comando de docker para instalar las dependencias de Laravel.

docker run --rm -v $(pwd):/app composer install

Con el comando anterior, vamos a ejecutar un nuevo contenedor de docker temporal y montar el directorio del proyecto ‘myapp’ en el directorio ‘/app’ en el contenedor. El contenedor se basa en la imagen de docker ‘composer’, y estamos instalando las dependencias de Laravel usando el comando ‘composer’ dentro de ese contenedor temporal.

Obtener el marco Laravel

Una vez que la instalación de las dependencias de Laravel haya terminado, debemos cambiar el propietario del directorio ‘myapp’ a nuestro propio usuario usando el comando sudo a continuación.

sudo chown -R $USER:$USER ~/myapp

Cambiar propietario del directorio de la app

Paso 3 - Dockerizando el proyecto Laravel

Después de descargar Laravel e instalar sus dependencias, vamos a crear un nuevo script docker-compose.yml y crear un nuevo Dockerfile para el proyecto Laravel.

cd myapp/  
vim docker-compose.yml

- Definir el servicio de la App Laravel

Primero, vamos a definir el proyecto Laravel en sí y construir la imagen de docker para el proyecto Laravel usando el Dockerfile.

Pega el script de docker compose en él.

version: '3'  
services:  
  
  #App Laravel  
  app:  
    build:  
      context: .  
      dockerfile: Dockerfile  
    image: hakase-labs/laravel  
    container_name: app  
    restart: unless-stopped  
    tty: true  
    environment:  
      SERVICE_NAME: app  
      SERVICE_TAGS: dev  
    working_dir: /var/www/html  
    volumes:  
      - ./:/var/www/html  
    networks:  
      - mynet

Detalles del servicio del contenedor Laravel:

  • El servicio del contenedor Laravel se llamará ‘app’. Se basa en nuestra imagen de docker personalizada que se creará con nuestro ‘Dockerfile’, y la nueva imagen se llamará ‘hakase-labs/laravel’.
  • Queremos montar el directorio del proyecto ‘myapp’ en el directorio ‘/var/www/html’ dentro del servicio del contenedor.
  • Estamos utilizando la red de docker personalizada para nuestra configuración, la red se llamará ‘mynet’.

- Definir el servicio HTTP de Nginx

Ahora definiremos el servicio del contenedor nginx.

Pega la siguiente configuración después de la línea del servicio del contenedor ‘app’.

  #Servicio Nginx  
  nginx:  
    image: nginx:alpine  
    container_name: nginx  
    restart: unless-stopped  
    tty: true  
    ports:  
      - "80:80"  
      - "443:443"  
    volumes:  
      - ./:/var/www/html  
      - ./nginx/conf.d/:/etc/nginx/conf.d/  
      - ./nginx/ssl/:/etc/nginx/ssl/  
    networks:  
      - mynet

Detalles de configuración del servicio del contenedor nginx:

  • Queremos crear un nuevo contenedor llamado ‘nginx’ basado en la imagen de docker ‘nginx:alpine’.
  • El servicio del contenedor abrirá los puertos HTTP y HTTPS.
  • El contenedor montará tres volúmenes diferentes. El directorio del proyecto ‘myapp’ al directorio ‘/var/www/html’, la configuración del host virtual de nginx ‘nginx/conf.d/‘ al directorio ‘/etc/nginx/conf.d’, y montará los archivos de certificado ‘nginx/ssl/‘ al directorio ‘/etc/nginx/ssl’ en el contenedor.
  • El servicio del contenedor utilizará la misma red llamada ‘mynet’.

- Definir el servicio de base de datos MySQL

Y por último, definimos el servicio de base de datos MySQL.

Pega la siguiente configuración después de la línea del servicio del contenedor ‘nginx’.

  #Servicio MySQL  
  db:  
    image: mysql:5.7  
    container_name: db  
    restart: unless-stopped  
    tty: true  
    ports:  
      - "3306:3306"  
    environment:  
      MYSQL_DATABASE: laraveldb  
      MYSQL_USER: laravel  
      MYSQL_PASSWORD: laravelpassworddb  
      MYSQL_ROOT_PASSWORD: rootpasswordmysql  
    volumes:  
      - mysqldata:/var/lib/mysql/  
    networks:  
      - mynet  
  
#Redes de Docker  
networks:  
  mynet:  
    driver: bridge  
#Volúmenes  
volumes:  
  mysqldata:  
    driver: local

Guarda y cierra la configuración.

Detalles del servicio del contenedor MySQL:

  • El servicio del contenedor MySQL se llamará ‘db’, basado en la imagen de docker ‘mysql:5.7’.
  • El servicio ‘db’ abrirá el puerto MySQL predeterminado ‘3306’.
  • El proyecto Laravel utilizará la base de datos, el usuario y la contraseña basados en la variable de entorno del servicio ‘db’.
  • El servicio MySQL ‘db’ montará el volumen llamado ‘mysqldata’, y tendrá la misma red ‘mynet’.
  • Y definimos la red personalizada ‘mynet’ con el controlador ‘bridge’, y el volumen ‘mysqldata’ utilizará el controlador ‘local’.

A continuación se muestra la configuración completa de ‘docker-compose.yml’:

version: '3'
services:

  #App Laravel
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: hakase-labs/laravel
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www/html
    volumes:
      - ./:/var/www/html
    networks:
      - mynet

  #Servicio Nginx
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www/html
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

  #Servicio MySQL
  db:
    image: mysql:5.7
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laraveldb
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravelpassworddb
      MYSQL_ROOT_PASSWORD: rootpasswordmysql
    volumes:
      - mysqldata:/var/lib/mysql/
    networks:
      - mynet

#Redes de Docker
networks:
  mynet:
    driver: bridge
#Volúmenes
volumes:
  mysqldata:
    driver: local

- Crear un host virtual de Nginx para Laravel

Dentro del directorio del proyecto ‘myapp’, crea un nuevo directorio llamado ‘nginx’ que contendrá otros dos directorios ‘conf.d’ y ‘ssl’. Luego crea una nueva configuración de host virtual de nginx ‘laravel.conf’ dentro del directorio ‘conf.d’.

Ejecuta el siguiente comando.

mkdir -p nginx/{conf.d,ssl}  
vim nginx/conf.d/laravel.conf
server {
    listen 80;
    server_name laravel.hakase-labs.io;

    return 301 https://laravel.hakase-labs.io$request_uri;
}


server {
    listen 443 ssl http2;
    server_name laravel.hakase-labs.io;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # Archivos de registro para depuración
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # Directorio raíz web de Laravel
    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }

    # Nginx pasa solicitudes a PHP-FPM
    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;
    }
}

Guarda y cierra.

Después de eso, copia tu archivo de certificado ssl al directorio ‘nginx/ssl/‘.

sudo cp /path/to/ssl/fullchain.pem nginx/ssl/  
sudo cp /path/to/ssl/privkey.pem nginx/ssl/

- Crear Dockerfile para la App Laravel

A continuación, crea un nuevo Dockerfile para el proyecto Laravel.

Ejecuta el siguiente comando.

vim Dockerfile

Pega la configuración a continuación.

# Establecer imagen maestra
FROM php:7.2-fpm-alpine

# Copiar composer.lock y composer.json
COPY composer.lock composer.json /var/www/html/

# Establecer directorio de trabajo
WORKDIR /var/www/html

# Instalar dependencias adicionales
RUN apk update && apk add --no-cache \
    build-base shadow vim curl \
    php7 \
    php7-fpm \
    php7-common \
    php7-pdo \
    php7-pdo_mysql \
    php7-mysqli \
    php7-mcrypt \
    php7-mbstring \
    php7-xml \
    php7-openssl \
    php7-json \
    php7-phar \
    php7-zip \
    php7-gd \
    php7-dom \
    php7-session \
    php7-zlib

# Agregar y habilitar extensiones PHP-PDO
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-enable pdo_mysql

# Instalar PHP Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Eliminar caché
RUN rm -rf /var/cache/apk/*

# Agregar UID '1000' a www-data
RUN usermod -u 1000 www-data

# Copiar permisos del directorio de aplicación existente
COPY --chown=www-data:www-data . /var/www/html

# Cambiar usuario actual a www
USER www-data

# Exponer puerto 9000 y comenzar el servidor php-fpm
EXPOSE 9000
CMD ["php-fpm"]

Guarda y cierra la configuración.

Y estamos listos para construir el proyecto Laravel ‘myapp’ y ejecutar los servicios de contenedor que hemos definido.

Paso 4 - Construir Laravel con Nginx y servicios MySQL

Construye la imagen de docker personalizada para nuestro proyecto Laravel usando el siguiente comando.

docker-compose build

Construir Laravel con Nginx y servicios MySQL

Luego ejecuta nuevamente el siguiente comando.

docker-compose up -d

Descargará todas las imágenes de docker que necesitamos y luego construirá los servicios de contenedor basados en la configuración de ‘docker-compose.yml’.

Descargar imágenes de docker

Cuando haya terminado, verifica usando el comando docker-compose a continuación.

docker-compose ps

Y como resultado, obtendrás que los tres servicios de contenedor están en funcionamiento. La ‘app’ que se ejecuta en el puerto predeterminado ‘9000’ PHP-FPM, el servicio ‘nginx’ está en los puertos HTTP y HTTPS, y el servicio MySQL ‘db’ en el puerto MySQL predeterminado ‘3306’.

Después de eso, verifica nuevamente todas las imágenes de docker disponibles y los puertos abiertos en el sistema.

docker-compose images  
netstat -plntu

Obtendrás la imagen de docker personalizada ‘hakase-labs/laravel’ en la lista, y los puertos HTTP y HTTPS están en estado ‘LISTEN’.

Verificar configuración de docker con netstat

Paso 5 - Post-Instalación de Laravel

Hasta esta etapa, el proyecto Laravel está en funcionamiento como un contenedor Docker. Y ahora vamos a crear un nuevo archivo ‘.env’, generar la clave y migrar los datos de Laravel usando la línea de comandos de Laravel ‘artisan’.

Copia el ejemplo del archivo ‘.env’ y edítalo dentro del contenedor.

cp .env.example .env  
docker-compose exec app vim .env

Cambia la configuración de la base de datos como a continuación.

DB_CONNECTION=mysql  
DB_HOST=db  
DB_PORT=3306  
DB_DATABASE=laraveldb  
DB_USERNAME=laravel  
DB_PASSWORD=laravelpassworddb

Guarda y cierra.

A continuación, genera la clave de la aplicación Laravel y limpia la configuración de caché.

docker-compose exec app php artisan key:generate  
docker-compose exec app php artisan config:cache

Después de eso, migra la base de datos usando el siguiente comando.

docker-compose exec app php artisan migrate

Asegúrate de que no haya errores.

Post instalación de Laravel

Ahora abre tu navegador web y escribe el nombre de dominio de tu proyecto.

http://laravel.hakase-labs.io/

Y serás redirigido a la conexión segura HTTPS y se mostrará la página de inicio predeterminada de Laravel como a continuación.

Laravel con Docker instalado exitosamente

Finalmente, la dockerización del proyecto Laravel con el servidor web Nginx y la base de datos MySQL se ha completado exitosamente.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.