Saltar al contenido

Entorno LAMP con Dockers

Docker-Container-With-Ubuntu

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

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Comentarios (3)

Hola, muy bueno tu artículo sobre dockers. Yo estoy empezando y no consigo un tema, si me pudieras echar un cable te lo agradecería un montón. Resulta que necesito dos contenedores dockers corriendo al mismo tiempo en el mismo host con apache. Entonces, para acceder desde fuera por el navegador, entiendo que por el puerto 80 solo podría acceder a un contenedor, en el otro tendría que asignarle otro puerto a apache no? Es que no me mola nada que accedan como dominio:8080. Pero claro no se si existe otra manera.
Muchas gracias.
Un saludo.

Responder

Hola,
Para que docker redirija el tráfico a un contenedor necesita saber cómo se mapean los puertos. Si tu tienes un contenedor docker con el puerto 80 expuesto, todo el tráfico que entre al host por el puerto 80 se redirigirá a ese docker… Por lo tanto, no puedes tener dos docker con el mismo puerto expuesto, como tampoco puedes tener dos aplicaciones usando el mismo puerto. Si quieres que se acceda siempre por el mismo puerto, pero distinto dominio, una solución que es tener un apache en el puerto 80 que redirija el tráfico, según el dominio,, a los apaches / tomcat que haya detraś con el tag . Pero como puedes ver, tanto la problemática como las posibles soluciones son independientemente de que uses docker o no…
Espero que te haya servido,
Un saludo

Responder

muy buen tutorial felicidades

Responder