Aplicaciones multicontenedor con Docker Compose

Publicado por pico.dev el , actualizado el .
blog-stack gnu-linux planeta-codigo planeta-linux
Comentarios

Continuando la serie de artículos sobre Docker, otra de las herramientas disponibles en el ecosistema y que nos facilitará enormemente el administrar aplicaciones compuestas por varios contenedores relacionados entre sí es Docker Compose. Definiendo en un archivo los contenedores que forman parte de una aplicación podemos iniciarlos, pararlos, eliminarlos o ver su estado como si de una unidad se tratara.

Docker

Una vez que ya sabemos que nos puede proporcionar una de las herramientas de la que más se está hablando con la introducción a docker, conocemos como empezar a usar docker y sabemos cómo crear nuestras propias imágenes de docker para los propósitos específicos que necesitemos nos resultará interesante algunas de las nuevas herramientas que proporciona docker. El ecosistema de docker ya no solo se compone del entorno de ejecución de los contenedores, explicadas de forma básica son:

  • Docker: el sistema de contenedores (runtime, imágenes, …).
  • Docker Hub: el repositorio de imágenes que las diferentes herramientas de forma oficial o a través de usuarios construyen y comparten imágenes que cualquiera puede usar.
  • Docker Compose: permite describir un conjunto de contenedores que se relacionan entre ellos.
  • Docker Machine: permite construir máquinas virtuales para alojar contenedores. Similar a lo que hace Vagrant, al igual que el anterior también permite construir máquinas que ejecuten contenedores con VirtualBox o diferentes sistemas de computación en en la nube como Amazon EC2, Digital Ocean u otros. Docker Machine puede ser la forma de usar docker en Windows o Mac OS hasta que funcione de forma nativa como en GNU/Linux.
  • Docker Swarm: permite construir un cluster de máquinas al que se puede enviar contenedores docker para su ejecución.

Continuando la serie de artículos sobre docker que escribí hace unos meses escribiré sobre cada una de estas nuevas herramientas, empezando en este artículo con Docker Compose en el que explicaré de qué forma nos puede servir, como instalarlo y el descriptor de contenedores con un ejemplo.

Introducción a Docker Compose

Las aplicaciones basadas en microservicios se prestan a usar múltiples contenedores cada uno con un servicio, uno puede contener la base de datos postgresql, otro una base de datos clave/valor redis o de documentos como elasticsearch para hacer búsquedas, otro un sistema de mensajería como rabbitmq, otro tomcat o wildfly que use los anteriores y un servidor web como Nginx. Teniendo múltiples contenedores usar el comando docker run para cada uno de ellos nos resultará incómodo. En este punto entra Docker Compose permitiéndonos definir nuestra aplicación multicontenedor en un archivo con las mismas propiedades que indicaríamos con el comando docker run individualmente. Con un único comando podremos iniciar todos los contenedores y en el orden que los especifiquemos.

El archivo descriptor nos puede servir no solo como forma de iniciar los contenedores en un entorno de desarrollo sino como de documentación de la aplicación en la que veremos qué contenedores, imágenes, volúmenes, enlaces y demás propiedades tienen.

Instalar Docker Compose

Tenemos varias formas de instalar Docker Compose. La que más me gusta y la que recomiendo por ser sencilla es descargar el binario de docker compose según nuestra plataforma GNU/Linux o Mac. Descargando el binario de Docker Compose deberemos darle permisos de ejecución y si nos interesa colocarlo en la variable de entorno PATH del sistema:

Con el siguiente comando veremos que Docker Compose funciona correctamente y la versión del mismo.

El descriptor de contenedores

El descriptor de los contenedores a usar con Docker Compose es un archivo de texto con formato yaml en la que especificamos los diferentes contenedores y sus propiedades, básicamente podemos indicar las mismas propiedades que indicamos arrancando los contenedores individualmente con el comando docker run. En el siguiente ejemplo vemos varios contenedores, dos contenedores de datos para redis y postgresql, los contenedores de redis y postgresql y un contenedor para la aplicación usando tomcat enlazado con los contenedores de redis y postgresql definidos previamente.

La imagen de los contenedores se indica con la propiedad image, los contenedores de datos, redisdb y posgresqldb, usan la propiedad volumes con los datos que guardarán y la imagen de busybox (se suele usar esta para los contenedores de datos porque es muy pequeña), con la propiedad hostname podemos indicar el nombre de la máquina que al usar la propiedad link docker hará visible al contenedor que los usen, con volumes_from podemos usar volúmenes, con links enlazar contenedores y con ports asociar puertos entre los contenedores y la propia máquina anfitrión, en el ejemplo he usado los puertos por defecto de cada uno de los servicios.

La descripción completa del formato del archivo de Docker Compose nos da una idea de las opciones que podemos usar, está bastante bien explicado y con ejemplos que nos resultará sencillo entender conociendo los parámetros que usamos con docker run.

Iniciar los contenedores con Docker Compose

Escrito el archivo de los contenedores y llamándolo docker-compose.yml podemos iniciar los contenedores con el comando docker-compose up estando en el mismo directorio de trabajo donde esté ubicado del archivo yml (y previamente habiendo iniciado el servicio de docker). Con docker-compose ps podremos ver el estado de los contenedores y de cuales está compuesta la aplicación. Con la opción –help podemos ver la lista completa de comandos que podemos usar.

Docker Compose

docker-compose inicia los contenedores en el orden que hemos indicado en el archivo de definición, las trazas emitidas de los servicios de los contenedores aparecerán en la terminal si iniciamos los contenedores en primer plano y con Ctrl+C se pararán los contenedores. Indicando la opción -d los contenedores se iniciarán en segundo plano, con docker-compose stop podremos pararlos, con docker-compose restart reiniciarlos, docker-compose rm para eliminar completamente los contenedores y con docker-compose logs veremos las trazas emitidas por los servicios que nos serán de utilizar si iniciamos los contenedores en segundo plano.

Comandos básicos de Docker Compose

En las siguientes semanas publicaré más artículos sobre esta serie de Docker comentando Docker Hub, Docker Machine y explicaré de qué forma nos pueden ser útiles estas otras herramientas.