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 a127.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 respuestaX-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.



É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 escribexdebug.idekey=...,
sinoidekey
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…