2.1 Configuración del entorno de trabajo con Docker
Requisitos previos:
-
Instalar Docker Desktop:
- Windows/Mac: Descargar Docker Desktop
- Linux: Sigue las instrucciones de instalación para tu distribución desde Docker Docs.
-
Instalar VSCode:
- Descargar VSCode
- Recomendamos instalar la extensión Remote - Containers de VSCode para trabajar directamente en los contenedores.
-
Instalar docker mySQL:
En este punto tenemos tres opciones:
- Opción 1: Instalar el contenedor de MySQL desde cero. Puedes seguir las instrucciones de la documentación oficial de Docker para crear un contenedor MySQL, y llamarle docker_mysql.
- Opción 2: Utilizar un contenedor MySQL ya existente. En este caso, asumimos que ya tienes un contenedor MySQL en funcionamiento con las siguientes características:
- Opcion 3: Añadir a nuestro
docker-compose.ymlel contenedor de MySQL. En este caso, añadiremos un contenedor MySQL al archivodocker-compose.ymlque vamos a crear a continuación.
En función de la opción elegida, tendrás que adaptar la conexión a la base de datos en el código PHP que vamos a crear. En el caso de contar ya con un contenedor MySQL en funcionamiento, o acceso a un servicio mysql ya existente, el temario presupone que estas son las credenciales de acceso:
- Nombre del contenedor:
docker_mysql(Si utilizas un contenedor MySQL) - IP:
localhost(ohost.docker.internalsi estás en Windows o Mac) - Usuario:
alumno - Contraseña:
alumno - Base de datos:
test
Paso 1: Preparación del proyecto
-
Crea una carpeta para tu proyecto:
- Abre una terminal (CMD, PowerShell, Terminal de VSCode, etc.).
- Crea una nueva carpeta para tu proyecto y navega dentro de ella.
mkdir mi-proyecto-php cd mi-proyecto-php -
Crea la estructura de carpetas:
Dentro de la carpeta
mi-proyecto-php, crea las siguientes carpetas y archivos:mkdir nginx php php/conf.d mysql mysql/data mysql/tmp src touch docker-compose.yml nginx/default.conf touch php/Dockerfile php/condf.d/99-xdebug.ini touch src/index.php
Paso 2: Configuración de docker-compose.yml
-
Abre el archivo
docker-compose.ymlen tu editor de texto favorito (puede ser VSCode). -
Pega el siguiente contenido en el archivo
docker-compose.yml:
Requisitos
Nota: En nuestro caso vamos a añadir un contenedor MySQL al archivo docker-compose.yml. Si ya tienes un contenedor MySQL en funcionamiento, puedes omitir esta sección y utilizar las credenciales de acceso que ya tienes. Las credeniciales de acceso que vamos a utilizar son las siguientes:
- Nombre del contenedor:
dk_mysql - IP:
localhost - Usuario:
alumno - Contraseña:
alumno - Base de datos:
test
El usuario alumno tiene permisos para acceder por la red a la base de datos test.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | |
En el archivo docker-compose.yml:
php:- Utiliza la imagen
php:8.4-fpm. - Monta el directorio
srcen/var/www/htmldentro del contenedor. - Monta el archivo de configuración
99-xdebug.inipara habilitar Xdebug (opcional). - Define las variables de entorno para la conexión a MySQL y Mongodb.
- Utiliza la imagen
nginx:- Utiliza la imagen
nginx:latest. - Mapea el puerto
8080del host al puerto80del contenedor. - Monta el directorio
srcy el archivo de configuraciónnginx/default.confen el contenedor. - Depende del servicio
php.
- Utiliza la imagen
mysql:- Utiliza la imagen
mysql:8. - Define las variables de entorno para la configuración de MySQL (usuario, contraseña, base de datos).
- Monta los volúmenes para persistir los datos y los archivos temporales. El el
Dockerfilede MySQL ya creamos el passwordadministradorpara el usuarioroot, y el usuarioalumnocon la contraseñaalumnoy la base de datostest. - Mapea el puerto
3306del host al puerto3306del contenedor. (Asegúrate de que este puerto no esté en uso por otro servicio en tu máquina).
- Utiliza la imagen
El contenido del fichero php/conf.d/99-xdebug.ini es opcional, pero si quieres usar Xdebug, puedes crear un archivo con el siguiente contenido:
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.log_level=0
Esto habilitará Xdebug en el contenedor PHP y permitirá la depuración remota.
Paso 3: Configuración de Nginx
-
Abre el archivo
nginx/default.conf. -
Pega el siguiente contenido en el archivo
default.conf:
Configuración nginx
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}
}
Paso 4: Crear el Dockerfile para PHP (si lo necesitas)
-
Abre el archivo
php/Dockerfile. -
Pega el siguiente contenido para crear el contenedor de PHP con las extensiones necesarias, de momento las libreriás PDO y MySQL:
Sería recomendado compartir bind el directorio usr/local/etc/php/conf.d para que puedas modificar el archivo php.ini desde tu máquina host.
Dockerfile PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
En el fichero anterior:
FROM php:8.4-fpm: Utiliza la imagen base de PHP 8.2 con FPM.RUN apt-get update && apt-get install -y ...: Actualiza los repositorios e instala las dependencias necesarias para PHP y MongoDB.RUN docker-php-ext-install pdo pdo_mysql: Instala las extensiones de PHP necesarias para PDO y MySQL.RUN mv /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini: Copia el archivo de configuración de PHP de desarrollo a producción.RUN pecl install mongodb ...: Instala la extensión de MongoDB y la habilita. (Opcional)WORKDIR /var/www/html: Establece el directorio de trabajo dentro del contenedor.
Paso 5: Crear un archivo PHP de prueba
-
Abre el archivo
src/index.php. -
Pega el siguiente contenido para crear un archivo PHP que se conecte a MySQL:
prueba php y conexión a MySQL
<?php
$host = getenv('MYSQL_HOST'); // IP o dominio del host
$db = getenv('MYSQL_DB'); // Base de datos que utilizamos por defecto
$user = getenv('MYSQL_USER'); // Usuario
$pass = getenv('MYSQL_PASSWORD'); // Password
try {
$pdo = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "<p>Conexión exitosa a la base de datos!</p>";
} catch (PDOException $e) {
echo "<p>Error al conectar a la base de datos: " . $e->getMessage() . "</p>";
echo "<p>Host: $host, DB: $db, User: $user, Pass: $pass</p>";
phpinfo(); // Muestra información de PHP para depuración
}
?>
Paso 6: Levantar el entorno con Docker
-
Abre la terminal en la carpeta del proyecto.
-
Levanta los contenedores de Docker usando
docker-compose:
docker-compose up --build
podemos añaidir -d al final del comando para que se ejecute en segundo plano:
docker-compose up --build -d
Esto descargará las imágenes necesarias y construirá los contenedores.
Las próximas veces que levantes el contenedor no será necesario usar --build, ya que no has hecho cambios en el Dockerfile ni en el docker-compose.yml. Si vuelves a utilizar --build, Docker volverá a construir la imagen, lo que puede tardar un poco más. Y puedes perder los cambios que hayas hecho en el contenedor. Par volver a levantar el contenedor, puedes usar:
docker-compose up
-d al final del comando:
docker-compose up -d
Si quieres parar el contenedor, puedes usar:
docker-compose down
Modificación de los contenedores
Si modificas el Dockerfile o el docker-compose.yml, tendrás que volver a ejecutar docker-compose up --build para que los cambios surtan efecto. Pero antes es conveniente eliminar los contenedores y las imágenes para evitar conflictos. Puedes hacerlo con:
docker-compose down --rmi all
Luego volvemos a construir los contenedores con:
docker-compose up --build
Paso 7: Verificar el entorno
-
Una vez que los contenedores estén levantados, abre tu navegador y accede a http://localhost:8080.
-
Deberías ver el mensaje "Conexión exitosa a la base de datos!" si todo está configurado correctamente.
Paso 8: (Opcional) Conectarse al contenedor MySQL
Si quieres interactuar directamente con la base de datos MySQL, puedes hacerlo desde tu terminal:
-
Conectarse al contenedor MySQL con el siguiente comando:
docker exec -it dk_mysql mysql -uroot -pLuego introduce la contraseña de
root, debe seradministrador. -
Una vez dentro, puedes crear tablas, insertar datos, etc.
Paso 9: (Opcional) Usar VSCode con Docker
Para trabajar directamente en el contenedor desde VSCode:
- Instala la extensión Remote - Containers en VSCode.
- Abre la carpeta del proyecto con VSCode y haz clic en el icono "Reopen in Container" en la esquina inferior izquierda. Esto te permitirá trabajar dentro del contenedor PHP.
Paso 10: Proyectos adicionales (Laravel)
Una vez tengas todo en funcionamiento con PHP, puedes:
-
Crear un nuevo proyecto de Laravel dentro de la carpeta
src:docker exec -it dk_php bash composer create-project --prefer-dist laravel/laravel mi-laravel -
Configurar la base de datos en
.envde Laravel para que se conecte a MySQL usando las mismas credenciales que usaste en el archivo PHP.