En esta cápsula veremos cómo  utilizar Docker para el desarrollo web local: Apache, Mysql, PHP y PhpMyadmin.

Introducción

¿Por qué sigue siendo tan difícil obtener una configuración que funcione, que haga lo que necesita y que coincida con el entorno de despliegue de pruebas, puesta en escena, producción, etc.?

Con esto quiero decir, comenzamos usando las herramientas nativas disponibles en nuestro sistema operativo de elección. Lo más probable es que comencemos con LAMP, MAMP y WAMP.

Una vez que los hayamos exprimido, generalmente avanzamos a las VM de Vagrant y Virtualbox o VMware, después de aprender una (o más) herramientas de aprovisionamiento como Ansible o Puppet.

Hasta ahora, nuestros entornos de desarrollo se han vuelto bastante sofisticados, pero la sobrecarga tanto de la construcción como del mantenimiento también ha aumentado significativamente.

¿No sería fácil si pudiéramos configurarlos, pero con solo una pequeña inversión de tiempo y esfuerzo?

Si se puede, ¿has oído hablar alguna vez de Docker?

Docker es más simple

Esta es la definición de Docker:

“Los contenedores Docker envuelven una pieza de software en un sistema de archivos completo que contiene todo lo que necesita para funcionar: código, tiempo de ejecución, herramientas del sistema, bibliotecas del sistema, cualquier cosa que pueda instalar en un servidor. Esto garantiza que siempre se ejecutará igual, independientemente del entorno en el que se esté ejecutando.”

Ahora puede pensar que todo esto parece similar a LAMP o Vagrant/VirtualBox VM. De alguna manera lo es, pero también requiere muchos menos recursos y tiempo. Docker contiene (y usa) solo lo que necesita para ejecutar su aplicación, nada más, de tal manera que reduce los recursos consumidos significativamente.

No se está construyendo una máquina virtual que consumirá una buena parte de los recursos de su PC. No es necesario aprender configuraciones complejas para construir una configuración básica y funcional. No se necesita hacer mucho para ponerlo en funcionamiento. Docker le permite construir su infraestructura de aplicaciones, como lo haría con su código.

Si necesita cambiar el servidor web o el servidor de la base de datos, cambia el actual por otro. ¿Necesita agregar un servidor de almacenamiento en caché, registro o un servidor de sistema de colas? Agrégalo a la mezcla y continúa, es así de simple.

Suena atractivo, ¿verdad?

Como montar un Entorno de Desarrollo local

Instalando Docker

Para el caso práctico que hemos desarrollado a continuación, se ha usado una distribución Linux, concretamente Ubuntu 16.04, con la siguiente guía se puede instalar

Instalar Docker en Ubuntu

Para instalar en Mac o en Windows, visite el siguiente enlace: https://www.docker.com/community-edition

 

La configuración de Docker.

Muchas de las aplicaciones PHP, se componen de tres partes:

Un servidor web (Nginx o Apache), la librería PHP, y un servidor de base de datos (generalmente MySQL, PostgreSQL o SQLite). En el caso práctico se ha añadido PhpMyAdmin para administrar la base de datos. Se puede visualizar como quedaría en la siguiente imagen:

Docker-compose.yml

El archivo principal que contiene toda es el docker-compose.yml que se encontrará en la raíz del nuestro proyecto. La configuración es la siguiente y explicaremos paso a paso que significa cada cosa.

version: “2”

services:

apache:

build: ./docker_php

ports:

– “8001:80”

volumes:

– ./project:/var/www/html/

links:

– db

networks:

– default

db:

image: mysql

ports:

– “3306:3306”

environment:

MYSQL_DATABASE: myDb

MYSQL_USER: user

MYSQL_PASSWORD: test

MYSQL_ROOT_PASSWORD: test

volumes:

– ./dump:/docker-entrypoint-initdb.d

– persistent:/var/lib/mysql

networks:

– default

phpmyadmin:

image: phpmyadmin/phpmyadmin

links:

– db:db

ports:

– 8000:80

environment:

MYSQL_USER: user

MYSQL_PASSWORD: test

MYSQL_ROOT_PASSWORD: test

volumes:

persistent:

Comencemos con lo primero:

El fichero empieza con la versión del mismo, esto es para que docker-compose sea compatible

En la siguiente tabla vemos la compatibilidad:

Compose archivo formato           Docker Engine

3.6                                         18.02.0+

3.3 – 3.5                              17.06.0+

3.0 – 3.2                              1.13.0+

2.3                                         17.06.0+

2.2                                         1.13.0+

2.1                                         1.12.0+

2.0                                         1.10.0+

1.0                                         1.9.1+

Una vez puesto la versión, entramos ya en los servicios:

El nombre del servicio es a su gusto, en este caso el primer servicio será llamado apache, el segundo db y el tercero phpmyadmin.

En el servicio de apache, hay varias directivas:

apache:

build: ./docker_php

ports:

– “8001:80”

volumes:

– ./project:/var/www/html/

links:

– db

networks:

– default

  1. Build: Es la base para construir el apache con PHP, como no se trata de una imagen de Docker, se hace mediante un archivo de Dockerfile ubicada en el directorio docker_php del proyecto. Aquí se especifica la versión del php y que extensiones se instalarán. El archivo quedaría así
    • FROM php:7.1.2-apache
    • RUN Docker-php-ext-install mysqli
    • Significa que instalamos el php, y luego la extensión mysqli para acceder a la base de datos
  1. Ports: Los puertos usados para acceder a la web
  2. Volumes: Los archivos del proyecto que se compartirán en el apache del contenedor
    • En este caso, los archivos del proyecto mismo estarán en /project para situarlos en /var/www/html del contenedor.
  1. Links: Para conectar este servicio con otro; en este caso es la base de datos (recordamos que el servicio se llama db)
  2. Networks: las redes para unirse, en este caso la opción por defecto

El siguiente servicio que configuramos es el de la base de datos

db:

image: mysql

ports:

– “3306:3306”

environment:

MYSQL_DATABASE: myDb

MYSQL_USER: user

MYSQL_PASSWORD: test

MYSQL_ROOT_PASSWORD: test

volumes:

– persistent:/var/lib/mysql

networks:

– default

  1. Image: Se obtiene la imagen de mysql del repositorio de Docker
  2. Ports: Los puertos usados para que acceda al servicio. Ten en cuenta que si tiene el servicio de mysql instalado y funcionando en su PC, deberá de apagarlo antes de arrancar el servicio
  3. Enviroment: Aquí es dónde se introducen las variables y parámetros de la conexión a la base de datos, en este caso el nombre de la base de datos, el usuario, la contraseña y la contraseña root
  4. Volumes: dónde se queda almacenada la base de datos, donde se tiene que poner una ruta absoluta. El nombre del volumen es a su elección (en este casi se ha puesto persistent)
    • En este caso, Docker creará un volumen en /var/lib/docker/volumes con la base de datos
  5. Networks: las redes para unirse, en este caso la opción por defecto

Y por último como parte opcional, el contenedor de phpmyadmin:

phpmyadmin:

image: phpmyadmin/phpmyadmin

links:

– db:db

ports:

– 8000:80

environment:

MYSQL_USER: user

MYSQL_PASSWORD: test

MYSQL_ROOT_PASSWORD: test

  1. Image: Se obtiene la imagen de phpmyadmin del repositorio de Docker
  2. Links: Para conectar este servicio con otro; en este caso es la base de datos (recordamos que el servicio se llama db)
  3. Ports: Los puertos usados para acceder al phpmyadmin
  4. Enviroment: Aquí es dónde se introducen las variables y parámetros de la conexión a la base de datos, en este caso el usuario, la contraseña y la contraseña root

Y por último y para persistir los volúmenes de Docker:

volumes:

persistent:

En este caso creamos un volumen de llamado “persistent” (que es el nombre del volumen sobre la base de datos) que se guarda como se ha dicho anteriormente en /var/lib/docker/volumes

Una vez explicado paso a paso y entendido el archivo docker-compose.yml ya podemos ejecutar el comando de ejecución.

Para ello, nos situamos con la terminal en la raíz del proyecto donde tengamos el archivo y ejecutamos sudo docker-compose up -d

Este comando sigue las instrucciones de la configuración del archivo. Con el -d lo ejecutamos en segundo plano. Si todo ha salido bien y la configuración está correcta, se descargarán las imágenes necesarias para instalar los servicios requeridos. La primera vez tardará un par de minutos al descargar todas las imágenes.

Aquí comprobamos con el comando introducido los servicios que están en marcha. Como vemos para acceder al apache, basta con introducir la URL con el puerto.

En este caso se ha creado un simple fichero html con hola mundo y el resultado es el siguiente:

Si se quiere acceder al phpMyAdmin, es cambiando el puerto a 8000.

Conclusión

En conclusión, Docker nos ayuda a crear un servidor web listo para programar con todos los componentes necesarios, y válgame la redundancia, sólo los necesarios. Con esto se optimiza los recursos de nuestro PC y poder desplegar cualquier aplicación en PHP para su desarrollo.

Este ha sido un proceso bastante rápido para explicar cómo funciona. Pero se ha cubierto los aspectos básicos necesarios para que comiences. No hemos analizado con profundidad cómo funciona Docker ni hemos ido más allá de lo básico.

Pero tienes suficiente para empezar. En la web oficial de Docker, se pueden ver las numerosas configuraciones que se pueden desplegar con el archivo docker-compose.yml.