Docker nos permite levantar máquinas virtuales en linux sin el coste de un sistema operativo por cada máquina. Por ello, sin gastar apenas más recursos que el programa que queramos ejecutar tenemos un entorno aislado y escalable con el que podemos probar distintas configuraciones y recrear el contenedor en segundos.
Últimamente estoy probando distintas configuraciones y haciendo pequeñas aplicaciones en entornos lamp y he buscado opciones para usar el potencial de docker:
Xampp no tiene contenedor oficial de docker, pero preguntan si estás interesado en ello. Seguramente lo sacarán en algún momento.
Buscando contenedores no oficiales, he visto algunos que se basan en la distro de ubuntu y a la que le instalan apache y mysql. El sobrecoste es el espacio de la imagen (aunque es muy ligera igualmente) y el tiempo de creación del contenedor.
Crear un contenedor a partir de la imagen oficial de php. Me he decantado esta opción porque es lo más oficial y ligero. Vamos explicar esta opción.
Php tiene un contenedor oficial que, además, da la opción de que venga con Apache instalado. Mysql tiene también un contenedor oficial y, por tanto, con esta combinación tenemos los dos contenedores para jugar con las bases de datos o las configuraciones de php de una forma oficial.
Para ello y teniendo docker instalado, primero debemos lanzar el docker de mysql:
# docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=mytestpwd -d -p 4306:3306 mysql:5.7.18
Hemos dotado un nombre representativo al contenedor docker para poder identificarlo y para enlazarlo posteriormente. Además, como variable de entorno hemos indicado el password y hemos mapeado e puerto 4306 al puerto 3306 del contenedor mysql. Esto último nos permite poder acceder desde fuera (mysql workbench, por ejemplo) al mysql del contenedor docker a través del puerto 4306.
A continuación, lanzamos el docker oficial de php con Apache:
# docker run --name "phpapache" -p 80:80 -v /home/usuario1/mihtml:/var/www/html/ -d --link mysql-test:mysqldocker php:7.0-apache
-Hemos dotado de un nombre representativo phpapache pero no es necesario.
-Hemos mapeado el puerto 80 de fuera del docker al 80 de dentro. (Como internamente tiene un expose, esto no es necesario, pero si quisieramos tener varios apaches corriendo y acceder desde el navegador, tendríamos que redireccionar distintos puertos de fuera al 80 del docker).
-Hemos hecho que el directorio mihtml, donde tendremos nuestros ficheros (html, php…) se vincule al directorio interno del docker en el que apache buscará. De esta forma, es más fácil editar ficheros ya que se puede usar cualquier editor y no es necesario entrar en el propio contenedor. Además, los ficheros son persistentes por lo que no habría que preocuparse al matar el contenedor.
-Hemos hecho un vínculo para que, cada vez que en el contenedor phpapache se trate de buscar mysqldocker encontrará el contenedor mysql-test. (Se puede probar que funciona el vínculo entrando en el contendor phpapache (docker exec -it phpapache bash) y haciendo un ping a mysqldocker
¡Y ya está! Dos comandos y tenemos un entorno lamp, ligero, escalable y oficial.
Bonus: si queremos habilitar módulos de php, como el mysqli, el docker oficial de php nos proporciona una herramienta muy sencilla:
Entramos en el docker con:
docker exec -it phpapache bash
Instalamos el módulo con:
docker-php-ext-install mysqli
Reiniciamos el docker de apache:
docker restart phpapache