Blog

Docker y WordPress

Docker y WordPress

Quería cambiar algunos estilos en este blog y he aprovechado para migrar este blog a Docker, sólo para desarrollo de momento. Algunas consideraciones y problemas:

Puertos

  • Probé puerto externo el 80, pero hay que recordar ejecutar docker-compose con sudo (por aquello de los puertos inferiores a 1024). Es la tontería de siempre pero que siempre se me olvida.
  • Para cambiar el dominio y puerto externo (a localhost:8000 habitualmente en desarrollo) hay que cambiar antes en los ajustes de WordPress (Ajustes -> Generales -> Dirección de WordPress (URL) y dirección del sitio(URL). Si queremos que además funcionen los enlaces e imágenes, habrá que hacer un seach & replace en la BDD de WordPress. Se pueden evitar todos estos cambios añadiendo el dominio original a /etc/hosts junto a 127.0.0.1(IPv4) ó ::1(IPv6), y utilizando el puerto original (recordar el punto anterior). Para acceder al servidor de producción hay que recordar revertir esto (y cerrar/abrir el navegador para que pille la IP nueva).
  • Si en el punto anterior hemos olvidado cambiar los ajustes de WordPress, al escribir <dominio>:8000 redirigirá (HTTP 301) a <dominio>:80. Esto es una redirección de WordPress, no de Nginx/Apache (ver header de respuesta X-Redirect-By: WordPress). Cuidado porque esta redirección se queda en la caché del navegador, así que recordar borrarla. Si tenemos duda, siempre se puede abrir una pestaña de incógnito.

BDD

Podemos conectar con un cliente mysql:

[j@localhost my_wordpress]$ mysql -h localhost4 -u wordpress -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> exit
Bye

Cuidado con poner localhost4 ó 127.0.0.1 y no localhost, porque al menos en mi máquina parece que va por IPv6 (::1) y me sale este error:

[j@localhost my_wordpress]$ mysql -h localhost -u wordpress -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Como siempre, podemos restaurar una BDD con:

mysql -h localhost4 -p -u wordpress wordpress < wordpress.sql

XDebug y PhpStorm

Hay un vídeo de JetBrains en YouTube (guía en texto aquí) en el que preparan XDebug con Docker mediante Zero-Configuration Debugging. Funciona, pero me saltaban algunas advertencias:

Sólo ocurría al hacer deploy-compose up. Como se menciona en https://stackoverflow.com/a/35000793, puede ocurrir si hay código PHP ejecutándose en un entorno de línea de comandos. Imagino que es alguna inicialización… el depurador se queda parado en un fichero misterioso «Standard input code«. Buscando en internet, esta cadena de texto aparece en php-src/sapi/cli/php_cli.c, así que efectivamente parece algo relacionado con CLI.

Para evitar estos problemas, he cambiado a la configuración «PHP Remote Debug«. Simplemente especificamos el servidor, puerto, y el idekey, que debe coincidir con xdebug.idekey del servidor.

Paso 1: Definir servidor en PHP/Servers (el dominio lo tengo puesto a 127.0.0.1 en /etc/hosts)
Paso 2: Crear configuración de depuración remota «PHP Remote Debug»
Paso 3: Pulsar botón de depurar (no el del icono del escarabajo+teléfono, el del escarabajo simplemente). Poner puntos de depuración y visitar nuestro WordPress en el navegador. No olvidar poner xdebug.idekey=PHPSTORM (leer más abajo).

Éste es mi docker-compose.yml. Para la imagen de WordPress, he utilizado andreccosta/wordpress-xdebug, que se basa en la oficial de WordPress incluyendo XDebug. De especial relevancia en XDEBUG_CONFIG:

  • El idekey=PHPSTORM. Cuidado porque aquí no se escribe xdebug.idekey=..., sino idekey a secas. Podemos poner más opciones separadas por espacios.
  • remote_host=<MI_IP> (no la de Docker, la de nuestro ordenador). En Mac esto se puede sustituir por host.docker.internal, pero en Linux todavía no está implementado (es muy cutre, pero bueno…).

En el directorio ./www tengo todo lo que en Docker está en /var/www/html. Es el directorio raíz de WordPress (el que contiene wp-admin, wp-content). Otros optan por sólo incluir wp-content, en cuyo caso al iniciar Docker ya se instala lo demás. En cualquier caso, wp-config.php se sobreescribirá con los valores que hayamos puesto en el environment del servicio wordpress:

version: '3.3'
# https://github.com/docker-library/wordpress/issues/6
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     ports:
       - "3306:3306"
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     hostname: www.okaeri.re
     depends_on:
       - db
     image: andreccosta/wordpress-xdebug
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
       # https://stackoverflow.com/a/35000793
       # https://stackoverflow.com/a/47748089
       XDEBUG_CONFIG: "idekey=PHPSTORM remote_host=192.168.1.6 remote_log=/tmp/xdebug.log"
       PHP_IDE_CONFIG: "serverName=www.okaeri.re"

     volumes:
       - ./www:/var/www/html
volumes:
    db_data: {}

Por cierto, el servicio wordpress incluye PHP, Apache y XDebug.

De momento estoy contento con Docker. El docker-compose anterior me arranca en menos de 10 segundos. Mi ordenador es bastante antiguo (salvo un SSD), así que no está nada mal…