Práctica guiada: Docker Desktop, Portainer, Apache, PHP y MySQL

1. Presentación de la práctica

En esta actividad aprenderemos a utilizar Docker para poner en funcionamiento una pequeña aplicación web formada por dos contenedores independientes.

El primero tendrá un servidor Apache con PHP. El segundo alojará una base de datos MySQL con información sobre videojuegos de PC.

No tendremos que programar la aplicación: el profesor facilitará todos los archivos necesarios. Nuestro trabajo será instalar, configurar, conectar, comprobar y publicar los contenedores.

Arquitectura que vamos a construir

2. Material facilitado por el profesor

He preparado un ZIP con todos los archivos necesarios para los alumnos.

Los alumnos deberán descomprimir el ZIP en una carpeta de Windows llamada practica_docker_juegos.

Parte 1. Instalación de Docker Desktop

Paso 1. Descargar Docker Desktop

  1. Accede a Docker Desktop.
  2. Descarga la versión para Windows.
  3. Ejecuta el instalador.
  4. Mantén seleccionada la opción de utilizar WSL 2, si aparece.
  5. Finaliza la instalación y reinicia Windows cuando sea necesario.

Paso 2. Comprobar el funcionamiento

Abre Docker Desktop y espera a que el motor de Docker esté funcionando.

Abre PowerShell y ejecuta:

docker --version

Después:

docker info

Si este último comando muestra información del servidor, Docker está funcionando.

Si indica que WSL no está instalado, abre PowerShell como administrador y ejecuta:

wsl --install

Reinicia el ordenador cuando termine la instalación y vuelve a abrir Docker Desktop.

Parte 2. Crear nuestra cuenta de Docker Hub

Docker Hub es un repositorio en Internet que permite descargar imágenes creadas por otras personas y publicar las nuestras.

  1. Accede a Docker Hub.
  2. Selecciona Sign up.
  3. Registra tu cuenta y verifica el correo electrónico.
  4. Accede a Docker Desktop.
  5. Pulsa Sign in e inicia sesión con la cuenta recién creada.

Guarda tu nombre de usuario de Docker Hub. Lo necesitaremos al finalizar la práctica.

Parte 3. Instalar Portainer

Portainer es una herramienta de administración visual de Docker. Nos permitirá controlar contenedores, imágenes, redes y otros recursos.

Portainer CE : gérer Docker et Podman visuellement

Paso 1. Instalar la extensión

  1. Abre Docker Desktop.
  2. Entra en Settings → Extensions y comprueba que estén habilitadas.
  3. Abre Extensions Marketplace.
  4. Busca Portainer.
  5. Selecciona la extensión Portainer CE publicada por Portainer.io.
  6. Pulsa Install o Open in Docker Desktop, según la interfaz.

También puedes localizarla en Portainer CE para Docker Desktop.

Paso 2. Acceder a Portainer

Abre Portainer desde el apartado Extensions. Si solicita crear un usuario administrador, completa el asistente y selecciona el entorno local de Docker.

Comprueba que puedes acceder al apartado Containers.

Esta extensión se encuentra disponible oficialmente para Docker Desktop.

Paso 2. Configuración inicial

Si Portainer solicita crear una cuenta administradora local:

  1. Introduce un nombre de usuario.
  2. Elige una contraseña.
  3. Completa el asistente.

Selecciona el entorno Docker local disponible. Según la versión, puede aparecer como local o con un nombre similar.

Paso 3. Conocer Portainer

Localiza los apartados principales.

SecciónUtilidad
ContainersCrear, iniciar, detener y administrar contenedores
ImagesDescargar, etiquetar y publicar imágenes
NetworksCrear redes para comunicar contenedores
VolumesAdministrar almacenamiento persistente
EventsConsultar acontecimientos del entorno
RegistriesConfigurar repositorios como Docker Hub

Durante esta práctica trabajaremos principalmente en Containers, Images y Networks.

Comprobación 3: puedes abrir Portainer y acceder al entorno Docker local.

PARTE 4. NUESTRO PRIMER CONTENEDOR: HELLO WORLD

Antes de crear nuestra aplicación web, vamos a comprobar cómo funciona Docker utilizando una imagen muy sencilla.

La imagen hello-world muestra un mensaje y termina su ejecución.

Paso 1. Descargar la imagen

Desde Portainer:

  1. Selecciona Images.
  2. Busca el apartado para descargar imágenes (Pull image).
  3. Selecciona Docker Hub como registro.
  4. Introduce:
hello-world:latest

5. Pulsa Pull the image.

Espera a que termine.

La imagen debería aparecer en el listado de imágenes disponibles.

Paso 2. Crear el contenedor

  1. Accede a Containers.
  2. Pulsa Add container.
  3. Introduce los siguientes valores:
CampoValor
Namemi-hola-mundo
Imagehello-world:latest
NetworkDefault
Restart policyNo
  1. No es necesario publicar ningún puerto.
  2. Pulsa Deploy the container.

Paso 3. Comprobar el resultado

Abre la lista de contenedores.

Localiza mi-hola-mundo.

Es probable que aparezca con el estado Exited o detenido.

Esto no significa que haya fallado. El programa ha terminado su ejecución.

Selecciona el contenedor y entra en Logs.

Busca el mensaje:

Hello from Docker!

Paso 4. Eliminar el contenedor

Vuelve al listado de contenedores.

  1. Selecciona mi-hola-mundo.
  2. Pulsa Remove.
  3. Confirma la eliminación.

Después abre Images y comprueba que la imagen hello-world sigue disponible.

Pregunta de reflexión

¿Por qué hemos podido eliminar el contenedor sin eliminar también la imagen?

PARTE 5. CREAR NUESTRA PRIMERA RED DOCKER

Vamos a crear una red privada para que Apache y MySQL puedan comunicarse.

La llamaremos:

juegos-net

Paso 1. Crear la red desde Portainer

  1. Entra en Networks.
  2. Pulsa Add network.
  3. Introduce:
CampoValor
Namejuegos-net
Driverbridge
InternalDesactivado
Enable IPv6Desactivado
  1. Deja el resto de opciones por defecto.
  2. Pulsa Create the network.

Paso 2. Verificarla

Comprueba que juegos-net aparece en el listado.

Más adelante conectaremos ambos contenedores a esta red.

PARTE 6. CREAR EL CONTENEDOR APACHE

Vamos a crear nuestro primer servidor web.

Utilizaremos una imagen oficial de Apache HTTP Server llamada httpd.

Paso 1. Descargar Apache

Abre Images y descarga:

httpd:2.4-trixie

Esta variante está basada en Debian, por lo que podremos utilizar apt para instalar programas.

Paso 2. Crear el contenedor

Accede a Containers → Add container.

Introduce los siguientes datos:

CampoValor
Nameweb-juegos
Imagehttpd:2.4-trixie
Restart policyUnless stopped

En el apartado de publicación manual de puertos, añade:

HostContainer
808080

En Advanced container settings → Network, selecciona:

juegos-net

En Advanced container settings → Env, añade esta variable:

NameValue
DB_HOSTbd-juegos

Esta variable indicará al servidor web cómo localizar la base de datos cuando la creemos.

Pulsa Deploy the container.

Paso 3. Verificar el estado

En el listado de contenedores debería aparecer:

web-juegos     running

Paso 4. Abrir nuestra primera página web

En Windows, abre el navegador:http://localhost:8080

Debería aparecer el mensaje:

It works!

Esto significa que Apache está funcionando.

¿Qué hemos conseguido?

Hemos creado un servidor web Linux dentro de Docker, sin instalar Apache directamente en Windows.

El puerto 8080 pertenece a nuestro equipo, mientras que Apache escucha en el puerto 80 dentro del contenedor.

PARTE 7. INSTALAR PHP Y MYSQLI EN APACHE

Nuestro servidor funciona, pero todavía no puede ejecutar las páginas PHP que utilizaremos.

Vamos a instalar PHP y su conector MySQL.

Paso 1. Abrir la consola desde Portainer

En Portainer:

  1. Accede a Containers.
  2. Selecciona web-juegos.
  3. Pulsa Console.
  4. Selecciona /bin/sh.
  5. Mantén el usuario predeterminado (root).
  6. Pulsa Connect.

Se abrirá una consola Linux dentro del contenedor.

Paso 2. Actualizar la lista de paquetes

Escribe:

apt update

Paso 3. Instalar PHP

Ejecuta:

apt install -y php-cgi php-mysql

Con esta instalación tendremos el intérprete PHP y los conectores que necesita para trabajar con MySQL.

Paso 4. Comprobar PHP

php -v

Debería aparecer información sobre la versión instalada.

Paso 5. Comprobar MySQLi

php -m | grep mysqli

El resultado esperado es:

mysqli

También podemos comprobar la extensión PDO para MySQL:

php -m | grep pdo_mysql

Si ambos módulos aparecen, la instalación está preparada.

PARTE 8. CONFIGURAR APACHE PARA EJECUTAR PHP

La imagen httpd no ejecuta PHP automáticamente. Por ello, necesitamos indicar a Apache cómo debe interpretar los archivos .php.

En esta práctica utilizaremos PHP mediante CGI, una solución sencilla para este laboratorio que permite que Apache arranque normalmente sin necesitar dos servicios permanentes.

Paso 1. Preparar el intérprete PHP

Seguimos dentro de la consola del contenedor web-juegos.

Ejecuta:

mkdir -p /usr/local/apache2/php-bin

Ahora crearemos un acceso al intérprete PHP:

ln -s /usr/bin/php-cgi /usr/local/apache2/php-bin/php-cgi

Paso 2. Crear la configuración de PHP

Copia y pega el bloque completo siguiente en la consola de Portainer:

cat > /usr/local/apache2/conf/extra/php-clase.conf <<'EOF'
LoadModule actions_module modules/mod_actions.so
LoadModule cgid_module modules/mod_cgid.so

ScriptAlias /php-bin/ "/usr/local/apache2/php-bin/"

<Directory "/usr/local/apache2/php-bin/">
    Options +ExecCGI
    Require all granted
</Directory>

AddHandler php-script .php
Action php-script /php-bin/php-cgi

PassEnv DB_HOST

DirectoryIndex index.php index.html
EOF

Este bloque crea un archivo de configuración para Apache.

No es necesario memorizarlo ni modificarlo.

Paso 3. Activar la configuración

Ejecuta:

echo 'Include conf/extra/php-clase.conf' >> /usr/local/apache2/conf/httpd.conf

Paso 4. Comprobar Apache

httpd -t

El resultado esperado es:

Syntax OK

Si aparece un error de módulo duplicado, revisa si ese módulo ya estaba activado en httpd.conf y elimina de php-clase.conf únicamente la línea LoadModule duplicada.

Paso 5. Aplicar los cambios

httpd -k graceful

Apache aplicará la configuración nueva sin que tengamos que destruir el contenedor.

La configuración utiliza los módulos CGI de Apache, documentados oficialmente.

Paso 6. Crear una página PHP de prueba

Desde la misma consola, copia este bloque:

cat > /usr/local/apache2/htdocs/prueba.php <<'EOF'
<?php
echo "Hola, PHP funciona correctamente";
?>
EOF

Abre en el navegador:http://localhost:8080/prueba.php

Debe aparecer:

Hola, PHP funciona correctamente

Comprobación: Apache ejecuta PHP correctamente.

PARTE 9. CREAR EL CONTENEDOR MYSQL

Ahora necesitaremos una base de datos donde almacenar nuestros videojuegos.

Utilizaremos MySQL 8.4.

Paso 1. Descargar MySQL

En Portainer:

  1. Abre Images.
  2. Selecciona Docker Hub.
  3. Descarga:
mysql:8.4

4. Espera a que aparezca en el listado de imágenes.

Paso 2. Crear el contenedor

Accede a Containers → Add container.

Introduce:

CampoValor
Namebd-juegos
Imagemysql:8.4
Restart policyUnless stopped

En la publicación manual de puertos:

HostContainer
33073306

En Advanced container settings → Network, selecciona:

juegos-net

Paso 3. Configurar las variables de MySQL

Busca Advanced container settings → Env.

Añade una por una las siguientes variables:

NameValue
MYSQL_ROOT_PASSWORDRootClase2026
MYSQL_DATABASEjuegos
MYSQL_USERalumno
MYSQL_PASSWORDClaveJuegos2026

Estas variables permiten inicializar MySQL automáticamente.

Sus funciones son:

  • MYSQL_ROOT_PASSWORD: contraseña del administrador.
  • MYSQL_DATABASE: base de datos que queremos crear.
  • MYSQL_USER: usuario que utilizará la aplicación PHP.
  • MYSQL_PASSWORD: contraseña de ese usuario.

Estas credenciales son únicamente de laboratorio. No deberán reutilizarse en servicios reales.

Paso 4. Crear MySQL

Pulsa Deploy the container.

Regresa a Containers.

Comprueba que aparece bd-juegos.

Paso 5. Comprobar que MySQL está funcionando

Selecciona bd-juegos y pulsa Logs.

Espera a que aparezca un mensaje similar a:

ready for connections

Durante el primer arranque MySQL necesita inicializar sus archivos y crear la base de datos.

Paso 6. Acceder a MySQL

Dentro de Portainer:

  1. Selecciona bd-juegos.
  2. Accede a Console.
  3. Selecciona /bin/sh.
  4. Pulsa Connect.

Escribe:

mysql -u root -p

Cuando solicite la contraseña, introduce:

RootClase2026

La contraseña no se mostrará mientras escribes.

Una vez dentro, ejecuta:

SHOW DATABASES;

Debería aparecer la base de datos juegos.

Para salir del cliente MySQL:

exit;

Comprobación: tenemos un servidor MySQL dentro de Docker, conectado a la misma red que Apache.

PARTE 10. CREAR LA BASE DE DATOS DE VIDEOJUEGOS

El profesor proporciona el siguiente código SQL.

Este código realizará tres operaciones:

  1. Seleccionar la base de datos juegos.
  2. Crear una tabla llamada videojuegos.
  3. Insertar cinco videojuegos de ejemplo.

Paso 1. Crear el archivo SQL dentro de MySQL

Desde la consola Linux del contenedor bd-juegos, copia y pega todo este bloque:

cat > /docker-entrypoint-initdb.d/01-juegos.sql <<'EOF'
USE juegos;

CREATE TABLE IF NOT EXISTS videojuegos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    titulo VARCHAR(100),
    genero VARCHAR(50),
    plataforma VARCHAR(50)
);

INSERT INTO videojuegos
(titulo, genero, plataforma)
VALUES
('Minecraft', 'Sandbox', 'PC'),
('Age of Empires II', 'Estrategia', 'PC'),
('Portal 2', 'Puzles', 'PC'),
('Stardew Valley', 'Simulacion', 'PC'),
('Hollow Knight', 'Metroidvania', 'PC');
EOF

No es necesario escribir el código línea por línea.

Selecciona el bloque completo, cópialo y pégalo en la consola.

Hemos guardado el SQL en /docker-entrypoint-initdb.d/ para que también pueda utilizarse al crear nuevos contenedores a partir de nuestra futura imagen MySQL.

Paso 2. Ejecutar el SQL

Ejecuta:

mysql -u root -p juegos < /docker-entrypoint-initdb.d/01-juegos.sql

Introduce la contraseña del administrador:

RootClase2026

Si no aparece ningún error, el script habrá terminado.

No vuelvas a ejecutar el script sobre esta misma base de datos, ya que volvería a insertar los registros.

Paso 3. Verificar la tabla

Accede nuevamente al cliente MySQL:

mysql -u root -p

Introduce la contraseña.

Ahora ejecuta:

USE juegos;

Y después:

SHOW TABLES;

Debe aparecer:

videojuegos

Paso 4. Comprobar los datos

SELECT * FROM videojuegos;

El resultado esperado es:

idtitulogeneroplataforma
1MinecraftSandboxPC
2Age of Empires IIEstrategiaPC
3Portal 2PuzlesPC
4Stardew ValleySimulacionPC
5Hollow KnightMetroidvaniaPC

Ya tenemos nuestra primera base de datos funcionando dentro de Docker.

Sal del cliente MySQL escribiendo:

exit;

PARTE 11. INSTALAR NUESTRA APLICACIÓN PHP

Nuestra aplicación será muy sencilla.

Mostrará el título, el género y la plataforma de los videojuegos almacenados en MySQL.

No tendremos que desarrollar el código; solamente introducirlo dentro del contenedor Apache.

Paso 1. Volver al contenedor Apache

En Portainer:

  1. Entra en Containers.
  2. Selecciona web-juegos.
  3. Pulsa Console.
  4. Abre /bin/sh.

Paso 2. Crear el archivo PHP

Copia todo este bloque de código y pégalo directamente en la consola de Portainer:

cat > /usr/local/apache2/htdocs/index.php <<'EOF'
<?php
$conexion = new mysqli(
    getenv("DB_HOST") ?: "bd-juegos",
    "alumno",
    "ClaveJuegos2026",
    "juegos"
);

if ($conexion->connect_error) {
    die("Error de conexion con MySQL");
}

$resultado = $conexion->query("SELECT * FROM videojuegos");
?>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Juegos de PC</title>
</head>
<body>

<h1>Catalogo de videojuegos</h1>

<?php
while ($juego = $resultado->fetch_assoc()) {
    echo "<p>";
    echo htmlspecialchars($juego["titulo"]);
    echo " - ";
    echo htmlspecialchars($juego["genero"]);
    echo " - ";
    echo htmlspecialchars($juego["plataforma"]);
    echo "</p>";
}
?>

</body>
</html>
EOF

El código es sencillo, pero contiene todo lo necesario:

  • Conexión con MySQL.
  • Consulta de los videojuegos.
  • Lectura de resultados.
  • Generación de una página HTML.

El servidor MySQL se busca utilizando la variable DB_HOST, que configuramos desde Portainer.

Paso 3. Eliminar la página predeterminada

El servidor Apache incluye una página llamada index.html.

Vamos a eliminarla para que se muestre directamente nuestro index.php.

Desde la consola:

rm /usr/local/apache2/htdocs/index.html

Paso 4. Abrir la aplicación

Accede desde Windows a:http://localhost:8080

Debería mostrarse una página similar a la siguiente.

La página real tendrá un diseño HTML mucho más sencillo, pero debe mostrar los mismos cinco videojuegos.

Paso 5. Comprobar Portainer

Vuelve a Portainer y verifica que los dos contenedores están activos:

ContenedorEstadoPuerto Windows
web-juegosRunning8080
bd-juegosRunning3307

Ambos deben pertenecer a juegos-net.

¿Cómo funciona la aplicación?

Cuando escribimos localhost:8080 en el navegador:

  1. Docker dirige la petición al contenedor Apache.
  2. Apache identifica el archivo index.php.
  3. PHP ejecuta el programa.
  4. PHP solicita los videojuegos a MySQL.
  5. MySQL devuelve los registros.
  6. PHP genera la página HTML que vemos en el navegador.

Hemos conseguido ejecutar una aplicación PHP conectada a una base de datos MySQL utilizando dos contenedores independientes.

PARTE 12. CREAR NUESTRAS PROPIAS IMÁGENES

Ahora aprenderemos una de las funciones más interesantes de Docker: crear nuestras propias imágenes a partir de los contenedores que hemos configurado.

Esto nos permitirá reutilizar las modificaciones realizadas.

Paso 1. Crear la imagen de Apache + PHP

En Portainer:

  1. Accede a Containers.
  2. Selecciona web-juegos.
  3. Busca la opción Create image dentro de los detalles del contenedor.
  4. Introduce un nombre para la imagen:
mi-web-juegos

Y la etiqueta:

v1

Si Portainer muestra un único campo para el nombre y la etiqueta, introduce:

mi-web-juegos:v1

5. Confirma la creación de la imagen.

Es posible que tarde un poco, ya que hemos instalado nuevos paquetes dentro del contenedor.

Paso 2. Verificar la imagen

Entra en Images.

Debería aparecer:

mi-web-juegos:v1

Esta imagen contendrá Apache, PHP, el conector MySQL, nuestra configuración CGI y la página index.php.

La configuración de arranque que hemos utilizado permite que Apache siga iniciándose con su comando predeterminado.

Paso 3. Crear la imagen de MySQL

Ahora repetiremos el procedimiento.

  1. Accede a Containers.
  2. Selecciona bd-juegos.
  3. Pulsa Create image.
  4. Introduce:
mi-bd-juegos:v1

5. Confirma la operación.

Paso 4. Verificar las dos imágenes

Abre Images.

Deberías encontrar:

mi-web-juegos:v1
mi-bd-juegos:v1

Importante sobre MySQL: las imágenes creadas desde contenedores no incorporan los datos guardados en volúmenes. Lo que hemos incluido en nuestra imagen MySQL es el archivo 01-juegos.sql, que permitirá reconstruir la tabla y sus datos al iniciar una base de datos nueva.

PARTE 13. PUBLICAR NUESTRAS IMÁGENES EN DOCKER HUB

Ahora compartiremos nuestras imágenes en Docker Hub.

Para ello utilizaremos Portainer.

Paso 1. Configurar el acceso a Docker Hub

En Portainer, entra en el apartado Registries.

Si Docker Hub aparece configurado, comprueba que permite utilizar tus credenciales. En caso contrario:

  1. Pulsa Add registry.
  2. Selecciona Docker Hub.
  3. Introduce tus datos de acceso. Si solicita un token de acceso, puedes crearlo desde la configuración de seguridad de tu cuenta de Docker Hub.
  4. Guarda la configuración.

No publiques las contraseñas utilizadas para acceder a tu cuenta.

Paso 2. Etiquetar nuestra primera imagen

Abre Images y localiza:

mi-web-juegos:v1

Selecciona la opción Tag.

Supongamos que tu usuario de Docker Hub es alumnoasir.

Asigna la etiqueta:

alumnoasir/mi-web-juegos:v1

Sustituye alumnoasir por tu nombre real de usuario de Docker Hub.

Paso 3. Publicar la imagen web

En el listado de imágenes localiza la nueva etiqueta y selecciona Push, normalmente identificada por una flecha hacia arriba.

Selecciona Docker Hub si Portainer solicita elegir un registro.

Espera a que termine la subida.

Paso 4. Publicar la imagen MySQL

Repite el mismo procedimiento con:

mi-bd-juegos:v1

Asignándole:

alumnoasir/mi-bd-juegos:v1

Pulsa Push.

La documentación de Portainer describe el proceso de etiquetado y publicación de imágenes desde su interfaz.

Paso 5. Verificar Docker Hub

Entra en:Docker Hub

Dentro de tus repositorios deberías encontrar:

RepositorioEtiqueta
mi-web-juegosv1
mi-bd-juegosv1

Para esta práctica, crea los repositorios como privados si tu cuenta lo permite.

Recuerda que la imagen web contiene credenciales de ejemplo y que Docker Hub no debe utilizarse para publicar secretos reales.

Comprobación: hemos creado y publicado dos imágenes propias sin utilizar comandos Docker.

PARTE 14. CREAR UNA SEGUNDA INSTALACIÓN CON OTROS PUERTOS

En esta parte final vamos a demostrar que nuestras imágenes pueden utilizarse para crear otros contenedores.

No eliminaremos los originales.

Crearemos una segunda instalación de la aplicación.

ElementoInstalación originalSegunda instalación
Contenedor Apacheweb-juegosweb-juegos-copia
Puerto web Windows80808081
Contenedor MySQLbd-juegosbd-juegos-copia
Puerto MySQL Windows33073308
Red Dockerjuegos-netjuegos-copia-net

Paso 1. Crear una segunda red

Desde Portainer:

  1. Accede a Networks.
  2. Pulsa Add network.
  3. Nombre:
juegos-copia-net
  1. Driver: bridge.
  2. Pulsa Create the network.

Paso 2. Descargar nuestra imagen MySQL

Accede a Images.

Selecciona Docker Hub y busca:

alumnoasir/mi-bd-juegos:v1

Sustituye el nombre de usuario.

Pulsa Pull the image.

Aunque la imagen ya exista localmente, este paso permite comprobar que puede recuperarse desde Docker Hub.

Paso 3. Crear el nuevo MySQL

Accede a Containers → Add container.

Introduce:

CampoValor
Namebd-juegos-copia
Imagealumnoasir/mi-bd-juegos:v1
Host port3308
Container port3306
Networkjuegos-copia-net

En Advanced container settings → Env, configura:

NameValue
MYSQL_ROOT_PASSWORDRootClase2026
MYSQL_DATABASEjuegos
MYSQL_USERalumno
MYSQL_PASSWORDClaveJuegos2026

Deja los volúmenes con su configuración predeterminada y no reutilices el volumen de datos de la primera base de datos.

Pulsa Deploy the container.

Paso 4. Verificar la segunda base de datos

Abre los registros de bd-juegos-copia.

Espera a que MySQL termine de inicializarse.

El archivo SQL que habíamos incluido en la imagen deberá ejecutarse durante la inicialización de esta base de datos nueva.

Para comprobarlo, abre Console dentro de bd-juegos-copia y entra en MySQL:

mysql -u root -p

Introduce la contraseña:

RootClase2026

Ejecuta:

USE juegos;
SELECT * FROM videojuegos;

Deben aparecer los cinco videojuegos.

Sal de MySQL:

exit;

Paso 5. Descargar nuestra imagen Apache + PHP

En Portainer, abre Images.

Busca:

alumnoasir/mi-web-juegos:v1

Pulsa Pull the image.

Paso 6. Crear el segundo contenedor Apache

Entra en Containers → Add container.

Introduce:

CampoValor
Nameweb-juegos-copia
Imagealumnoasir/mi-web-juegos:v1
Host port8081
Container port80
Networkjuegos-copia-net

En Advanced container settings → Env añade:

NameValue
DB_HOSTbd-juegos-copia

Esta variable es importante porque la segunda página web debe conectarse al segundo contenedor MySQL, no al primero.

Pulsa Deploy the container.

Paso 7. Comprobar las dos páginas

Ahora abre las siguientes direcciones:

Primera instalación. http://localhost:8080

Apache y MySQL originales

Segunda instalación. http://localhost:8081

Contenedores creados a partir de nuestras imágenes

Ambas páginas deberán mostrar los mismos cinco videojuegos.

Hemos conseguido crear dos instalaciones independientes a partir de nuestras imágenes.

Paso 8. Comprobación final desde Portainer

Accede a Containers.

Deberías tener cuatro contenedores activos:

ContenedorEstado esperado
web-juegosRunning
bd-juegosRunning
web-juegos-copiaRunning
bd-juegos-copiaRunning

PARTE 15. PEQUEÑAS COMPROBACIONES PRÁCTICAS

Estas actividades permiten comprobar que hemos entendido el funcionamiento de los contenedores.

Ejercicio 1. Detener Apache

Desde Portainer, detén el contenedor web-juegos.

Intenta abrir:

http://localhost:8080

¿Qué sucede?

Ahora vuelve a iniciar el contenedor desde Portainer y comprueba que la página funciona nuevamente.

Ejercicio 2. Detener MySQL

Detén bd-juegos.

Vuelve a abrir la primera página web.

¿Qué sucede cuando PHP intenta consultar la base de datos?

Inicia nuevamente MySQL y comprueba que la web recupera su funcionamiento.

Ejercicio 3. Comprobar la independencia de las instalaciones

Detén web-juegos y bd-juegos, pero deja funcionando los dos contenedores de la segunda instalación.

Comprueba si sigue funcionando:

http://localhost:8081

Explica por qué ocurre.

Vuelve a iniciar los contenedores originales cuando termines.

PARTE 16. ENTREGA DE LA PRÁCTICA

Los alumnos deberán entregar un documento PDF que incluya las siguientes capturas.

Lista de entrega

0/15 completadasDocker Desktop instalado correctamenteCuenta en Docker Hub creadaPortainer funcionandoHello World ejecutado y comprobado en LogsRed juegos-net creadaContenedor Apache funcionando en 8080PHP instalado y prueba.php ejecutándoseContenedor MySQL configuradoTabla videojuegos con cinco registrosPágina PHP mostrando el catálogoDos imágenes creadas en PortainerImágenes publicadas en Docker HubCuatro contenedores funcionandoSegunda aplicación funcionando en 8081Comprobada la independencia de ambas instalaciones

Copiar lista de comprobaciones

Preguntas de comprensión

Responde brevemente a las siguientes cuestiones:

  • ¿Por qué no debemos considerar una imagen Docker como una copia de seguridad de la base de datos?
  • ¿Qué es una imagen Docker?
  • ¿Qué es un contenedor?
  • ¿Por qué Hello World aparece detenido después de ejecutarse?
  • ¿Qué utilidad tiene Portainer?
  • ¿Para qué sirve una red Docker?
  • ¿Por qué hemos creado dos contenedores diferentes?
  • ¿Qué significa publicar el puerto 8080:80?
  • ¿Para qué utilizamos las variables de entorno de MySQL?
  • ¿Qué función tiene el conector MySQLi de PHP?
  • ¿Qué diferencia existe entre detener y eliminar un contenedor?
  • ¿Para qué sirve crear una imagen de un contenedor que hemos configurado?
  • ¿Qué ventajas tiene subir nuestra imagen a Docker Hub?
  • ¿Por qué podemos ejecutar dos servidores Apache utilizando los puertos 8080 y 8081?

PARTE 17. CONCLUSIONES

Con esta práctica hemos aprendido a utilizar Docker de manera visual a través de Portainer.

Hemos instalado y configurado dos servicios independientes, Apache con PHP y MySQL, y hemos conseguido que se comuniquen mediante una red privada.

También hemos creado nuestras propias imágenes, las hemos publicado en Docker Hub y las hemos reutilizado para desplegar una segunda instalación sin repetir manualmente la instalación de los programas.

Lo más importante es comprender que una imagen permite crear contenedores, mientras que un contenedor es una instancia en ejecución de esa imagen.

En una próxima práctica aprenderemos a realizar estas mismas operaciones desde la terminal y, posteriormente, a utilizar Docker Compose para automatizar el despliegue de varios servicios.