14-Prueba y Verificación del Entorno Docker con Laravel

 

Prueba y Verificación del Entorno Docker con Laravel

Introducción

En este tutorial verificaremos que todos los servicios configurados (PHP, Nginx y MySQL) funcionan correctamente juntos, probaremos la conexión a la base de datos y ejecutaremos migraciones de Laravel.


Paso 1: Levantar los Contenedores

1.1 Comando actualizado (Docker Compose V2)

bash
# Limpiar la pantalla
clear

# Levantar servicios en segundo plano
docker compose up -d

1.2 Verificar contenedores activos

bash
docker compose ps

Salida esperada:

text
NAME               IMAGE               COMMAND                  SERVICE   CREATED         STATUS         PORTS
laravel_app        laravel-app         "docker-php-entrypoi…"   app       2 minutes ago   Up 2 minutes   9000/tcp
laravel_nginx      nginx:alpine        "/docker-entrypoint.…"   nginx     2 minutes ago   Up 2 minutes   0.0.0.0:8000->80/tcp
laravel_db         mysql:8.0           "docker-entrypoint.s…"   db        2 minutes ago   Up 2 minutes   0.0.0.0:3306->3306/tcp

Paso 2: Acceder a la Aplicación

2.1 Desde el navegador

Abrir en el navegador:

text
http://localhost:8000

O usando la IP local:

text
http://192.168.1.200:8000

Resultado esperado: La página de inicio de Laravel se muestra correctamente.

2.2 Verificar el estado de la aplicación

bash
# Verificar que la aplicación responde
curl -I http://localhost:8000

Paso 3: Acceder al Contenedor de MySQL

3.1 Identificar el contenedor de base de datos

bash
docker compose ps | grep db

3.2 Entrar al contenedor de MySQL

bash
# Método moderno con docker compose
docker compose exec db bash

Nota: Si usas Docker Compose V2, el comando es docker compose exec (sin guión).

3.3 Conectar a MySQL desde el contenedor

bash
# Dentro del contenedor
mysql -u laravel -psecret

Alternativa con usuario root:

bash
mysql -u root -prootsecret

3.4 Verificar bases de datos

sql
SHOW DATABASES;

Salida esperada:

text
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

Paso 4: Ejecutar Migraciones de Laravel

4.1 Desde el host (recomendado)

bash
# Ejecutar migraciones directamente
docker compose exec app php artisan migrate

Salida esperada:

text
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (xx.xxms)
Migrating: 2014_10_12_100000_create_password_reset_tokens_table
Migrated: 2014_10_12_100000_create_password_reset_tokens_table (xx.xxms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (xx.xxms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated: 2019_12_14_000001_create_personal_access_tokens_table (xx.xxms)

4.2 Para Laravel 11+ (actualización 2025-2026)

bash
# Verificar migraciones específicas de Laravel 11+
docker compose exec app php artisan migrate --pretend

Paso 5: Verificar las Migraciones en MySQL

5.1 Entrar al contenedor de MySQL

bash
docker compose exec db mysql -u root -prootsecret

5.2 Seleccionar la base de datos y listar tablas

sql
USE laravel;
SHOW TABLES;

Salida esperada:

text
+---------------------+
| Tables_in_laravel   |
+---------------------+
| cache               |
| cache_locks         |
| failed_jobs         |
| jobs                |
| migrations          |
| password_reset_tokens|
| personal_access_tokens|
| sessions            |
| users               |
+---------------------+

5.3 Verificar estructura de una tabla

sql
DESCRIBE users;

Salida esperada:

text
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| id                | bigint unsigned  | NO   | PRI | NULL    | auto_increment |
| name              | varchar(255)     | NO   |     | NULL    |                |
| email             | varchar(255)     | NO   | UNI | NULL    |                |
| email_verified_at | timestamp        | YES  |     | NULL    |                |
| password          | varchar(255)     | NO   |     | NULL    |                |
| remember_token    | varchar(100)     | YES  |     | NULL    |                |
| created_at        | timestamp        | YES  |     | NULL    |                |
| updated_at        | timestamp        | YES  |     | NULL    |                |
+-------------------+------------------+------+-----+---------+----------------+

Paso 6: Resolución de Problemas Comunes

⚠️ Error: "Unknown database 'laravel'"

Causa: La base de datos no se creó correctamente.

Solución:

bash
# Verificar variables de entorno en el contenedor
docker compose exec db env | grep MYSQL

# Crear base de datos manualmente
docker compose exec db mysql -u root -prootsecret -e "CREATE DATABASE IF NOT EXISTS laravel;"

⚠️ Error: "Access denied for user 'laravel'@'%'"

Causa: Credenciales incorrectas.

Solución:

bash
# Verificar credenciales en .env
cat .env | grep DB_

# Crear usuario manualmente
docker compose exec db mysql -u root -prootsecret -e "
  CREATE USER IF NOT EXISTS 'laravel'@'%' IDENTIFIED BY 'secret';
  GRANT ALL PRIVILEGES ON laravel.* TO 'laravel'@'%';
  FLUSH PRIVILEGES;
"

⚠️ Error: "Could not find driver"

Causa: Extensión PDO MySQL no instalada.

Solución:

bash
# Verificar extensiones PHP instaladas
docker compose exec app php -m | grep pdo

Paso 7: Comandos Útiles para Pruebas

7.1 Ver logs en tiempo real

bash
# Logs de todos los servicios
docker compose logs -f

# Logs de un servicio específico
docker compose logs app -f
docker compose logs nginx -f
docker compose logs db -f

7.2 Ejecutar comandos en el contenedor de la app

bash
# Ver variables de entorno
docker compose exec app env

# Ver versión de PHP
docker compose exec app php -v

# Ver extensiones instaladas
docker compose exec app php -m

# Ejecutar comando de Artisan
docker compose exec app php artisan route:list
docker compose exec app php artisan optimize

7.3 Ver estadísticas de Docker

bash
# Ver uso de recursos
docker stats

# Ver información del sistema
docker system info

# Ver uso de espacio en disco
docker system df

Paso 8: Actualizaciones y Mejoras (2024-2026)

✅ Docker Compose V2

Todos los comandos usan la sintaxis sin guión:

bash
# ❌ Obsoleto
docker-compose up -d
docker-compose exec app bash

# ✅ Actual
docker compose up -d
docker compose exec app bash

✅ Nuevo comando: docker compose logs

bash
# Ver logs con timestamps
docker compose logs --timestamps

# Ver últimos N líneas
docker compose logs --tail=50

✅ Health Checks en servicios

Agregar al docker-compose.yml para verificar automáticamente:

yaml
  db:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  app:
    healthcheck:
      test: ["CMD", "php", "-r", "exit(0);"]
      interval: 30s
      timeout: 10s
      retries: 3

✅ Comando de prueba de conexión

bash
# Verificar conexión a la base de datos desde la app
docker compose exec app php artisan db:show

# Verificar conexión con comando específico
docker compose exec app php -r "
  try {
    new PDO('mysql:host=db;dbname=laravel', 'laravel', 'secret');
    echo 'Conexión exitosa\n';
  } catch (PDOException \$e) {
    echo 'Error: ' . \$e->getMessage() . '\n';
  }
"

Paso 9: Guardar Configuración como Plantilla

9.1 Crear un repositorio de plantilla

Para no repetir el proceso de configuración:

bash
# Inicializar repositorio
git init
git add .
git commit -m "Configuración base Docker + Laravel"

# Crear repositorio en GitHub y subir
git remote add origin https://github.com/tu-usuario/laravel-docker-template.git
git push -u origin main

9.2 Estructura de plantilla recomendada

text
laravel-docker-template/
├── .env.example          # Variables de entorno de ejemplo
├── Dockerfile
├── docker-compose.yml
├── docker/
│   └── nginx/
│       └── app.conf
├── .gitignore
└── README.md

9.3 Script de inicio rápido

Crear setup.sh:

bash
#!/bin/bash
# setup.sh - Script de inicialización

# Copiar .env.example a .env
cp .env.example .env

# Levantar contenedores
docker compose up -d

# Instalar dependencias
docker compose exec app composer install

# Generar key
docker compose exec app php artisan key:generate

# Ejecutar migraciones
docker compose exec app php artisan migrate

echo "✅ Entorno listo! Accede a http://localhost:8000"

Comentarios

Entradas más populares de este blog

12. Hola Mundo en Docker.

11¿Qué es Docker? y ¿Por qué debo saberlo?

14. Publish and Detached modes