12-Configuración de Nginx y MySQL con Docker Compose

 

Configuración de Nginx y MySQL con Docker Compose

Asegúrate de tener Docker y Docker Compose instalados en tu sistema antes de comenzar.


Paso 1: Detener Contenedores Existentes

Primero, asegúrate de que no haya contenedores de tu proyecto corriendo para evitar conflictos de puertos o recursos.

  1. Verifica los contenedores activos:

    docker ps

  1. Si ves algún contenedor corriendo que pertenece a tu proyecto de Docker Compose (por ejemplo, uno que acabas de crear), derríbalo usando docker-compose down. Si no tienes un archivo docker-compose.yml en la carpeta actual, este comando fallará, pero no importa si no hay contenedores corriendo.

    docker-compose down
    

Paso 2: Crear la Estructura de Directorios

Crea un directorio para almacenar la configuración de Docker Compose y el archivo de configuración de Nginx.

mkdir -p docker-compose/nginx
cd docker-compose

Paso 3: Crear el Archivo de Configuración de Nginx

Dentro del directorio que acabamos de crear (docker-compose/nginx), crea el archivo de configuración de Nginx para tu aplicación.

  1. Crea el archivo de configuración:

    nano nginx/app-laravel.conf
    
  2. Copia y pega la siguiente configuración (este es el "boilerplate" estándar para Laravel con Nginx, extraído de la documentación oficial, como mencionaste):

    Nota importante: El root en este archivo (/var/www/html/public) debe coincidir con la ruta donde Laravel monta el directorio public dentro del contenedor. El fastcgi_pass (php-app:9000) asume que tu contenedor PHP-FPM se llama php-app y escucha en el puerto 9000.

    Nginx
    server {
        listen 80;
        server_name localhost;
        root /var/www/html/public;
    
        index index.html index.htm index.php;
    
        charset utf-8;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        location = /favicon.ico { access_log off; log_not_found off; }
        location = /robots.txt  { access_log off; log_not_found off; }
    
        error_page 404 /index.php;
    
        location ~ \.php$ {
            # Debe coincidir con el nombre de tu servicio PHP-FPM en docker-compose
            fastcgi_pass php-app:9000; 
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    
        location ~ /\.(?!well-known).* {
            deny all;
        }
    }
    
  3. Guarda el archivo (Ctrl+O, Enter) y sal del editor (Ctrl+X).

Paso 4: Configurar las Variables de Entorno de Laravel (.env)

Asegúrate de que tu archivo .env en la raíz de tu proyecto Laravel tenga las siguientes variables de configuración de la base de datos:

  1. Abre el archivo .env (si estás en el directorio de tu proyecto Laravel):

    Bash
    nano .env
    
  2. Verifica/modifica las variables para que coincidan con la configuración de Docker Compose.

    Variable de EntornoValor SugeridoNotas
    DB_CONNECTIONmysql
    DB_HOSTdbIMPORTANTE: Debe ser el nombre del servicio de la base de datos en docker-compose.yml, no localhost.
    DB_PORT3306Puerto por defecto de MySQL.
    DB_DATABASElaravel_dbEl nombre de la base de datos que crearemos.
    DB_USERNAMElaravel_userEl usuario que crearemos.
    DB_PASSWORDsecretLa contraseña que usaremos.

    Asegúrate de que tus variables se vean así (o con los valores que elijas):

    Ini, TOML
    DB_HOST=db
    DB_DATABASE=laravel_db
    DB_USERNAME=laravel_user
    DB_PASSWORD=secret
    
  3. Guarda y cierra el archivo.

Paso 5: Crear el Archivo Docker Compose (docker-compose.yml)

Ahora crea el archivo principal que define los servicios (Nginx, PHP-FPM y MySQL).

  1. Crea el archivo en el directorio raíz de Docker Compose (donde creaste la carpeta nginx):

    Bash
    nano docker-compose.yml
    
  2. Introduce la siguiente configuración. Aquí se definen los tres servicios principales: nginx, db (MySQL), y se incluye un servicio php-app para Laravel, que es necesario para que Nginx funcione.

    YAML
    version: '3.7'
    
    services:
    
      # --- SERVICIO NGINX ---
      nginx:
        image: nginx:alpine # Usamos la imagen oficial de Nginx
        restart: unless-stopped
        ports:
          # Exponemos el puerto 8000 del host al puerto 80 del contenedor
          - "8000:80"
        volumes:
          # Monta el código de la aplicación (asume que el .yml está en la raíz de Laravel)
          - ../:/var/www/html 
          # Monta el archivo de configuración de Nginx que creamos
          - ./nginx/app-laravel.conf:/etc/nginx/conf.d/default.conf
        depends_on:
          - php-app # Nginx depende de que el servicio PHP esté corriendo
        networks:
          - laravel-network
    
      # --- SERVICIO PHP-FPM ---
      # (Necesario para procesar los archivos .php de Laravel)
      php-app:
        image: php:7.4-fpm # Ajusta la versión de PHP según sea necesario
        restart: unless-stopped
        volumes:
          # Monta el código de la aplicación
          - ../:/var/www/html 
        networks:
          - laravel-network
    
      # --- SERVICIO DE BASE DE DATOS (MySQL) ---
      db:
        image: mysql:8.0 # Versión de MySQL
        restart: unless-stopped
        environment:
          # Variables de entorno para la configuración de la DB (tomadas de .env)
          MYSQL_DATABASE: ${DB_DATABASE:-laravel_db}
          MYSQL_USER: ${DB_USERNAME:-laravel_user}
          MYSQL_PASSWORD: ${DB_PASSWORD:-secret}
          MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-secret} # Usamos la misma para root
        volumes:
          # Volumen persistente para los datos de la DB
          - db-data:/var/lib/mysql
        networks:
          - laravel-network
    
    # Definición de Redes
    networks:
      laravel-network:
        driver: bridge
    
    # Definición de Volúmenes (para persistencia de datos)
    volumes:
      db-data:
        driver: local
    
  3. Guarda el archivo (Ctrl+O, Enter) y sal del editor (Ctrl+X).

Paso 6: Ejecutar los Contenedores

Una vez que tengas los archivos de configuración en su lugar, puedes iniciar los servicios:

  1. Asegúrate de estar en el directorio donde se encuentra el archivo docker-compose.yml.

  2. Ejecuta el comando para crear y levantar los contenedores en segundo plano (-d):

    Bash
    docker-compose up -d
    

Paso 7: Verificación

  1. Verifica que los tres contenedores (nginx, php-app, db) se estén ejecutando correctamente:

    Bash
    docker ps
    
  2. Si todo ha salido bien, tu aplicación Laravel debería ser accesible en el puerto que expusiste para Nginx. En este tutorial, se configuró para usar el puerto 8000.

    • Abre tu navegador y navega a: http://localhost:8000


Este proceso configura tus servicios, asegura que Nginx sepa cómo manejar los archivos PHP a través del servicio PHP-FPM (php-app), y que todos puedan comunicarse usando la red interna (laravel-network).

Comentarios

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Tutorial de Carpetas y Directorios en Ubuntu Linux

Instalar Docker en Ubuntu Server usando docker.io