Utilizar Docker en proyectos Php, desde el desarrollo hasta el despliegue

carlos compains
Oct 23, 2018 · 4 min read

En esta serie de artículos pretendo exponer como utilizo docker en mis proyectos, comenzando desde los entornos de desarrollo con sus correspondientes dependencias externas (base de datos u otros servicios), entornos de testing con test unitarios, funcionales y generación de documentación, así como el despliegue en entornos de producción.

Por qué Docker.

Durante el proceso de desarrollo de aplicaciones con cierta complejidad uno de los problemas a resolver es el de la gestión de dependencias, pero no solo a nivel aplicación (vendors, bundles o librerías), si no a nivel sistema operativo(mod_rewrite, imagemagick…) o incluso a nivel infraestructura (MySql, Redis, Elasticsearch).

Gestionar esas dependencias en los diferentes pasos del ciclo de desarrollo de la aplicación puede llegar a ser complicado e impactar directamente tanto en los tiempos de desarrollo como en la calidad del resultado.

Una opción muy popular consiste en el virtualizado y orquestado de recursos con Vagrant y Puppet usando herramientas como https://puphpet.com/ para crear la “receta” de una manera sencilla. Cuando probé esta opción es cierto que generar entornos de desarrollo me resultaba sencillo, pero no encontré una forma sencilla de trasladar ese entorno a un entorno de producción el cual, si bien tiene las mismas dependencias, puede estar desplegadas de distinta manera. Además durante ese proceso Docker y Aws Ecs se cruzaron en mi camino desviando mi atención totalmente.

En Docker he encontrado la facilidad para definir entornos que buscaba junto con la flexibilidad necesaria para trasladar esas dependencias a las diferentes situaciones necesarias en el cliclo de desarrollo de una aplicación.

Por un lado se resuelve el desarrollo ya sea en local como en un máquina remota, independientemente del sistema operativo. Usando la maquina virtual de Docker cuando es necesario, independizamos nuestro flujo de trabajo del sistema operativo.

Docker permite generar todas las configuraciones que queramos, con tan solo generar diferentes ficheros (Dockerfile o docker-compose.yaml). Es “fácil” de incorporar a nuestros procesos de integración continua, despliegue continuo o entrega continua.

El soporte por parte de proveedores cloud cada día es mas común:

  • AWS soporta Docker de tres maneras distintas de forma nativa ECS, Kubernetes y Fargate de manera serverless
  • Google con Google Container Engine (GKE)
  • Microsoft Azure con Azure Container Service (AKS)

Si no trabajamos con ninguno de estos proveedores y nos sentimos con fuerzas, podemos desplegar Docker Swarm o Kubernetes por nosotros mismos sobre nuestra infraestructura…

De aquí en adelante me centraré en AWS ECS ya que es el proveedor que utilizo y conozco.

Me gustaría resaltar las ventajas que nos aporta ECS para entornos de producción.

  • Balancear carga a nivel de máquina y a nivel de contenedor. Es decir levantar varias copias de un contenedor con una parte de nuestra aplicación y distribuir las peticiones entre esos contenedores que pueden estar sobre la misma máquina o no.
  • Gestión de tareas programadas en el cluster. Se pueden programar tareas de una manera similar a cron. Cada una de esas tareas ejecutará un comando sobre un contenedor que se levantará ad-hoc. Es una solución que requiere configurar cada tarea de manera individual y que puede ser un poco tediosa, pero a cambio no tenemos que preocuparnos de que las tareas cron no se ejecuten en todos los contenedores.

Docker en la etapa de desarrollo.

Cuando trabajamos solos, el entorno de desarrollo es algo relativamente sencillo. Puede estar en nuestro ordenador de trabajo o en un servidor de desarrollo. Normalmente tendremos una base de datos en la que haremos todas las pruebas e iremos cambiando según necesitemos. Ahora bien, si trabajamos en equipo, el entorno de desarrollo se ha de poder desplegar en diferentes máquinas, o varias veces en la misma máquina.

Ademas, el entorno ha de ser idéntico cada vez que se despliegue y ha de poderse actualizar de forma sencilla, y todo esto independientemente del sistema operativo sobre el que se ejecute.

Crear el entorno de desarrollo

Docker en la etapa de testing

Durante los test unitarios Docker nos asegura (si mantenemos los ficheros de configuración actualizados) que la version de Php sobre la que se ejecutan los tests es la correcta y que es la misma sobre la que hemos programado y sobre la que se ejecutará en producción.

Si hacemos test funcionales, docker nos permite levantar una copia “temporal” de nuestra aplicación, crear la base de datos, poblarla con nuestros datos ejecutando las “fixtures”, levantar un contenedor con Selennium, correr nuestros tests y eliminarlo todo.

Docker en entorno de producción

Llegado el momento de desplegar la aplicación Docker nos da varias opciones. Yo me voy a centrar en dos. docker-compose y Aws Elastic Container Service (ECS).

La primera opción creo que es perfecta para aplicaciones monolíticas en el sentido de que esta todo el stack o gran parte en una sola máquina (por ejemplo este blog).

ECS me parece una gran solución para aplicaciones distribuidas, que tengan varias capas, o una arquitectura de microservicios.

Al utilizar Docker en el despliegue, controlamos las versiones de todas las dependencias, flexibilizamos las dependencias a nivel infraestructura, ya que podemos cambiar lo host de los servicios externos en el momento del inicio del contenedor de una manera sencilla. Esto resulta de gran ayuda en el momento de traducir la configuración que hemos hecho en el fichero docker-compose a la definición de tareas que usaremos para desplegar la aplicación en ECS.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade