Tips, Soluciones y Novedades en Tecnología

Mostrando entradas con la etiqueta Docker. Mostrar todas las entradas
Mostrando entradas con la etiqueta Docker. Mostrar todas las entradas

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.


11/06/2023

Desplegar SQL Server 2017 en contenedores Docker


En versiones anteriores a SQL Server 2017, normalmente se solía correr  SQL Server en servidores dedicados o en maquinas virtuales, pero ante la creciente incremento de la contenerización, eso se convierte en una necesidad empresarial, entonces Microsoft entendió y preparó para poder correr Instancias SQL Server en contenedores docker, para ello hay varios formas de desplegar, en este Post veremos como desplegar de forma fácil.



Descargar la imagen SQL Server 2017

docker pull mcr.microsoft.com/mssql/server:2017-latest

Una vez descargado la imagen, necesitamos completar algunos parámetros para desplegar.


docker run -d -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=SQL3032$" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest

Las variables ACCEPT_EULA, es para aceptar el término de la licencia, y MSSQL_SA_PASSWORD es para asignar la contraseña al usuario por defecto "sa", con ello ya podremos tener SQL Server 2017 en ejecución.

Ejecutamos "docker ps" para ver el contenedor en ejecución.



Ahora abriremos SQL Management Studio para conectarnos a la base de datos en ejecución.





Como se puede ver, se puede crear las bases de datos que consideremos necesarias, pero recordar que en cuanto eliminemos el contenedor también se eliminarán las bases de datos creados, por lo que ahora configuraremos un volumen para que SQL Server almacene los datos fuera del contenedor y que cuando se elimine el contenedor no se pierdan los datos previamente configurados.

Para mantener los datos en un directorio externo al contenedor, debemos configurar de la siguiente forma:

Ejemplo en Linux

docker run -d \
-e "ACCEPT_EULA=Y" \
-e "MSSQL_SA_PASSWORD=SQL3032$" \
-e "MSSQL_PID=Express" \
-p 1433:1433 \
-v /opt/sql_server_2017/data:/var/opt/mssql/data \
-v /opt/sql_server_2017/log:/var/opt/mssql/log \
-v /opt/sql_server_2017/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2017-latest

Ejemplo en Windows

docker run -d -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=SQL3032$" -e "MSSQL_PID=Express" -p 1433:1433 -v C:\sql_server_2017/data:/var/opt/mssql/data -v C:\sql_server_2017/log:/var/opt/mssql/log -v C:\sql_server_2017/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2017-latest


Las variables que le pasamos son:
ACCEPT_EULA: Aceptación de término de licencia
MSSQL_SA_PASSWORD: Contraseña del usuario sa
MSSQL_PID: Versión de SQL Server, si no ponemos este versión por defecto nos levanta la versión Developer. estas son valores que se puede configurar:

Developer: Esto ejecutará el contenedor usando Developer Edition (este es el valor predeterminado si no se proporciona una variable de entorno MSSQL_PID)
Express: Esto ejecutará el contenedor usando Express Edition
Estándar: Esto ejecutará el contenedor usando la Edición Estándar
Enterprise: Esto ejecutará el contenedor usando Enterprise Edition
EnterpriseCore: Esto ejecutará el contenedor utilizando Enterprise Edition Core

Una vez ejecutado el comando docker, si hacemos "docker ps" veremos los siguiente:



Como la ejecución lo estamos realizando en windows, vemos el contenido de la carpeta asignado como volumen:



Creamos 3 bases de datos:



Ahora vemos si se encuentra en la carpeta "data":


Como se puede ver, los datos y configuraciones de SQL Server, lo guarda en una carpeta externa al contenedor que al momento de iniciar el contenedor se les pasó como parámetro.

Esto es recomendable usar en entornos de producción, donde si por alguna razón tenemos alguna falla en el contenedor, los datos no se pierdan y podremos iniciar otra instancia en un nuevo contenedor y podremos ver los datos nuevamente.


Adicionalmente si queremos habilitar el Agente para los Backups programados, debemos hacerlo mediante un archivo Dockerfile, para ello, creamos un archivo Dockerfile con el siguiente contenido:

FROM mcr.microsoft.com/mssql/server:2017-latest
USER root
RUN /opt/mssql/bin/mssql-conf set sqlagent.enabled true

Ejecutamos el comando:

docker build -t mssql-server:2017-latest .



Ahora ejecutamos, la versión Developer, por que en la versión Express, no se puede habilitar la característica del agente de SQL Server.

Ejecutamos el siguiente comando:

docker run -d -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=SQL3032$" -e "MSSQL_PID=Developer" -p 1433:1433 -v C:\sql_server_2017/data:/var/opt/mssql/data -v C:\sql_server_2017/log:/var/opt/mssql/log -v C:\sql_server_2017/secrets:/var/opt/mssql/secrets -d mssql-server:2017-latest


Y nuevamente nos conectamos:


Como se puede ver, se tiene habilitado el SQL Server Agent.

Es relativamente práctico trabajar con contenedores, esto puede facilitar al desarrollador a que pueda crear su base de datos sin necesidad de requerir un ambiente extra y para los administradores, tener múltiples instancias en múltiples versiones en un mismo servidor.

Saludos.



05/06/2023

Escalamiento horizontal en Docker


El despliegue de las aplicaciones en contenedores docker es una tarea manual, sobre todo si queremos escalar, docker solo no permite escalar, pero docker compose si que lo permite, y nos da la facilidad para escalar con simples comandos y de varias maneras.

En este Post estamos utilizando Docker desktop para Windows, Para la instalación seguir la guía correspondiente:https://docs.docker.com/desktop/install/windows-install/


Una vez instalado, habilitamos la opción de docker compose:


Abrimos la consola y verificamos si todo esta configurado correctamente:


Verificamos la versión de docker compose:



Ahora non ubicamos en una carpeta en particular, en este caso C:\docker\docker-nginx y dentro creamos el archivo .yml  con el siguiente contenido. 

C:\docker\docker-nginx\docker-compose.yml

version: '3'
services:
  nginx:
    image: nginx
    deploy:
      replicas: 3
    network_mode: bridge


Ahora abrimos la consola y ejecutamos el siguiente comando para iniciar el contenedor:
Nos ubicamos en el directorio del archivo  "docker-nginx"

C:\docker\docker-nginx>docker-compose up -d 


El resultado se descargará la imagen de nginx y creará 3 instancias.

Ahora para escalar a mas de 3 instancias podemos hacerlos de 2 maneras.

Primera:

Modificando el archivo docker-compose.yml y aumentando el numero de replicas, ejemplo a 5. volvemos a ejecutar

C:\docker\docker-nginx>docker-compose up -d 

Y tendremos 5 instancias de nginx corriendo.

Segunda:

Esta segunda es mediante un flag de docker-compose, llamado scale, y seria de la siguiente forma:

C:\docker\docker-nginx>docker-compose up -d --scale nginx=5

El resultado lo podemos ver:



Nuevamente podemos ejecutar pero ahora con 10 instancias:

C:\docker\docker-nginx>docker-compose up -d --scale nginx=10


Ahora reducimos a 2 instancias:

C:\docker\docker-nginx>docker-compose up -d --scale nginx=2


Y así podremos ir escalando en medida que necesitemos y los recursos los soporten.

La fuente también lo pueden descargar en Github

Saludos.