Instala rápidamente un ambiente de desarrollo local para trabajar con PHP y MySQL utilizando Docker.
Utilizar Docker es sencillo, pero existen tantas imágenes, versiones y formas para crear los contenedores que hacen tediosa esta tarea. Este proyecto ofrece una instalación rápida, con versiones estandar y con la mínima cantidad de modificaciones a las imágenes de Docker. Viene configurado con PHP 8.2 y MySQL 8.0, además se incluyen las extensiones gd, zip y mysql.
Copia el archivo de ejemplo y personaliza las credenciales:
cp .env.example .envPuedes utilizar la configuración por defecto, pero puedes cambiar las opciones directamente. La configuración se ubica en el archivo .env con las siguientes opciones:
| Opción | Valor por defecto | Descripción |
|---|---|---|
PROJECT_NAME |
php-mysql-dev |
Nombre del proyecto (afecta nombres de contenedores y redes) |
PHP_VERSION |
8.2 |
Versión de PHP (Versiones disponibles de PHP) |
PHP_PORT |
80 |
Puerto para servidor web |
MYSQL_VERSION |
8.0 |
Versión de MySQL (Versiones disponibles de MySQL) |
MYSQL_USER |
developer |
Nombre de usuario para conectarse a MySQL |
MYSQL_PASSWORD |
developer_password |
Contraseña de acceso del usuario para conectarse a MySQL. |
MYSQL_ROOT_PASSWORD |
root_password |
Contraseña de acceso del usuario root de MySQL. |
MYSQL_DATABASE |
app_database |
Nombre de la base de datos que se crea por defecto. |
MYSQL_PORT |
3306 |
Puerto para acceder a MySQL externamente. |
La instalación se hace en línea de comandos:
docker-compose up -dPuedes verificar la instalación accediendo a: http://localhost/info.php
Una vez instalado, se pueden utilizar los siguiente comandos:
docker-compose start # Iniciar el ambiente de desarrollo
docker-compose stop # Detener el ambiente de desarrollo
docker-compose down # Detener y eliminar el ambiente de desarrollo./docker/contiene los archivos de configuración de Docker./www/carpeta para los archivos PHP del proyecto./www/.htaccessreglas de reescritura de URLs para Apache.
Existen dos dominios para conectarse a base de datos.
mysql: para conexión desde los archivos PHP.localhost: para conexiones externas al contenedor.
Las credenciales de ejemplo en .env.example son:
| Usuario | Clave | Base de datos |
|---|---|---|
| developer | developer_password | app_database |
Nota: Los valores de root son root_password para el usuario root y 3306 para el puerto MySQL.
Usando PDO:
<?php
$host = 'mysql'; // Nombre del servicio en docker-compose
$db = getenv('MYSQL_DATABASE') ?: 'app_database';
$user = getenv('MYSQL_USER') ?: 'developer';
$pass = getenv('MYSQL_PASSWORD') ?: 'developer_password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Conexión exitosa!";
} catch (PDOException $e) {
die("Error de conexión: " . $e->getMessage());
}Si necesitas instalar extensiones PHP adicionales, edita el archivo docker/php/Dockerfile. Algunos ejemplos:
Instalar extensión mbstring:
RUN docker-php-ext-install mbstringInstalar extensión intl:
RUN apt-get update && apt-get install -y libicu-dev \
&& docker-php-ext-install intlInstalar extensión imagick:
RUN apt-get update && apt-get install -y libmagickwand-dev \
&& pecl install imagick \
&& docker-php-ext-enable imagickDespués de modificar el Dockerfile, reconstruye la imagen:
docker-compose build --no-cache php
docker-compose up -dProblema: Error [ERROR] [MY-010735] Can't open the mysql.plugin table
Solución: Elimina el volumen de MySQL y vuelve a crear:
docker-compose down
docker volume rm php-mysql-dev-data
docker-compose up -dProblema: SQLSTATE[HY000] [2002] Connection refused
Solución: Asegúrate de usar el nombre del servicio mysql como host en lugar de localhost:
$host = 'mysql'; // Correcto
$host = 'localhost'; // Incorrecto desde PHPProblema: Bind for 0.0.0.0:80 failed: port is already allocated
Solución: Cambia el puerto en el archivo .env:
PHP_PORT=8080
MYSQL_PORT=3307
Luego reinicia:
docker-compose down
docker-compose up -dProblema: Los cambios no aparecen al recargar el navegador.
Solución: Verifica que el volumen esté montado correctamente y limpia la caché de Apache:
docker-compose restart phpSi persiste, reconstruye la imagen:
docker-compose build --no-cache php
docker-compose up -d