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
- Accede a Docker Desktop.
- Descarga la versión para Windows.
- Ejecuta el instalador.
- Mantén seleccionada la opción de utilizar WSL 2, si aparece.
- 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.
- Accede a Docker Hub.
- Selecciona Sign up.
- Registra tu cuenta y verifica el correo electrónico.
- Accede a Docker Desktop.
- 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.
Paso 1. Instalar la extensión
- Abre Docker Desktop.
- Entra en Settings → Extensions y comprueba que estén habilitadas.
- Abre Extensions Marketplace.
- Busca
Portainer. - Selecciona la extensión Portainer CE publicada por Portainer.io.
- 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:
- Introduce un nombre de usuario.
- Elige una contraseña.
- 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ón | Utilidad |
|---|---|
| Containers | Crear, iniciar, detener y administrar contenedores |
| Images | Descargar, etiquetar y publicar imágenes |
| Networks | Crear redes para comunicar contenedores |
| Volumes | Administrar almacenamiento persistente |
| Events | Consultar acontecimientos del entorno |
| Registries | Configurar 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:
- Selecciona Images.
- Busca el apartado para descargar imágenes (Pull image).
- Selecciona Docker Hub como registro.
- 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
- Accede a Containers.
- Pulsa Add container.
- Introduce los siguientes valores:
| Campo | Valor |
|---|---|
| Name | mi-hola-mundo |
| Image | hello-world:latest |
| Network | Default |
| Restart policy | No |
- No es necesario publicar ningún puerto.
- 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.
- Selecciona
mi-hola-mundo. - Pulsa Remove.
- 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
- Entra en Networks.
- Pulsa Add network.
- Introduce:
| Campo | Valor |
|---|---|
| Name | juegos-net |
| Driver | bridge |
| Internal | Desactivado |
| Enable IPv6 | Desactivado |
- Deja el resto de opciones por defecto.
- 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:
| Campo | Valor |
|---|---|
| Name | web-juegos |
| Image | httpd:2.4-trixie |
| Restart policy | Unless stopped |
En el apartado de publicación manual de puertos, añade:
| Host | Container |
|---|---|
8080 | 80 |
En Advanced container settings → Network, selecciona:
juegos-net
En Advanced container settings → Env, añade esta variable:
| Name | Value |
|---|---|
DB_HOST | bd-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:
- Accede a Containers.
- Selecciona
web-juegos. - Pulsa Console.
- Selecciona
/bin/sh. - Mantén el usuario predeterminado (
root). - 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:
- Abre Images.
- Selecciona Docker Hub.
- 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:
| Campo | Valor |
|---|---|
| Name | bd-juegos |
| Image | mysql:8.4 |
| Restart policy | Unless stopped |
En la publicación manual de puertos:
| Host | Container |
|---|---|
3307 | 3306 |
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:
| Name | Value |
|---|---|
MYSQL_ROOT_PASSWORD | RootClase2026 |
MYSQL_DATABASE | juegos |
MYSQL_USER | alumno |
MYSQL_PASSWORD | ClaveJuegos2026 |
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:
- Selecciona
bd-juegos. - Accede a Console.
- Selecciona
/bin/sh. - 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:
- Seleccionar la base de datos
juegos. - Crear una tabla llamada
videojuegos. - 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:
| id | titulo | genero | plataforma |
|---|---|---|---|
| 1 | Minecraft | Sandbox | PC |
| 2 | Age of Empires II | Estrategia | PC |
| 3 | Portal 2 | Puzles | PC |
| 4 | Stardew Valley | Simulacion | PC |
| 5 | Hollow Knight | Metroidvania | PC |
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:
- Entra en Containers.
- Selecciona
web-juegos. - Pulsa Console.
- 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:
| Contenedor | Estado | Puerto Windows |
|---|---|---|
web-juegos | Running | 8080 |
bd-juegos | Running | 3307 |
Ambos deben pertenecer a juegos-net.
¿Cómo funciona la aplicación?
Cuando escribimos localhost:8080 en el navegador:
- Docker dirige la petición al contenedor Apache.
- Apache identifica el archivo
index.php. - PHP ejecuta el programa.
- PHP solicita los videojuegos a MySQL.
- MySQL devuelve los registros.
- 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:
- Accede a Containers.
- Selecciona
web-juegos. - Busca la opción Create image dentro de los detalles del contenedor.
- 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.
- Accede a Containers.
- Selecciona
bd-juegos. - Pulsa Create image.
- 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:
- Pulsa Add registry.
- Selecciona Docker Hub.
- 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.
- 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:
| Repositorio | Etiqueta |
|---|---|
mi-web-juegos | v1 |
mi-bd-juegos | v1 |
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.
| Elemento | Instalación original | Segunda instalación |
|---|---|---|
| Contenedor Apache | web-juegos | web-juegos-copia |
| Puerto web Windows | 8080 | 8081 |
| Contenedor MySQL | bd-juegos | bd-juegos-copia |
| Puerto MySQL Windows | 3307 | 3308 |
| Red Docker | juegos-net | juegos-copia-net |
Paso 1. Crear una segunda red
Desde Portainer:
- Accede a Networks.
- Pulsa Add network.
- Nombre:
juegos-copia-net
- Driver:
bridge. - 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:
| Campo | Valor |
|---|---|
| Name | bd-juegos-copia |
| Image | alumnoasir/mi-bd-juegos:v1 |
| Host port | 3308 |
| Container port | 3306 |
| Network | juegos-copia-net |
En Advanced container settings → Env, configura:
| Name | Value |
|---|---|
MYSQL_ROOT_PASSWORD | RootClase2026 |
MYSQL_DATABASE | juegos |
MYSQL_USER | alumno |
MYSQL_PASSWORD | ClaveJuegos2026 |
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:
| Campo | Valor |
|---|---|
| Name | web-juegos-copia |
| Image | alumnoasir/mi-web-juegos:v1 |
| Host port | 8081 |
| Container port | 80 |
| Network | juegos-copia-net |
En Advanced container settings → Env añade:
| Name | Value |
|---|---|
DB_HOST | bd-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:
| Contenedor | Estado esperado |
|---|---|
web-juegos | Running |
bd-juegos | Running |
web-juegos-copia | Running |
bd-juegos-copia | Running |
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.











![[Reto] - Despliegue de servicios con Docker y Docker Compose b2427176-50e6-4af6-ada1-f4903698014f](https://laaventuradeaprender.com/wp-content/uploads/2026/06/b2427176-50e6-4af6-ada1-f4903698014f-150x150.png)




![[Reto] - Dockerizar app JEE (Tomcat 10 + MySQL) 4b9bc3d2-8253-4715-adf6-d5b1eed959d3](https://laaventuradeaprender.com/wp-content/uploads/2026/02/4b9bc3d2-8253-4715-adf6-d5b1eed959d3-150x150.png)