Docker es una gran manera de emular un entorno de servidor en vivo. Claro, tú no tienes el mismo hardware, pero puedes tener la misma plataforma de infraestructura como si tuvieras accesos múltiples a una red con PHP-FPM (FastCGI Process Manager), una base de datos, un servidor CDN y así sucesivamente.

Otra razón para preferir el uso de Docker en un desarrollo PHP es que funciona más rápido que Vagrant y necesitas mucho menos recursos que las máquinas virtuales convencionales. Dicho esto, es importante mencionar que también es posible utilizar una instancia de Docker en Vagrant.

¿Cuál es la típica pila de un servidor web con PHP?

Una pila típica de servidor web PHP contiene Nginx, PHP-FPM y una base de datos MySQL como MariaDB.

¿Cuánto tiempo necesitas para configurar un sistema de este tipo?

Aproximadamente 20 líneas de código de configuración, Docker y unos pocos minutos. ¿Genial, no?

¿Tienes curiosidad?

En «prooph software» (empresa alemana orientada a proveer aplicaciones de software empresariales basadas en la Web) hemos probado algunas imágenes de Docker para desarrollo que se ajustan a una pila de servidor web y tenemos una aplicación de ejemplo fresca que utiliza una pila de servicios web PHP y algunas otras características interesantes como CQRS (Command Query Responsability Segregation) que es un estilo de arquitectura en la red que consiste el desarrollo de ambientes en los que se tienen dos subsistemas diferenciados, uno responsable de los comandos, y otro responsable de las consultas.

Si no tienes instalado y optimizado Docker, echa un vistazo a cómo utilizar Docker con OverlayFS en Ubuntu.

Aquí está la configuración de YAML de Docker en Composer para configurar el servidor PHP con Nginx, PHP-FPM y MariaDB. Guarda esta configuración en un directorio vacío o en un proyecto de ejemplo con el nombre docker-compose.yml

OJO, ¡si destruyes el contenedor, los datos de la base de este ejemplo se perderán!

nginx:
image: prooph/nginx:www
ports:
        – “8080:80”
        – “443:443”
        – “10081:10081”
        – “10082:10082”
links:
        – php:php
volumes_from:
        – dataphp
php:
image: prooph/php:7.0-fpm
links:
        – mariadb:mariadb
volumes_from:
        – dataphp
dataphp:
image: debian:jessie
volumes:
        – .:/var/www
mariadb:
image: mariadb
ports:
        – 3306:3306
environment:
        – MYSQL_ROOT_PASSWORD=dev
        – MYSQL_USER=dev
        – MYSQL_PASSWORD=dev
        – MYSQL_DATABASE=proophessor

El VirtualHOST Nginx está configurado para la carpeta “Public”.

Crea un archivo index.php si aún no existe con: <? Php echo? ‘Hello World!’;

Ahora inicia los contenedores de Docker con: docker-compose up -d

y abre el navegador en: http://localhost:8080

Nginx está configurado con HTTP/2 y SSL. Comprueba esto en: https://localhost

USA UN CONTENEDOR DE BASE DE DATOS

Para evitar perder los datos de tu base cuando destruyas el contenedor necesitas un contenedor de base de datos en Docker para alojarla.

La imágen del volumen de Docker MariaDB está definida en: /var/lib/mysql
por lo que puedes montar un contenedor de datos Docker en este lugar.

Tu no querrás que tus datos estén disponibles en tu contenedor PHP de Docker. Es necesario cambiar las rutas de montaje del contenedor de datos PHP de Docker usando una lista de carpetas necesarias para el servidor web. Ese es un ejercicio que te lo dejamos a ti.

¿QUÉ HAY ACERCA DE LA DEPURACIÓN DE PHP?

Con Docker tu eres libre de cambiar el entorno en cuestión de segundos.
Si deseas utilizar Xdebug, sólo tienes que cambiar la línea 15 con:
prooph/5,6-php-FPM-Xdebug y reconstruir la pila del servidor con:
docker-compose stop && docker-compose rm -f && docker-compose up -d

Ahora puedes depurar la aplicación. Asegúrate de que el IDE está escuchando el puerto 10000, porque el puerto 9000 es utilizado por PHP-FPM.

Si necesitas ayuda, por favor revisa el artículo en inglés sobre la depuración remota de PHP.

¿Necesitas PHP Profiler? No hay problema, cambia la línea 2 con: prooph/nginx:zray
y la línea 15 con: prooph/php:5,6-FPM-zray para utilizar perfiles de Zend Z-Ray.

Tienes que configurar la URL de Zend Z-Ray. Es la razón por la que los puertos 10081 y 10082 están expuestos en el ejemplo anterior.

¿No sabes qué perfiles PHP debes utilizar?

Aquí encontrarás más información sobre PHP Profiler Z-Ray, Blackfire y Tideways.

LAS MEJORES PRÁCTICAS PARA PRODUCCIÓN

Respondiendo algunas preguntas sobre cómo utilizar contenedores PHP Docker en un ambiente de producción.

Pues bien; pon tu código fuente PHP en la imagen PHP de Docker.

Tus Registros Log deberían ser guardados como «stdout» es decir con «la salida estándar» o puedes usar otro controlador de Registros Log en Docker(en inglés).

Las imágenes de producto o contenido generado por el usuario se deben montar en el contenedor, puedes utilizar un CDN u otro plugin para Docker como «Flocker» para soportar más de un servidor.

No necesitarás Ansible, Puppet o Chef. La configuración de las credenciales de la base de datos deberá ser definida en las variables de entorno. Esto es muy bueno, porque así la imagen de Docker con la versión de tu código fuente se ejecutará tanto en producción, como en pruebas y en desarrollo, sin cambiar la configuración. No más comprobaciones de entorno o switches para tu aplicación.

Es muy fácil implementar una nueva versión. Monta el contenedor nuevo y detén el contenedor anterior.

Cambiar de nuevo a la versión anterior también es fácil. No tienes que hacer mantenimiento de tu sistema host de servidor, si utilizas un proveedor de alojamiento para Docker. Basta con que crees una nueva imagen y la envíes.

La imagen Nginx no sabe nada de tu aplicación PHP. El montaje de los datos de PHP al contenedor Nginx en el ejemplo anterior se usa para los elementos CSS, JS e imágenes de la aplicación. Así que es más fácil para comenzar, pero no es obligatorio, especialmente cuando se utiliza un CDN.

CONCLUSIÓN

Con Docker es muy fácil construir una infraestructura de desarrollo como un entorno de producción.

También puedes anular las imágenes de producción de Docker con un entorno de desarrollo extendido en el que se esté ejecutando un PHP profiler como los que vimos en el enlace de los perfiles mencionado antes.

Y por último pero no menos importante, puedes comprobar cómo funciona tu aplicación en escala con menos recursos que en cualquiera de las máquinas virtuales.