Simplificando nuestros entornos de desarrollo con Docker Compose

Rate this post

¿Por qué Docker?

Uno de los pilares que fundamentan el día a día del equipo de desarrollo en acceseo es el uso de Docker, en un artículo anterior ya vimos qué motivos convierten a Docker en una una pieza de tecnología muy atractiva en nuestro ámbito.

En una agencia de desarrollo como la nuestra, se trabajan decenas de proyectos en una semana y poder tener configuradas las dependencias necesarias de cada proyecto sin conflictos con las de otros proyectos es algo indispensable para nosotros. Además, nos permite compartir proyectos de manera ágil, trabajar con ellos de forma cómoda y responder a incidencias con mayor celeridad, sin tener que interferir en el entorno de producción para realizar pruebas o reproducir el problema.

Aunque utilizar Docker nos proporciona ese nivel de aislamiento, su uso resulta un poco arduo ya que tendremos que gestionar cada uno de los contenedores que compone cada proyecto de manera individual y es fácil que acabemos teniendo que gestionar manualmente para cualquier proyecto por sencillo que sea los contenedores de Apache/Nginx, PHP, MariaDB, Mailhog, NodeJS, workers, etc.

Moby logo

¿Cómo automatizamos la gestión de todos los contenedores necesarios para cada proyecto?

Con la herramienta Docker Compose, que construye una capa de abstracción sobre Docker precisamente enfocada a resolver la complejidad que supone que cada proyecto esté formado por varios contenedores. Con un solo comando podremos realizar distintas acciones sobre todos los contenedores del proyecto: build desde Dockerfile, pull de imágenes desde repositorios, gestión de redes, volúmenes, variables de entorno, etc.

Entonces… ¿No usamos Docker en acceseo?

Sí, docker lo reservamos para situaciones en las que queremos lanzar un solo contenedor, por ejemplo si queremos analizar una web con WPScan. En lugar de instalar Ruby en nuestra máquina, la gema de WPScan y mantener las actualizaciones, utilizamos la imagen disponible en Docker Hub. Simplemente tenemos que ejecutar docker run -it –rm wpscanteam/wpscan y automáticamente hará pull de la imagen, creará un contenedor y lo ejecutará. Además en este caso usando el flag –rm nos aseguramos de que una vez acabe la ejecución el contenedor será eliminado.

Pero también lo usamos al utilizar Docker Compose, como comentábamos esta herramienta básicamente lo que hace es gestionar varios contenedores con Docker de manera simultánea bajo la especificación indicada, simplemente se interpone entre Docker y nosotros para simplificarnos el trabajo.

Uso de Docker Compose

Para trabajar con Docker Compose tendremos que crear el fichero de configuración necesario, un fichero habitualmente llamado docker-compose.yml en el que vamos a indicar básicamente qué contenedores queremos que se ejecuten.

Además la flexibilidad de Docker Compose nos permite ejecutar algunos contenedores simplemente obteniendo su imagen desde Docker Hub y otros construidos localmente en base al Dockerfile correspondiente. Desde acceseo, y dependiendo de las necesidades del proyecto, hacemos uso de ambas opciones, tanto de imágenes públicas o propias, como de otras configuradas para el propio proyecto mediante un Dockerfile. Esto es algo que nos permite adaptarnos a las particularidades de cada aplicación y cada cliente de forma ágil y cómoda.

Ejemplo básico de docker-compose.yml para trabajar con Apache y PHP

Vamos a configurar un ejemplo muy básico sobre el que construiremos un ejemplo algo más avanzado, en una misma carpeta tendremos los archivos docker-compose.yml e index.php.

Archivo index.php

Archivo docker-compose.yml Apache y PHP

En esta configuración hay 3 puntos clave a mencionar:

  • Se define un servicio llamado apache.local que ejecuta un contenedor basado en la imagen php:8.1-apache.
  • A este contenedor le configuramos un volumen que comparte los contenidos de la carpeta donde se encuentra el archivo docker-compose.yml en el host con la ruta /var/www/html del contenedor que es la que utiliza Apache como raíz del servidor web.
  • Se bindea el puerto 80 del host con el puerto 80 del contenedor, de forma que desde nuestro navegador podemos acceder al servidor web que expone el contenedor simplemente navegando hasta localhost.

Para ejecutarlo, solo tendremos que lanzar el comando docker-compose up y veremos en el terminal cómo durante la primera ejecución se descarga la imagen correspondiente y crea el contenedor adecuado. Al acceder a través de nuestro navegador tendremos que ver algo similar a la siguiente captura.

Ejemplo PHP docker

Para pararlo solo tendremos que pulsar ctrl+c. Si preferimos que no quede en primer plano en nuestro terminal podemos lanzar el comando con el flag -d y parar la ejecución utilizando docker-compose stop.

Ejemplo LAMP completo y SMTP para desarrollo

Esta configuración nos permite ejecutar una web muy básica pero habitualmente necesitamos al menos un servidor de bases de datos y un servicio de correo para poner en marcha cualquier web así que vamos a añadir estos 2 servicios a nuestra configuración.

Archivo docker-compose.yml para LAMP

En este caso, hemos añadido un contenedor de MariaDB y uno de MailHog, además de configurar la directiva depends_on en el contenedor de Apache y PHP que nos ayuda a establecer el orden en el que se ponen en marcha y paran los contenedores de forma que se respeten las dependencias.

En el contenedor de MariaDB hemos introducido otra de las funcionalidades que nos brinda Docker Compose, pasando una variable de entorno al contenedor podemos definir la contraseña del usuario root, en este caso con el valor root también. Y del contenedor de Mailhog hemos bindeado el puerto 8025 del contenedor al del host para poder acceder a la interfaz tipo webmail que incluye la herramienta.

Con esta configuración ya tenemos los componentes básicos para ejecutar nuestra aplicación LAMP sin instalar ninguno de los paquetes en nuestro sistema operativo, además contamos con un servidor SMTP de desarrollo y podemos ampliar con otro tipo de contenedores como linters o herramientas de análisis estático de las que haya disponible imagen.

Conclusión

Es muy sencillo iniciarse en el uso de Docker y Docker Compose e ir incorporando nuevas funcionalidades a nuestros proyectos según vayan creciendo, en la documentación están definidos todos los parámetros que se pueden configurar, por ejemplo hay otros parámetros potentes como son healthcheck, entrypoint, command o restart.

Además, en el artículo hemos cubierto cómo sería un caso de uso relativamente sencillo, a partir de aquí podemos crear nuestras propias imágenes personalizadas utilizando archivos Dockerfile para activar las extensiones de PHP que nuestra aplicación requiera, por ejemplo. O podemos utilizar imágenes que empaqueten la propia aplicación directamente como la de WordPress.

Comparte
¿Quieres más información?
Ponte en contacto con nosotros.
Picture of Christian Córdoba
Christian Córdoba
Chief Technology Officer (CTO) / Backend developer - Departamento de desarrollo

Enviar Comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Suscríbete a nuestra newsletter
para estar al día en el mundo online
¿Tienes alguna incidencia?

Cuéntanos qué ocurre
y nos pondremos con ello lo antes posible.

    Este sitio está protegido por reCAPTCHA, y la Política de privacidad y Términos de servicio de Google.

    ¡Cuéntanos tus ideas!
    +34 96 653 19 14
    info@acceseo.com

      Este sitio está protegido por reCAPTCHA, y la Política de privacidad y Términos de servicio de Google.