Introducción a la tecnología de contenedores


Definición de Wikipedia

an open-source project that automates the deployment of software applications inside containers by providing an additional layer of abstraction and automation of OS-level virtualization on Linux.


Características principales

  • Es una herramienta software

  • Permite desarrollar y empaquetar el código junto con todas sus dependencias en una imagen

  • Uno o varios contenedores pueden ejecutar de forma aislada una imagen

  • Los contenedores parecen máquinas virtuales, pero no tienen la sobrecarga de estas últimas y son por lo tanto más eficientes.


Contenedores vs máquinas virtuales

  • Ventajas de las MV
    • Mayor aprovechamiento de los recursos
    • Entorno aislado de ejecución
    • Facilidad en la distribución:
      • Aplicaciones
      • Dependencias
      • Configuraciones

  • Desventajas:
    • Arranque (lento) del SO de la MV
    • Cada MV tiene su propio sistema operativo, posiblemente diferente.
    • Configuración y aprovisionamiento complejos
    • La virtualización impone sobrecarga sobre los recursos hw: CPU y MEM
    • No son portables entre hipervisores diferentes

Note:
No se pueden migrar las máquinas directamente entre AWS y Google Cloud, por ejemplo.


Contenedores

  • Los SO tradicionales virtualizan la CPU y la memoria. El sistema de archivos y la red está compartida entre todos los procesos
  • Las MV virtualizan hardware, sobre el hardware virtualizado corre un SO completo, con sus bibliotecas y ejecutables (decenas de GB's por MV)

Virtualización del sistema operativo

  • Cada contenedor incluye solo una aplicación concreta junto con sus dependencias
  • El sistema operativo no se replica, se comparte entre contenedores
  • Cada contenedor cree ver su propio sistema operativo

Ventajas de los contenedores

  • Proporcionan un mecanismo para crear entornos de ejecución aislados dentro de una máquina y bajo un determinado sistema operativo.
  • Los contenedores se crean en un servidor físico (o virtual) y sobre el sistema operativo de dicho servidor.
  • La capacidad de ejecución de los contenedores es un servicio del propio sistema operativo

  • Los contenedores son unidades autocontenidas: tienen todo lo necesario para ejecutar una aplicación concreta, y nada más.
  • Son muy ligeros: arrancan en pocos segundos, mientras que una MV puede tardar minutos.
  • Los contenedores a su vez pueden ejecutarse en entornos muy diferentes: desde un servidor físico, un cluster con varias máquinas o un servicio cloud.

Tecnología de contenedores

Para poder utilizar contenedores, es necesario que el sistema operativo disponga de esta característica.


Contenedores en Linux

  • Estan basados en una característica del núcleo denominada cgroups
  • Cada cgroup de forma aislada dispone de:
    • Su propio árbol de procesos y PID's
    • Su propio stack de red
    • Sus propios usuarios
    • Su propio sistema de archivos (efímero)
  • Sin embargo comparte todo el código del núcleo

Docker


¿Qué es Docker?

  • Software que facilita la creación y gestión de contenedores
  • Es un estándar de facto
  • Se basa en el proyecto LXC

Flockport - LXC vs Docker


Terminología Docker

  • Imagen (de un contenedor)
    • Es un archivo estático que incluye todo el sistema de archivos, con la aplicación y todas sus dependencias.
  • Contenedor
    • Es la entidad que ejecuta una imagen
    • Puede haber varios contenedores ejecutando la misma imagen

Note:

  • El que puede haber más de un contenedor ejecutando la misma imagen es una forma de aprovechar de forma explícita el paralelismo que proporciona el hecho de tener varias máquinas virtuales ejecutando ese contenedor, o varias CPU en una misma máquina, o una combinación de varias VM, con varias CPU cada una, formando un cluster (kubernetes)

Persistencia de datos

  • El sistema de archivos que ve un contenedor es la unión de:

    • Sistema de archivos del anfitrión
    • Las capas añadidas por la imagen
    • Una capa de escribible (writable container layer)
  • Lo que se crea dentro de un contenedor es efímero

  • La capa escribible no es muy eficiente


Técnicas para persistir datos

  • Utilizando volúmenes
  • Utilizando puntos de montaje
  • Utilizando tmpfs

Cualquiera de las tres son transparentes para el contenedor


Volúmenes

  • Son gestionados por docker
    • Archivos especiales dentro del anfitrión
    • Almacenamiento en algún sistema remoto (cloud)
  • Puede ser utilizados a la vez por varios contenedores
  • Sobreviven a la finalización de los contenedores

Puntos de montaje

  • Hacen corresponder una ruta del anfitrión con un punto dentro del contenedor.
  • Muy eficientes, pero dependen del SdA del anfitrión
  • Muy útiles para desarolladores 😉

Uso de Docker durante la etapa de desarrollo

  • El SW tiene dependencias de terceros:
    • Dependen versiones concretas de bibliotecas y frameworks.
    • Dependen de servicios externos p.e:
      • Bases de datos
      • Bases de datos en memoria
      • Servicios específicos (¿dockerizados?)
  • Necesitamos tener instalado todo eso en el equipo ¿y si trabajamos en varios proyectos?

Uso de Docker en sistemas de integración continua (CI)

  1. El desarrollador sube cambios en el software a un repositorio
  2. La modificación del repositorio dispara un proceso de construcción:
    • Descargar el software
    • Ejecutar pruebas
    • Construir una nueva imagen
  3. Guardar la imagen recién construida en un repositorio de imágenes

Note:
(p.e. Dockerhub, Google Container Registry, Amazon ECR)


Uso de Docker en Pre/Producción

  • Paso a producción de (deploy) la imagen desde el repositorio
  • La imagen se entrega al entorno de ejecución elegido:
    • Google Compute Engine // Amazon EC2
    • Google App Engine // Amazon Fargate
    • Google Kubernetes // Amazon EKS
  • Estrategia de despliegue de contenedores elegida

Estrategias de despliegue de contenedores

  • Recreate: parar todos los contenedores antiguos y arrancar después los nuevos.
  • Ramped: ir parando contenedores antiguos y por cada uno parado arrancar uno nuevo.
  • blue/gree: arrancar todos los nuevos, conmutar el tráfico y detener los antiguos
  • Canary: arrancar uno nuevo, desviar parte del tráfico y si no hay fallos continuar
  • A/B testing: permite enviar parte del tráfico a una versión y parte a otra versión diferente

Note:
https://blog.container-solutions.com/kubernetes-deployment-strategies


Arquitecturas con contenedores


Caso de estudio: Wordpress


Fin

Select a repo