WordPress en Docker (CLI/DockerFile/Compose)

Montando Wordpres desde la terminal (CLI)


1) Requisitos previos

1.1 Verificar Docker instalado

docker --versiondocker ps

Si docker ps da error de permisos, añade tu usuario al grupo docker:

sudo usermod -aG docker $USER
newgrp docker
docker ps

2) Crear la red para comunicar contenedores

Vamos a crear una red llamada wp-net. Esto permite que WordPress encuentre a MySQL por nombre de contenedor.

docker network create wp-net
docker network ls

3) Crear volúmenes para persistencia

Necesitamos guardar:

  • Datos de MySQL (bases de datos)
  • Archivos de WordPress (plugins, temas, subidas)
docker volume create wp-db
docker volume create wp-html
docker volume ls

4) Levantar la base de datos (MySQL)

4.1 Ejecutar MySQL con variables de entorno

Crea un contenedor llamado wp-mysql:

docker run -d \
  --name wp-mysql \
  --network wp-net \
  -v wp-db:/var/lib/mysql \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=wp-pass-123 \
  -e MYSQL_ROOT_PASSWORD=root-pass-123 \
  mysql:8.0

4.2 Comprobar que está vivo

docker ps
docker logs wp-mysql --tail 30

Si ves mensajes de “ready for connections” (o similar), perfecto.


5) Levantar WordPress

5.1 Ejecutar WordPress apuntando a la DB

Creamos el contenedor wp-web y lo publicamos en el puerto 8080:

docker run -d \
  --name wp-web \
  --network wp-net \
  -p 8080:80 \
  -v wp-html:/var/www/html \
  -e WORDPRESS_DB_HOST=wp-mysql:3306 \
  -e WORDPRESS_DB_NAME=wordpress \
  -e WORDPRESS_DB_USER=wpuser \
  -e WORDPRESS_DB_PASSWORD=wp-pass-123 \
  wordpress:latest

5.2 Verificar logs

docker logs wp-web --tail 30

6) Acceso por navegador y asistente de instalación

Abre:

  • http://localhost:8080

Completa el instalador:

  • Idioma
  • Título del sitio
  • Usuario admin
  • Password
  • Email

7) Verificación técnica (para alumnos curiosos)

7.1 Ver la red y quién está conectado

docker network inspect wp-net

7.2 Ver volúmenes y dónde se usan

docker inspect wp-mysql | grep -i mount -n
docker inspect wp-web   | grep -i mount -n

8) Parar, arrancar y reiniciar (operaciones típicas)

8.1 Parar todo

docker stop wp-web wp-mysql

8.2 Arrancar todo

docker start wp-mysql wp-web

8.3 Reiniciar WordPress

docker restart wp-web

9) Limpieza (sin perder datos)

Si borras contenedores, los datos siguen porque están en volúmenes.

9.1 Borrar contenedores

docker rm-f wp-web wp-mysql

9.2 Volver a crearlos usando los mismos volúmenes

Repite los docker run de los pasos 4 y 5 y verás que todo sigue.


10) Limpieza total (borrado completo)

⚠️ Esto elimina la web y la base de datos.

docker rm -f wp-web wp-mysql 2>/dev/null
docker volume rm wp-db wp-html 2>/dev/null
docker network rm wp-net 2>/dev/null

Anexo A: Diagnóstico de fallos típicos

A1) WordPress no conecta con MySQL

  1. Ver logs de WordPress:
docker logs wp-web --tail80
  1. Ver logs de MySQL:
docker logs wp-mysql --tail80
  1. Asegúrate de que WORDPRESS_DB_HOST=wp-mysql:3306 y que ambos están en wp-net.

A2) Puerto 8080 ocupado

Cambia el puerto:

docker rm -f wp-web
docker run -d \
  --name wp-web \
  --network wp-net \
  -p 8081:80 \
  -v wp-html:/var/www/html \
  -e WORDPRESS_DB_HOST=wp-mysql:3306 \
  -e WORDPRESS_DB_NAME=wordpress \
  -e WORDPRESS_DB_USER=wpuser \
  -e WORDPRESS_DB_PASSWORD=wp-pass-123 \
  wordpress:latest

Y entra a http://localhost:8081.


A3) “Access denied” en MySQL

Suele ser contraseña/usuario mal puestos. Revisa variables. Si ya creaste la base con datos erróneos, recuerda que MySQL guarda usuarios en el volumen: o corriges dentro, o borras volumen (Anexo 10).

Montando Wordpres usando DokerFile

los Dockerfiles listos para hacer docker build directamente (sin Compose) y luego docker run.

Te dejo estructura + archivos y los comandos exactos.

wp-docker-build/
├─ mysql/
│  └─ Dockerfile
└─ wordpress/
   └─ Dockerfile

mysql/Dockerfile (build directo)

Este Dockerfile crea una imagen de MySQL “lista”, y el usuario/DB/contraseñas las seguirás pasando en el docker run (porque eso es configuración de despliegue, no de imagen).

FROM mysql:8.0

# Opcional: configuración extra (descomenta si la necesitas)
# COPY my.cnf /etc/mysql/conf.d/my.cnf

EXPOSE 3306

Nota: MySQL oficial ya trae su entrypoint; aquí no necesitas más si vas a usar variables en docker run.

wordpress/Dockerfile (build directo)

Imagen WordPress basada en la oficial. Si quieres meter ajustes PHP, te lo dejo ya incluido sin depender de un archivo externo (para que sea “build directo” de verdad).

FROM wordpress:latest

# Ajustes PHP típicos (subidas, memoria, tiempo)
RUN set -eux; \
  { \
    echo "upload_max_filesize = 64M"; \
    echo "post_max_size = 64M"; \
    echo "memory_limit = 256M"; \
    echo "max_execution_time = 120"; \
  } > /usr/local/etc/php/conf.d/zzz-custom.ini

EXPOSE 80

Builds

Desde la carpeta wp-docker-build/:

docker build -t wp-mysql:local ./mysql
docker build -t wp-web:local ./wordpress

Run (igual que tu artículo, sin Compose)

Red + volúmenes

docker network create wp-net
docker volume create wp-db
docker volume create wp-html

MySQL

docker run -d \
--name wp-mysql \
--network wp-net \
-v wp-db:/var/lib/mysql \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wp-pass-123 \
-e MYSQL_ROOT_PASSWORD=root-pass-123 \
wp-mysql:local

WordPress

docker run -d \
--name wp-web \
--network wp-net \
-p 8080:80 \
-v wp-html:/var/www/html \
-e WORDPRESS_DB_HOST=wp-mysql:3306 \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=wp-pass-123 \
wp-web:local

Verificación rápida

docker ps
docker logs wp-mysql --tail 30
docker logs wp-web --tail 30

Y navega a:

  • http://localhost:8080

Montando Wordpres con Docker Compose

un docker-compose.yml (WordPress + MySQL) bien comentado para alumnos, con red y volúmenes, y usando las imágenes oficiales (lo más limpio para clase).

docker-compose.yml

version: "3.9"

services:
  db:
    image: mysql:8.0
    container_name: wp-mysql
    restart: unless-stopped

    # Variables de entorno que MySQL usa para inicializar la BD
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wp-pass-123
      MYSQL_ROOT_PASSWORD: root-pass-123

    # Volumen para que la base de datos NO se pierda al borrar el contenedor
    volumes:
      - wp-db:/var/lib/mysql

    # Conectamos el servicio a una red privada de Docker
    networks:
      - wp-net

  wordpress:
    image: wordpress:latest
    container_name: wp-web
    restart: unless-stopped

    # Mapeo de puertos: HOST:CONTENEDOR
    # En el navegador: http://localhost:8080
    ports:
      - "8080:80"

    # Variables de entorno para que WordPress sepa cómo conectar con MySQL
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wp-pass-123

    # Volumen para que WordPress (wp-content, plugins, uploads…) se mantenga
    volumes:
      - wp-html:/var/www/html

    # Dependencia: arranca db antes (no garantiza “lista”, pero sí orden)
    depends_on:
      - db

    networks:
      - wp-net

# Definimos volúmenes "named" (persisten aunque pares/borras contenedores)
volumes:
  wp-db:
  wp-html:

# Red interna para que los contenedores se vean por nombre (db, wordpress)
networks:
  wp-net:
    driver: bridge

Ahora

docker compose up -d
docker compose ps
docker compose logs -f

Parar y limpiar (sin borrar volúmenes)

docker compose down

Borrar TODO incluyendo datos (cuidado)

docker compose down -v