Containers, de Victoire Joncheray

A principios de este año escribí una guía sobre cómo usar Docker para desarrollar en WordPress. Se trata de una entrada que ha despertado bastante interés entre todos vosotros. Con ella, sois muchos los que os habéis interesado por Docker y habéis dejado vuestras dudas en la sección de comentarios o incluso me habéis contactado directamente por correo.

Tal y como comenté en esa entrada, Docker es un programa que permite empaquetar software en «contenedores» y ejecutarlos encima de máquinas virtuales. La principal ventaja de Docker es que los contenedores se ejecutan usando el entorno de virtualización que proporciona el sistema operativo anfitrión, con lo que no hay que virtualizar un ordenador entero y tenemos contenedores rápidos y ligeros.

El principal problema que tiene Docker es que no siempre es sencillo configurar la infraestructura de servicios que necesitamos. Por ejemplo, para montar un WordPress, necesitamos levantar (como mínimo) un servicio de base de datos y otro con el servidor web donde se ejecute WordPress.

En la entrada que comentaba al principio vimos una herramienta, Docker Compose, que permite definir todos los servicios/contenedores que queremos levantar para un proyecto determinado. Con Docker Compose, conseguíamos definir en un único fichero docker-compose.yml todas las dependencias de nuestro proyecto y ponerlo en marcha con un único comando.

O eso es lo que en un principio prometía, porque cerré esa entrada explicándote cómo configurar otro servicio Docker adicional que permitiera usar nombres de dominio bonitos en tus instalaciones WordPress. Si te acuerdas, con el fichero docker-compose.yml original podíamos crear un WordPress en una URL local del estilo http://localhost:8080. Pero si queríamos usar algo del estilo http://miplugin.local teníamos que montar un proxy que pudiera resolver nombres de dominio y añadir más configuraciones a nuestro docker-compose.yml

Y os he escuchado alto y claro: aunque la guía explica cómo resolver todo ese follón de servicios y dependencias, sigue siendo complicado (no hay más que ver los comentarios). Así que hoy os traigo la solución definitiva con la que vais a flipar.

Te presento a un nuevo amigo: Lando

Creo que la mejor forma de presentarte a Lando es usando una frase de su documentación:

Lando es una herramienta para desarrolladores que quieren dejar atrás el masoquismo que supone usar directamente docker o docker-compose.

Documentación de Lando

Así que, ya ves, si seguiste con éxito la guía de Docker que publiqué en enero… eres como yo, un masoquista. Pero eso quedó atrás, porque ahora veremos cómo podemos especificar rápidamente y sin complicaciones todos los servicios que necesitamos para trabajar en un nuevo proyecto WordPress.

Instalar Lando en nuestra máquina

Lo primero que deberás hacer para poder usar Lando es, ¡sorpresa!, instalarlo en tu ordenador. El proceso de instalación es extremadamente sencillo y lo tienes muy bien explicado en la documentación oficial, pero podemos resumirlo en los siguientes pasos:

  1. Si estás en Linux, tener instalado Docker Community Edition. Si estás en Mac o Windows, el propio instalador de Lando se encargará de instalarlo si no estuviera ya disponible.
  2. Descargar el instalador adecuado para tu sistema operativo. En mi caso, por ejemplo, como trabajo con Linux basado en Debian, descargué el fichero lando-v3.0.0-rc.22.deb y lo instalé con dpkg. Para Mac, usa el fichero .dmg y, para Windows, el .exe.
  3. Ejecuta el instalador y sigue los pasos.

¡Y ya está!

Nelio A/B Testing

Pruebas A/B nativas en WordPress

Usa tu editor de páginas favorito en WordPress para crear variaciones y lanza pruebas A/B con solo un par de clics. No se necesita saber nada de programación para que funcione.

Cómo crear un nuevo proyecto WordPress en Lando

Lo primero que tenemos que hacer es ir a la carpeta del proyecto con el que queremos trabajar (o crear una nueva para ello). En mi caso, voy a suponer que quiero crear un WordPress para poder desarrollar nuestro plugin Nelio A/B Testing, así que voy a ir a la carpeta donde lo tengo: ~/dev/plugins/nelio-ab-testing.

Una vez dentro de la carpeta de nuestro proyecto tenemos que crear el fichero de configuración de Lando. Este fichero es parecido al de docker-compose.yml, pero muchísimo más simple. Y la mejor parte es que no tenemos que escribirlo de cero, sino que el propio Lando lo genera por nosotros. Simplemente usa lando init para crear un nuevo entorno de desarrollo:

lando init \
  --recipe wordpress
  --source remote
  --remote-url https://wordpress.org/latest.tar.gz
  --webroot wordpress
  --name "Nelio AB Testing" # ponle el nombre que quieras

Veamos punto por punto lo que hace la instrucción anterior:

  • En primer lugar, le indicamos a Lando que queremos crear un nuevo fichero de configuración en el directorio actual con el comando lando init.
  • El primer parámetro que le pasamos (--recipe wordpress) a Lando le indica que queremos crear un proyecto de tipo WordPress, con lo que Lando ya sabe qué servicios tiene que configurar (una base de datos, un servidor web, etc).
  • A continuación le indicamos de dónde tiene que descargarse WordPress. En este caso le indicamos que tiene que descargarlo remotamente de WordPress.org.
  • Con --webroot wordpress le decimos a Lando dónde va a encontrar WordPress, que es la carpeta wordpress que se ha generado al descargar el zip de WordPress.org.
  • Finalmente, especificamos el nombre de nuestro proyecto (a partir del cual creará la URL).

Si está todo bien instalado, verás que después de instalar y configurar todo, Lando te escribe lo siguiente por pantalla:

NOW WE'RE COOKING WITH FIRE!!!
Your app has been initialized!
Go to the directory where your app was initialized and run `lando start` to get rolling.
Check the LOCATION printed below if you are unsure where to go.
Oh... and here are some vitals:
 NAME      my-site                                               
 LOCATION  /tmp/plugin                                           
 RECIPE    wordpress                                             
 DOCS      https://docs.devwithlando.io/tutorials/wordpress.html

con lo que se habrá generado un fichero de configuración llamado .lando.yml con el siguiente contenido:

name: my-site
recipe: wordpress
config:
  webroot: wordpress

Acojonante lo sencillo que es, ¿verdad? Una vez creado, iniciamos nuestro WordPress con un sencillo lando start y listo:

BOOMSHAKALAKA!!!
Your app has started up correctly.
Here are some vitals:
 NAME            my-site                   
 LOCATION        /tmp/plugin               
 SERVICES        appserver, database       
 APPSERVER URLS  https://localhost:32781   
                 http://localhost:32782    
                 http://nelio-ab-testing.lndo.site  
                 https://nelio-ab-testing.lndo.site

Ya tenemos WordPress instalado y funcionando. De hecho, fíjate que incluso ha creado un nombre de dominio bonito para nuestro WordPress: nelio-ab-testing.lndo.site. Si ahora vas a tu navegador y abres la URL en cuestión, verás el instalador de WordPress:

Instalar WordPress en Lando
Instalar WordPress en Lando.

Configurando WordPress

Obviamente puedes acabar de configurar WordPress usando el instalador de la pantalla anterior. Pero existe una solución aún mejor: usar WP-CLI, el cual también tenemos disponible en Lando (cosa que te recomiendo, porque es muchísimo más ágil).

Para instalar WordPress con WP-CLI necesitamos tener creado el fichero wp-config.php en el directorio wordpress. Para crear ese fichero, necesitamos saber dónde está la base de datos, en qué puerto, qué usuario y contraseña debemos usar… y toda esta información la encontramos con un simple lando info, lo cual nos devuelve toda esta información en formato JSON:

[
  {
    service: 'appserver',
    urls: [
      'https://localhost:32781',
      'http://localhost:32782',
      'http://nelio-ab-testing.lndo.site',
      'https://nelio-ab-testing.lndo.site'
    ],
    // ...
  },
  {
    service: 'database',
    // ...
    creds: {
      database: 'wordpress',
      password: 'wordpress',
      user: 'wordpress',
    },
    // ...
  }
]

Gracias a que el resultado está en formato JSON podemos usar un comando especial de Unix llamado jq, el qual nos permite parsear una entrada en JSON y quedarnos con los valores concretos que queramos. Por ejemplo, si queremos saber el usuario de la base de datos:

$ lando info --service database --format json | jq -r ".[0].creds.user"
wordpress

Con lo que podemos montarnos un pequeño script que recoja todos los parámetros que necesitamos para que WP-CLI cree el fichero de configuración:

# Extraer el directorio de WordPress de .lando.yml
WEBROOT=`grep webroot .lando.yml | cut -d: -f2 | xargs`
# Extraer los credenciales de la base de datos
DBNAME=`lando info --service database --format json | jq -r ".[0].creds.database"`
DBUSER=`lando info --service database --format json | jq -r ".[0].creds.user"`
DBPASS=`lando info --service database --format json | jq -r ".[0].creds.password"`
DBHOST=`lando info --service database --format json | jq -r ".[0].hostnames[0]"`
# Crear fichero de configuración de WordPress
lando wp config create \
  --dbname=$DBNAME \
  --dbuser=$DBUSER \
  --dbpass=$DBPASS \
  --dbhost=$DBHOST \
  --path=$WEBROOT

Una vez tenemos el fichero creado, ya podemos lanzar el comando de instalación:

# Sacar el nombre del proyecto del fichero .lando.yml
PROJECT_NAME=`grep name .lando.yml | cut -d: -f2 | xargs`
SITE_NAME=`echo "$PROJECT_NAME" | sed -e "s/-/ /g" | sed "s/\b[a-z]/\u&/g"`
# Coger una URL para WordPress que no sea localhost y que sí use https
URL=`lando info --service appserver --format json | jq -r ".[0].urls" | grep -vw localhost | grep https: | cut -d'"' -f2`
# Ver el dominio que ha creado Lando (básicamente la URL sin el protocolo)
DOMAIN=`echo "$URL" | sed -e "s/^https:\/\///"`
# Instalar WordPress
lando wp core install
 --url=$URL
 --title="$SITE_NAME"
 --admin_user=admin
 --admin_password=password
 --admin_email=admin@$DOMAIN
 --path=$WEBROOT

¡Y, de nuevo, ya está! Ya tenemos instalado WordPress y funcionando.

Cómo meter nuestro proyecto dentro de WordPress

Si ahora accedemos a WordPress y vamos a ver los plugins que tenemos disponibles, veremos que Nelio A/B Testing no está disponible (o, en tu caso, tu proyecto). Para arreglar esto, tenemos que hacer que la carpeta actual sea visible dentro de WordPress, así que añadiremos un link en wordpress/wp-content/plugins/ que apunte al directorio de nuestro proyecto:

cd wordpress/wp-content/plugins/
ln -s ../../../ nelio-ab-testing
cd -

Y, ahora sí, desde el punto de vista de WordPress tenemos el plugin dentro.

Con esta configuración, puedes crear tantos WordPress como proyectos tengas. Si no te gusta esta forma de proceder, puedes crear un único WordPress con Lando en la carpeta que quieras y luego meter tus proyectos dentro de su directorio wordpress/wp-content/plugins/.

Espero que te haya gustado la entrada de hoy y que consiga hacerte la vida un poco más fácil. Yo, desde que uso Lando, ya no he vuelto a tocar Docker.

Imagen destacada de Victoire Joncheray en Unsplash.

2 respuestas a «Cómo usar Lando para desarrollar en WordPress (Docker para todos los públicos)»

  1. Avatar de Andy
    Andy

    Hola! Interesante alternativa. Que ventajas tiene Lando sobre por ejemplo un entorno de desarrollo también en local como es Flywheel?

    1. Avatar de David Aguilera

      Son herramientas parecidas. La principal ventaja de Flywheel es, en mi opinión, que tiene una interfaz de usuario gráfica muy amigable y fácil de usar. Lando funciona en modo consola, lo cual lo hace un poquiiiito más complicado. Pero, como ventajas, es una herramienta que no se limita únicamente a WordPress y puede extenderse/adaptarse de forma relativamente sencilla.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad de Nelio Software

Tus datos personales se almacenarán en SiteGround y serán usados por Nelio Software con el único objetivo de publicar tu comentario aquí. Con el envío de este comentario, nos das el consentimiento expreso para ello. Escríbenos para acceder, rectificar, limitar o eliminar tus datos personales.