MySQL + phpMyAdmin con Docker Compose

  • Desplegar MySQL y phpMyAdmin con docker compose
  • Usar volumen para persistencia
  • Verificar conexión y datos
  • Practicar variables de entorno, puertos y reinicios

1) Estructura del proyecto

Crea una carpeta de práctica:

mkdir mysql-pma-compose
cd mysql-pma-compose

2) Crear el archivo docker-compose.yml

Crea el fichero:


# Define los servicios (contenedores) que vamos a ejecutar
services:

  # ----- SERVICIO MYSQL -----
  mysql:
    image: mysql:8.0              # Imagen oficial que se descargará de Docker Hub
    container_name: mysql1        # Nombre fijo del contenedor (opcional, pero útil)
    restart: unless-stopped       # Reinicia el contenedor automáticamente salvo que lo pares tú

    # Variables de entorno que usa la imagen de MySQL en su primer arranque
    environment:
      MYSQL_ROOT_PASSWORD: "RootPass_123!"   # Contraseña del usuario root
      MYSQL_DATABASE: "academia"             # Base de datos que se crea automáticamente
      MYSQL_USER: "alumno"                   # Usuario adicional que se creará
      MYSQL_PASSWORD: "AlumnoPass_123!"      # Contraseña del usuario alumno

    # Volúmenes → permiten persistencia (los datos sobreviven aunque borres el contenedor)
    volumes:
      - mysql_data:/var/lib/mysql   # Guarda los datos reales de MySQL fuera del contenedor

    # Conecta el contenedor a una red Docker interna
    networks:
      - red-bbdd


  # ----- SERVICIO PHPMYADMIN -----
  phpmyadmin:
    image: phpmyadmin:latest        # Imagen oficial de phpMyAdmin
    container_name: pma1
    restart: unless-stopped

    # Indica que MySQL debe arrancar antes (solo orden, no espera a que esté listo)
    depends_on:
      - mysql

    # Variables que indican a phpMyAdmin a qué servidor MySQL conectarse
    environment:
      PMA_HOST: "mysql"   # Nombre del servicio MySQL dentro de la red Docker
      PMA_PORT: 3306      # Puerto interno de MySQL

    # Publica puertos → expone el servicio al exterior
    ports:
      - "8080:80"         # Puerto HOST:PUERTO_CONTENEDOR → http://localhost:8080

    # Conecta phpMyAdmin a la misma red que MySQL para que puedan verse
    networks:
      - red-bbdd


# ----- DEFINICIÓN DE VOLÚMENES -----
volumes:
  mysql_data:   # Volumen gestionado por Docker (no es carpeta local visible normalmente)


# ----- DEFINICIÓN DE REDES -----
networks:
  red-bbdd:     # Red interna donde los contenedores se comunican por nombre (DNS interno)

Qué está pasando aquí (muy importante)

  • services: dos contenedores, uno para MySQL y otro para phpMyAdmin.
  • volumes: mysql_data guarda la base de datos fuera del contenedor (persistencia).
  • networks: red privada para que phpmyadmin pueda acceder a mysql por nombre.
  • depends_on: arranca primero MySQL (ojo: no garantiza “ready”, solo orden de arranque).

3) Levantar los contenedores

docker compose up -d

Verifica:

docker compose ps
docker compose logs mysql --tail 30
docker compose logs phpmyadmin --tail 30

4) Acceder a phpMyAdmin

Abre en el navegador:

  • http://localhost:8080

Credenciales:

  • Usuario: root (o alumno)
  • Password: RootPass_123! (o AlumnoPass_123!)

Comprueba:

  • Existe la BD academia

5) Crear tabla de prueba (verificación)

Opción A: desde phpMyAdmin (SQL)
Ejecuta:

USE academia;
CREATE TABLE prueba (
  id INT PRIMARY KEY AUTO_INCREMENT,
  texto VARCHAR(50)
);
INSERT INTO prueba (texto) VALUES ("hola compose");
SELECT * FROM prueba;

Opción B: desde terminal (dentro del contenedor)

docker compose exec mysql mysql -u root -p



Comandos útiles para alumnos

docker compose ps
docker compose logs -f
docker compose exec mysql bash
docker compose exec phpmyadmin bash
docker compose down
docker compose down -v