Tips, Soluciones y Novedades en Tecnología

27/08/2023

Despliegue versionado con Docker Compose


Cuando tenemos ambientes productivos en el cual utilizamos Docker para gestionar nuestras aplicaciones, es mucho mas práctico ya que no tenemos que preocuparnos de las configuraciones y versión de cada software que desplegamos debido a que cada contenedor internamente esta preparado para funcionar sin realizar configuración extra por parte de los administradores de servidores o sysadmin.


Los despliegues en producción requieren una trazabilidad, muy importante para poder hacer rollback ante cualquier incidencia nueva que genere algún error o por cualquier otro motivo, por ello es necesario implementar mecanismos de versionamiento de las imágenes.

Una de las recomendaciones es versionar las imágenes cada vez que se envían a producción, por ejemplo si tenemos una imagen con el siguiente nombre: app-portal, podemos versionar de la siguiente manera.

- app-portal:prod_1

- app-portal:prod_2

- app-portal:prod_3

- app-portal:prod_4

Lógicamente esas imágenes requiere un repositorio como Docker Registry, GitLab Registry u otro proveedor para almacenar imágenes Docker.

Una vez que nuestro repositorio tenga las imágenes versionados, necesitamos scripts que nos permita ejecutar contenedor con versiones especificas.


Tenemos 3 versiones de un servidor NGINX el cual se encuentra con el siguiente nombre: app-portal, y se encuentra en local con el siguiente contenido, modificaremos el texto y generaremos una versión hasta tener las 3 versiones distintas.



Una vez accesible las versiones de imágenes podremos ver un resultado como la siguiente:

 - docker images


Ahora lo que debemos hacer es un archivo docker-compose que permita desplegar un contenedor recibiento el nombre del contenedor con la versión indicada.

version: "3.9"
services:
 app-portal:
    container_name: app-portal
    image: ${CONTAINER_PORTAL_VERSION}
    ports:
     - 80:80
    restart: always
    network_mode: bridge

Como podemos observar, la variable: CONTAINER_PORTAL_VERSION, debemos pasarle para que docker-compose pueda remplazar con el valor proporcionado en el script.

Ahora generamos un script deploy_portal.sh para ejecutar docker-compose.

#!/bin/bash
echo "------- Detenemos el contenedor -----"

CONTAINER_PORTAL_VERSION="$1" docker-compose -f portal/docker-compose.yaml down
echo "Iniciamos la nueva version" CONTAINER_PORTAL_VERSION="$1" docker-compose -f portal/docker-compose.yaml up -d echo "contenedor desplegado"


Para ejecutar el script es necesario aplicar permiso de ejecución y ejecutar el archivo de la siguiente forma.

./deploy_portal.sh "app-portal:prod_1"

Ahora ejecutamos el siguiente comando

./deploy_portal.sh "app-portal:prod_2"

Y por ultimo la versión 3.

./deploy_portal.sh "app-portal:prod_3"



Como podemos ver, de esta forma podemos gestionar las versiones de los contenedores utilizando docker-compose, con eso nos aseguramos que cada vez que ejecutamos un nuevo contenedor en entorno de producción siempre tendremos la versión que se pasa como parámetro.


Este procedimiento se puede utilizar para automatizar en entornos DevOps facilitando el despliegue y manejando las versiones eficientemente, debido a que en caso se requiera hacer un rollback, solo se deben pasar al script la imagen y la versión anterior al ultimo pase, esto se puede hacer de forma manual o automatizada.

Saludos.