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
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"
./deploy_portal.sh "app-portal:prod_2"
./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.