#1 Batalla de gallos: Vagrant vs Docker

Desde hace un tiempo a aquí, Vagrant ha sido la solución por defecto para crear entornos de desarrollo que pueden ser fácilmente configurados independientemente de nuestra maquina y compartidos entre el resto del equipo de desarrollo. Existen muchísimos beneficios al utilizar maquinas virtuales frente a tener que instalar todo el software de desarrollo, librerías, dependencias y servidores en nuestra máquina. Los siguientes son un ejemplo de lo que podemos hacer:

  • Construir snippets de código totalmente independiente de la maquina en la que estemos trabajando.
  • Los snippets de código pueden ser compartidos y reproducidos automáticamente con facilidad.
  • Podemos parar y arrancar maquinas virtuales a nuestro antojo.
  • Hostear entornos se convierte en algo efímero y podemos destruir aquellos sitios que no se utilizan ya.
  • Ahorramos tiempo en configuración y ganamos en desarrollo.

Esto ha sido así durante los últimos años, sin embargo, tenemos un chico nuevo en el bloque, un competidor que ha ido ganando terreno poco a poco.

Docker es el chico nuevo y también corre maquinas virtuales pero trabaja de una manera fundamentalmente distinta. En este post quiero hacer una breve explicación sobre cuales son las diferencias entre Vagrant y Docker y sobre cómo instalar WordPress en cada uno de estos.

Si nunca has oído hablar de Vagrant, Docker, máquinas virtuales y entornos de desarrollo te recomiendo que le eches un vistazo a este post en el que hablo sobre Vagrant 😉

Comparación en grandes rasgos de Vagrant y Docker

Para empezar, Vagrant utiliza una arquitectura mucho mas sencilla que la de Docker. Usa maquinas virtuales para correr los entornos independientemente de la maquina anfitrión. Esto se hace utilizando lo que se llama virtualización mediante programas como VirtualBox o VMWare. Cada entorno utiliza su propia maquina virtual y es configurada mediante un fichero que se llama Vagrantfile. Este fichero le dice a Vagrant como tiene que configurar la maquina virtual y que scripts va a necesitar correr junto con su orden de ejecución en el momento de aprovisionar la maquina.

La contrapartida de este enfoque es que cada maquina virtual que creemos contiene no solo el código fuente que estamos desarrollando junto a sus librerías y dependencias sino que además contiene todo un sistema operativo huésped incrementando así en varias Gigas el tamaño de la máquina.

Docker sin embargo utiliza lo que se conoce como contenedores que alojan tu aplicación y todas sus dependencias pero que comparte el kernel (el sistema operativo) con el resto de contenedores.

Estos contenedores se ejecutan como procesos aislados en el sistema operativo anfitrión, pero no están vinculados a ninguna infraestructura especifica. Lo bueno de este enfoque es que los contenedores pueden correr en cualquier ordenador.

¿Cuál es la conclusión de todo esto?

  • Vagrant es mas fácil de entender y es mas sencillo de configurar y poner en marcha. Lo malo es que puede consumir muchos recursos en términos a memoria RAM y almacenamiento.
  • La arquitectura de Docker en cambio es mas compleja de entender y su configuración puede volverse una tortura pero es mucho mas rápido y consume mucha menos CPU y RAM utilizando a su vez menos almacenamiento que Vagrant.
Infografía Docker vs Vagrant
Infografía Docker vs Vagrant

Cómo configurar Vagrant

Una de las mejores cosas sobre ambos sistemas es el ecosistema que se ha creado a su alrededor. Debido al hecho de que los entornos de desarrollo se crean fácilmente con scripts, los desarrolladores de estos scripts los están compartiendo creando así repositorios donde podemos encontrar miles de Vagrant boxes y Docker images diferentes que podemos usar libremente en nuestros proyectos.

Para aprender a configurar Vagrant vamos a utilizar una box de Vagrant que se llama Varying Vagrant Vagrants (VVV) la cual tiene una configuración muy típica para el desarrollo en/de Wordpress.

Antes de empezar necesitarás tener instalado VirtualBox y Vagrant.

Existen varios plugins para configurar Vagrant que VVV recomienda tener instalado:

  • vagrant-hostsupdater: automáticamente actualiza tu fichero de hosts para poder acceder desde el navegador a las maquinas aprovisionadas.
  • vagrant-triggers: permite configurar Vagranta para que dispare scripts cuando utilizamos comandos como vagrant halt o vagrant destroy. Un ejemplo de trigger podría ser el realizar copias de seguridad de la base de datos.

Si ya tienes todos los prerrequisitos instalados vamos a clonar el repositorio de VVV:

$ git clone git://github.com/Varying-Vagrant-Vagrants/VVV.git vagrant-local

Una vez se haya clonado nos dirigimos al directorio para levantar la maquina.

$ cd vagrant-local && vagrant up

Prepárate un café y espera porque el aprovisionamiento de la maquina suele tardar un poquillo… Piensa que necesita descargar todos los ficheros requeridos y configurar el sistema operativo para que podamos empezar a utilizarlo.

Una vez que haya terminado el proceso deberías ser capaz de poder acceder a http://local.wordpress.dev y ver un WordPress nuevo. Personalmente te recomiendo que te leas el README.md de VVV para saber mas sobre cómo configurar y usar sitios en Varying Vagrant Vagrants.

Cómo configurar Docker

Para empezar a configurar Docker y trabajar con el lo primero que necesitas tener instalado es Docker Toolbox que te provee con no solo el cliente de Docker sino que incluso nos trae Docker Machine y Docker Compose, que te ayuda a especificar múltiples configuraciones de contenedores con un solo fichero.

Una vez lo hayas instalado, la primer cosa que tienes que hacer es configurar Docker a través de una de sus maquinaa virtuales. Docker la utiliza para correr el Docker Engine que se encarga de administrar y controlar cualquier contenedor que quieras correr. Para ello vamos a crear una maquina virtual en VirtualBox llamada “docker-vm”.

$ docker-machine create --driver virtualbox docker-vm

Una vez la maquina se haya creado ya podemos comprobar los detalles de la misma ejecutando:

$ docker-machine env docker-vm

Y deberíamos obtener una salida parecida a la siguiente:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/Users/gilbitron/.docker/machine/machines/docker-vm"
export DOCKER_MACHINE_NAME="docker-vm"
# Run this command to configure your shell:
# eval "$(docker-machine env docker-vm)"

Si te has fijado bien, te habrás dado cuenta de que son las variables de entorno del cliente de Docker que utiliza para poder comunicarse con Docker Engine, así que vamos a hacer lo que nos dice y corramos el siguiente comando…

# eval "$(docker-machine env docker-vm)"

Persistiendo la configuración

Cada vez que abras una nueva sesión necesitas volver a correr este comando ya que sus configuraciones no persisten. Para guardar estas configuraciones te recomiendo que añadas el comando al fichero ~/.bashrc de tu sistema. El fichero bash se ejecuta automáticamente cada vez que se inicia sesión en el equipo.

Por fin somos capaces de empezar a crear contenedores de Docker. Una cosa importante a señalar es que Docker corre un proceso por cada contenedor. Esto significa que técnicamente si estamos corriendo una configuración de LAMP (Apache, Mysql y PHP-FPM) todos y cada uno de ellos deberán ser ejecutados en sus propios contenedores.

Esto sin embargo, es solo un ejemplo de guía y en la gran parte de los casos nos será conveniente agrupar procesos en contenedores, por ejemplo, Apache y PHP podrían correr en un contenedor y Mysql en otro diferente.

Afortunadamente existen imágenes oficiales de Docker para el desarrollo en/de WordPress como por ejemplo esta.

El enfoque que vamos a utilizar es precisamente ese, configurar Docker para correr WordPress (incluye Apache y PHP) en un contenedor y Mysql en otro contenedor diferente.

Creando nuestros contenedores

Para crear el contenedor Mysql ejecutamos lo siguiente:

$ docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -d mysql:5.7

Podemos echar un vistazo a la documentación de Docker para ver qué es lo que hace cada uno de estos parámetros aunque aquí tienes un pequeño resumen:

  • Con el parámetro –name le estamos dando un nombre a nuestro contenedor, ¿obvio no? Si no lo especificamos se generará un nombre aleatorio.
  • Con el parámetro -e estamos especificando variables de entorno que serán usada por el contenedor. Esta es una forma muy habitual de pasar información al contenedor.
  • Le indicamos al contenedor que se ejecute en modo detached.
  • Finalmente especificamos la imagen del sistema operativo que queremos utilizar con el parámetro image:version. Si esa imagen no existe localmente, Docker la descargará.

Ahora vamos a crear el contenedor para WordPress:

 $ docker run --name wordpress -e WORDPRESS_DB_PASSWORD=password -v "$PWD/":/var/www/html --link wordpressdb:mysql -p 80:80 -d wordpress

Hay dos cosas que hemos utilizado para este contenedor y que no hicimos para el contenedor de la base de datos:

  • Hemos especificado un volumen para mapear nuestro directorio de trabajo contra el directorio /var/www/html de nuestro contenedor utilizando para ello el parámetro -v. Mapeando el directorio podremos editar los ficheros de WordPress.
  • Añadiendo el parámetro –link hemos linkado el contenedor a nuestro contenedor wordpressdb anterior y le hemos dado el alias de mysql. Esto le permite al contenedor de WordPress conectarse contra el contenedor de la base de datos.
  • Hemos configurado el puerto en nuestra maquina virtual.

Podemos comprobar el estado de nuestros contenedores corriendo el siguiente comando:

$ docker ps

Pues ya está, ya serás capaz de visitar la dirección IP de tu maquina de Docker en el navegador y ver la pantalla de instalación de WordPress. Para saber la dirección IP de tu Docker puedes ejecutar el comando:

$ docker-machine env docker-vm

Un buen punto sería añadir un nombre a la IP en tu fichero de hosts para no tener que estar tecleando la dirección IP todo el tiempo.

Bonus: utilizar Docker Compose

Correr comandos tal y como lo hicimos un poquito mas atrás puede ser un coñazo y ademas estar fácilmente expuesto al típico “error humano”. Para ello Docker Compose puede echarnos una mano permitiéndonos utilizar un solo fichero en el que definimos toda la estructura del entorno de desarrollo y luego solo lo ejecutamos con un solo comando, algo así a como trabajan los Vagrantfiles.

Vamos a crear el fichero al que llamaremos docker-compose.yml

wordpress:
  image: wordpress
  environment:
    - WORDPRESS_DB_PASSWORD=password
  ports:
    - "80:80"
  volumes:
    - ./:/var/www/html
  links:
    - wordpressdb:mysql

wordpressdb:
  image: mysql:5.7
  environment:
    - MYSQL_ROOT_PASSWORD=password
    - MYSQL_DATABASE=wordpress

Si te fijas en el fichero, hemos replicado los comandos que hemos utilizado pero en formato yml. Ahora, para correrlo necesitamos ejecutar lo siguiente:

$ docker-compose up -d

En conclusión, ¿cuál es mejor?

Al igual que con el resto de cosas de la vida, no siempre existe un “bueno” y un “malo”, un “correcto” y un “incorrecto”, un “mejor” y un “peor”. Todo depende de cuales son tus necesidades y de cómo lo vas a utilizar así de con cuál te sientes mas cómodo. Personalmente he intentado configurarme un entorno de desarrollo con Docker pero me di cuenta de que era demasiado dificil para las necesidades del desarrollo que estaba haciendo en ese momento. De momento estoy contento con Vagrant ya que es fácil y funciona bastante bien pero estaré atento a ver como madura Docker y ver si lo acabo metiendo en alguno de mis desarrollos 😉

Hala a mamarla!

Anuncios

Hacer un vhost en un Nginx sobre Vagrant

Qué pasa chumachos? Tenéis ganas de aprender a hacer un vhost sobre servidores Nginx? Si? Pues allá vamos.

Hoy os vengo con otro post técnico. En este artículo veremos cómo hacer un vhost en un servidor Nginx montado sobre un Vagrant. Toma ya menudo jaleo de palabras xD. Si las conoces y no estas con cara de WTF continúa leyendo.

Lo primero que necesitaremos será tener instalado Vagrant. Pero para el que no lo sepa, vamos a ver qué es Vagrant y qué dice su documentación oficial:

Create and configure lightweight, reproducible, and portable development environments.

O dicho de otro modo, con Vagrant montaremos una máquina virtual en la que tendremos instalado un servidor web (Nginx), PHP, Mysql y el resto de software que nos haga falta.

Para instalar Vagrant solo nos tenemos que venir a la página de descargas y seleccionar el paquete que necesitemos para nuestros sistemas operativos. En mi caso elegí el paquete para arquitecturas de 64 bits con Debian. Esto te descarga un .deb con el que instalar Vagrant de forma super sencilla mediante el Gestor de Software de Linux.

Siguiente paso, instalar VirtualBox, pero…

¿qué es VirtualBox?

Pues VirtualBox es el software que vamos a utilizar para montar esa máquina virtual en la que desplegar el entorno de desarrollo. También hay otro software para la creación de máquinas virtuales como por ejemplo Vmware, pero para hacerlo funcionar bien sin problemas con Vagrant usaremos VirtualBox.

Para descargar VirtualBox os tenéis que venir a la página de descargas y buscar el binario que necesitéis o que os pida vuestro ordenador por eso que es muy importante que conozcáis la arquitectura que tengáis.

Una vez que ya tengáis instalado VirtualBox y Vagrant instalado os podéis clonar esta vagrant-box que ya viene preparada para desarrollar plugins y temas para WordPress. Este es el software que trae la máquina:

  • Ubuntu 14.04 LTS (Trusty Tahr)
  • WordPress Develop
  • WordPress Stable
  • WordPress Trunk
  • WP-CLI (master branch)
  • nginx (mainline version)
  • mysql 5.5.x
  • php-fpm 7.0.x
  • memcached
  • PHP memcache extension
  • PHP xdebug extension
  • PHP imagick extension
  • PHPUnit
  • ack-grep
  • git
  • subversion
  • ngrep
  • dos2unix
  • Composer
  • phpMemcachedAdmin
  • phpMyAdmin (multi-language)
  • Opcache Status
  • Webgrind
  • NodeJs
  • grunt-cli
  • Mailcatcher

Con esta máquina solo te tienes que preocupar de levantarla y liarte a programar. Fin.

Trabajar con Vagrant

Comando para hacer un vhost en una box de Vagrant

Pues venga, vamos a levantar la máquina y configuramos todo, con vagrant up hacemos precisamente eso. Mientras esperas a que se levante la máquina y se inicialice todo puedes irte a preparar un café porque esto tarda un ratito…

Una vez haya acabado nos vamos a conectar a la máquina mediante ssh. Vagrant mola porque tiene un comando para hacerlo, no deja de actuar como un alias asi que guay, Vagrant ssh. Ea, ya está.

Comando para conectarse a una box de Vagrant

Dentro de la máquina podemos navegar por el árbol de directorios y hacer cualquier cosa que hagamos en nuestro ordenador normal. Tenemos que saber que el directorio del servidor web está en /srv/www/ y allí es donde vamos a crear la carpeta para guardar nuestro proyecto. Ejecutamos:

mkdir /srv/www/gorkamu

La configuración para hacer el virtual host de nuestro proyecto “gorkamu” tenemos que ponerla en /etc/nginx/custom-sites/default.conf 

Este es un ejemplo de una configuración típica de un virtual host pensada para desarrollar para WordPress.


##########################################################
# Custom wordpress configuration
#
# These server configurations are to:
# - local.gorkamu.dev
#
################################################################
server {
    listen 80;
    listen 443 ssl;
    server_name local.gorkamu.dev *.local.gorkamu.dev ~^local.gorkamu.d+.d+.d+.d+.xip.io$;
    root /srv/www/gorkamu;
    include /etc/nginx/nginx-wp-common.conf;
}

Hala! Pues ya lo tenemos. Reiniciamos el servidor nginx con cualquiera de los siguientes comandos:

# /etc/init.d/nginx restart
# /etc/init.d/nginx reload
# service nginx restart
# service nginx reload
# nginx -s reload
# /path/to/full/nginx -s reload
# /usr/local/nginx/sbin/nginx -s reload

Si queréis saber cuales son las diferencias de utilizar un servidor Nginx o un Apache echadle un ojo a este link. muy interesante 😉

Hala, que os den!

Vagrant, PHPStorm y el nuevo hype de los entornos

Imagina que tienes a tu disposición una herramienta que te monta entornos de desarrollo y en la que no tienes que configurar nada. Imagina que te olvidas de instalar un Apache, un Mysql y PHP en tu ordenador cada vez que formateas. Imagina que ya no tienes que escribir más buildfiles y que puedes desplegar haciendo click en un botón. Imagina que tienes diferentes sistemas operativos y tecnologías instaladas a golpe de comando. Imagina que trabajas en equipo y todos usais el mismo entorno, el “pues a mi no me funciona” dejaría de existir. Imagina…

Parezco John Lennon copón, pero todo esto que te estas imaginando existe en forma de herramienta. Si alguna vez has sufrido lo anterior se te estará haciendo el culo pepsicola tan solo con imaginar. Hablo de Vagrant.

¿Qué es Vagrant?

Logo de Vagrant
Logo de Vagrant

Pues no es nada más y nada menos que una herramienta que cada vez están utilizando más empresas de software y que sirve para virtualizar entornos de desarrollo de una manera super rápida mediante ficheros de configuración. Estos entornos están configurados para que puedan ser usados con los servicios más populares de virtualización como VirtualBox, VMWare o AWS. Según su página web:

Create and configure lightweight, reproducible, and portable development environments.

El corazón de cada instancia es un ficherito que se llama Vagrantfile en el que defines la configuración mínima de la máquina, el sistema operativo y las herramientas que vamos a necesitar.

Una de las grandes ventajas del uso de Vagrant es su integración con herramientas de suministro como Chef y Puppet las cuales se basan en la creación de recetas o scripts que permiten alterar la configuración, instalar de software y mucho más durante el proceso de levantamiento del ambiente.

¿Cómo empiezo?

Para comenzar a utilizar Vagrant vas a necesitar un software de virtualización. Yo soy muy fan de VirtualBox así que el ejemplo irá por ahí, pero vamos, como hemos dicho más arriba, Vagrant no esta sujeto a un solo software. Para instalar VirtualBox escribimos lo siguiente en una terminal.

sudo apt-get install virtualbox-qt

Una vez haya terminado la instalación nos dirigimos a la página web de descarga de Vagrant y seleccionamos nuestro sistema operativo y arquitectura. En mi caso he elegido Linux de 32 bits, esto hará que se nos descargue un paquete .deb que podemos instalar con el gestor de software de Linux.

El proceso de instalación agregará la variable de entorno vagrant a nuestro PATH para que podamos utilizarlo por comandos y para probar que todo ha ido bien que mejor que mirar la versión instalada.

vagrant -v

Configurando Vagrant en PHPStorm

Una Box es la imagen base de una instancia de máquina virtual en la que ya viene preconfigurado todo lo que podamos necesitar, concepto básico en Vagrant. Actualmente ya hay cientos de Boxes predefinidas por lo que tan solo tendrás que buscarla en este listado e instalarla.

Empezando a configurar Vagrant en PHPStorm
Empezando a configurar Vagrant en PHPStorm

Para configurar Vagrant en PHPStorm tenemos que dirigirnos a Settings > Project Settings > Vagrant y se nos abrirá una ventana en la que tenemos que poner la ruta al ejecutable de Vagrant primero y después el directorio en el que estará alojada nuestra instancia. Si lo dejamos en blanco se entiende que se instalará en el directorio del proyecto.

Haciendo click en el botón de Añadir podemos definir nuestra primera box de Vagrant, por defecto PHPStorm nos proveerá con una Ubuntu Lucid Lynx de 32 bits, que no esta nada mal para comenzar, pero podemos definir cualquier otra box tan solo añadiendo su url.

Ubuntu Lucid Lynx por defecto
Ubuntu Lucid Lynx por defecto

Para iniciar Vagrant tendremos que hacer click en Tools > Vagrant > Init in Project Root. Esto creará nuestro VagrantFile, el fichero de configuración que tendrá los detalles de la máquina virtual como por ejemplo la configuración de la IP Virtual, el mapeo de puertos o la memoria a asignar entre otros…

Inicializando nuestro entorno virtual
Inicializando nuestro entorno virtual

Por último, si queremos levantar nuestra instancia de máquina virtual tenemos dos formas de hacerlo, o teclear lo siguiente en la terminal

vagrant up

o hacer click en Tools > Vagrant > Up.

Arrancando nuestro entorno virtual
Arrancando nuestro entorno virtual

Con esto ya tendremos nuestro entorno virtual levantado pero estará pelado. Posteriormente tendrás que instalar todo aquello que necesites como por ejemplo un servidor y una base de datos, a no ser que encuentres una box que incluya todo esto y mucho mas.

Si escribes en una terminal

vagrant ssh

podrás acceder por ssh al entorno recién creado para ir instalando a mano todos los programas o copiar tu proyecto mediante scp, aunque existen otras maneras de hacer un deploy.

Por otro lado, hay varios servicios como PuPHPet que se encargan, mediante una GUI, de generarte un Vagrantfile con todos los programas que puedas llegar a necesitar, es muy intuitivo, tan solo tienes que ir haciendo click en lo que te interese y dejar que el asistente te vaya guiando por cada uno de los pasos.

Para comenzar con Vagrant, esta primera aproximación no esta nada mal. Dejo para más adelante la creación de boxes personalizadas con PuPHPet y el deploy en entornos de desarrollo virtuales.

¡Hasta que volvamos a olernos!