Hombre en bicicleta transportando cajas

Entorno de desarrollo PHP con Docker

Con este post vamos a compartir un entorno de desarrollo para proyectos PHP usando Docker. El objetivo es que podáis ver a Docker como una alternativa a Vagrant para vuestro entorno de desarrollo.

Para ello utilizaremos un repositorio de ejemplo con un proyecto LAMP en Docker -> php-docker.

Introducción

La idea detrás de Docker es crear contenedores ligeros y portables para las aplicaciones software, que puedan ejecutarse en cualquier máquina independientemente del sistema.

Docker usa una arquitectura cliente-servidor. El cliente de Docker se comunica con Docker Engine (servidor), que hace el trabajo de crear, correr y distribuir los contenedores. El cliente puede conectarse con el servidor en el mismo sistema, o en un sistema remoto. Cuando instalamos Docker en una distribución Linux, se instala en la misma máquina un cliente y un servidor, de forma que cuando utilizamos el cliente, por defecto se conecta con el servidor local.

Docker solo funciona en un sistema Linux, debido a que utiliza la tecnología de contenedores del sistema operativo. Pero es posible usarlo en sistemas Mac y Windows mediante el uso de una máquina virtual. Docker proporciona la imagen boot2docker para los sistemas de virtualización más comunes, con la configuración necesaria para poder correr Docker Engine.

En este tutorial vamos a utilizar Docker Machine y Docker Compose, dos proyectos muy útiles que forman parte del ecosistema de Docker. Los explicamos brevemente:

Docker Machine es una herramienta que nos ayuda a crear, configurar y manejar máquinas (virtuales o físicas) con Docker Engine. Permiten crear y configurar Docker Engine en distintos entornos y proveedores, por ejemplo Virtualbox, AWS, VMWare, Digital Ocean, OpenStack, … En este tutorial veremos cómo usar esta herramienta en un sistema Mac con Virtualbox.

Docker Composer es una herramienta para definir y correr aplicaciones multicontenedores. Toda la configuración se define en el fichero docker-composer.yml, que es un archivo en formato yaml en el que se especifican los diferentes contenedores y sus propiedades.

Instalación

Si utilizáis un sistema Linux, al instalar Docker se instala en la misma máquina el Cliente y el Servidor y podéis utilizarlo directamente. Pero si utilizáis Mac o Windows necesitáis instalar el cliente de Docker y en una máquina virtual Linux hay que instalar el servidor. Para simplificar esto, Docker nos ofrece Docker Machine con el que todo esto os resultará mucho más sencillo. 

Vamos a suponer que tenemos un sistema Mac y vamos a levantar nuestro entorno Docker:

Instalar Docker Engine, Docker Machine y Docker Composer

Lo mas sencillo es seguir esta guía (https://docs.docker.com/docker-for-mac/)

Una vez instalado podemos comprobar que todo está correcto:

Instalar Virtualbox

Simplemente seguir el proceso de instalación (https://www.virtualbox.org)

Configurar Docker

Con Docker Machine creamos una máquina virtual con un servidor Docker listo para usar.

Ya tenemos lista una máquina virtual en Virtualbox con boot2docker llamada “default”

¿Cómo conectamos el cliente Docker?

Con la opción env de Docker Machine podemos obtener las variables de entorno que necesita el cliente para conectarse al servidor de la máquina default.

Para que nuestro cliente se conecte con el Docker Engine en la máquina virtual default, simplemente hay que ejecutar el eval que arroja en la última línea:

OJO, esto último deberás realizarlo cada vez que vuelvas a abrir un nuevo shell o reinicies el equipo.

Si probamos el cliente, ya conecta con el servidor

Sincronización de carpetas

Docker Machine cuando crea una máquina Virtualbox, por defecto, comparte la carpeta /Users de la máquina anfitriona con la máquina virtual. 

Para tener un mejor rendimiento en la sincronización de la carpeta compartida, os recomiendo que utilicéis la herramienta Docker Machine NFS (https://github.com/adlogix/docker-machine-nfs). Esta herramienta permite configurar carpetas compartidas en la ubicación que necesitéis con el sistema NFS.

Clonar el proyecto ejemplo PHP-Docker

En este ejemplo hemos utilizado cinco contenedores, uno por cada una de las herramientas que se va a utilizar:

  • Apache 2.4
  • PHP FPM 5.6
  • PHP CLI 5.6, Composer y Symfony installer
  • Mysql 5.6
  • PhpMyadmin

El proyecto tiene el siguiente esquema de directorios:

  • apps: Directorio donde estarán las aplicaciones, cada una en un subdirectorio.
  • apache: Definición de imagen con Apache 2.4
  • apache/conf: Configuración de apache
  • apache/logs: Log de apache
  • apache/conf/vhosts: Ficheros con la definición de los sitios virtuales que se levantaran en Apache.
  • php56/fpm: Definición de imagen con PHP-FPM 5.6
  • php56/fpm/conf: Configuración PHP-FPM 5.6
  • php56/cli: Definición de imagen con PHP-CLI 5.6, Composer y Symfony Installer
  • php56/cli/conf: Configuración PHP-CLI 5.6

Levantar el entorno de desarrollo

Crear imágenes

Ejecutar contenedores

Parar contenedores

Parar máquina virtual

Con esto ya tendríamos el entorno preparado y listo para desarrollar con el 🙂

Para acceder al servidor web, usaremos el puerto 80 y para acceder al PhpMyAdmin el puerto 8080. La IP de acceso es la de la máquina virtual, la podemos averiguar con el comando:

Tips and Tricks

Para terminar os dejo un par de consejos que me resultan muy útiles.

Cómo ejecutar los comandos PHP en consola

Esta es una duda típica cuando trabajamos con Docker. Con el siguiente ejemplo vamos a ejecutar el comando php -v en un contenedor en base a la imagen php56-cli. El contenedor monta un volumen de la carpeta actual $(pwd) en el path «/usr/local/apache2/htdocs»

Para simplificar el uso, lo más cómodo es definir alias en ~/.bashrc:

Solo nos quedaría recargar Bash para que los cambios tengan efecto en el terminal

Ya podemos ejecutar comandos php, composer y symfony:

Comandos para eliminar imágenes y contenedores

Eliminar todos los contenedores

Eliminar todas las imágenes

Esto ha sido todo, ahora os queda probar y trastear con todo lo que hemos visto. Tenéis el código en el repositorio php-docker para que podáis usarlo. Creo que Docker aporta muchas ventajas y hay que darle una oportunidad, espero que este post os sirva de ayuda, hasta la próxima 🙂