Docker Compose

Bueno, la verdad es que con lo que hicimos hasta ahora en el taller vimos que puede volverse un poco engorroso. Imaginen lo que hicieron recién... a escala. Estaría bueno tener una forma de automatizar todo este proceso... ¿no? Alguna forma de poner en un solo documento todos los parámetros que vayas a necesitar y que este documento sea legible y versionable, ayudándonos a evitar errores y a garantizar que nuestros deploys puedan ser repetidos y que el resultado sea consistente.

Para esto, surgió como primer alternativa, Docker Compose. Para aplicaciones más complejas (pensando ya a nivel de datacenters que requieran la administración de miles de containers) entran los container orchestration tools como Docker Swarm o Kubernetes. Si bien no vamos a hablar de esto en este taller, está bueno que ya tengan una idea acerca de estas tecnologías.

Docker Compose es una herramienta para definir y ejecutar aplicaciones multi-container. Con un simple archivo YAML (Yet Another Markup Language), ejecutado por un único comando, indicamos cómo crear y cómo ejecutar nuestras aplicaciones. Nota al margen, YAML es sensible a los espacios.

Docker Compose es muy útil para entornos de development, testing y staging (todavía de prueba pero equivalente a un entorno de producción).

Bueno, manos a la obra con el último ejercicio. Vamos a crear nuestro primer docker-compose.yaml.

# Creamos un directorio
$ mkdir my_wordpress
$ cd my_wordpress

# Creamos un YAML
$ vi docker-compose.yaml

De nuevo, usamos vim/vi porque es el que tenemos disponible siempre, pero pueden usar el que quieran.

version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: 1234
       MYSQL_DATABASE: wordpressdb
       MYSQL_USER: vkmc
       MYSQL_PASSWORD: 1234

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8080:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: 1234
volumes:
    db_data:

En el yaml vemos diferentes secciones.

La primera que vemos, es la sección de services. Ahí vamos a declarar nuestros containers. En el ejemplo definimos nuestro container db, con la imagen que vamos a usar y la configuración de variables de entorno que hicimos anteriormente (password para la base de datos, una base de datos inicial, y más). Luego definimos nuestro container wordpress, también con la imagen que vamos a usar y sus variables de entorno. Entre lo que mencioné también vemos otras configuraciones: para la db estamos configurando un volumen de Docker y para wordpress estamos definiendo el redireccionamiento de puertos.

En el caso del volumen de Docker, esto es necesario porque los containers no tienen estado y no tienen almacenamiento propio. La forma de persistir los datos almacenados en la base de datos es asignando un volumen de Docker. Lo que hacemos con la sentencia db_data:/var/lib/mysql es decir que vamos a tener un volumen de Docker llamado "db_data" y que ese volumen va a ser montado en el directorio /var/lib/mysql de nuestro container. Entonces, todos los datos que allí se guarden van a estar disponibles en nuestro volumen.

En el caso del redireccionamiento de puertos, como hicimos anteriormente, especificamos el puerto destino y el puerto origen usando el formato destino:origen. De esa manera hacemos que nuestro wordpress escuche en el puerto 8080.

Finalmente les resalto la opción "restart" que está presente en la definición de ambos containers. Esto le indica a Docker que de existir alguna falla en la ejecución de estos containers, se reinicien automáticamente. Para la mayoría de los casos esto es lo más habitual y recomendado, ustedes pueden configurarlo como quieran.

La segunda sección que vemos es la sección de volumes. Allí definiremos todos nuestros volúmenes de Docker con las opciones que nosotros querramos. En este caso, la opción más simple es crear un volumen especificando el nombre, db_data, sin parámetros.

Ahora lo que nos resta es ejecutar este docker-compose.yaml. Lo hacemos usando docker-compose up -d como se muestra a continuación.

# Ejecutamos Docker Compose
$ docker-compose up -d

# Eliminamos nuestro entorno
$ docker-compose down
$ docker-compose down --volumes

Para limpiar nuestro entorno, basta con ejecutar docker-compose down.

¡Éxito! Logramos desplegar nuestra aplicación web usando Docker Compose.

results matching ""

    No results matching ""