---
# System prepended metadata

title: Introducción a la tecnología de contenedores
tags: [docker, ' contenedores']

---

---
tags: docker, contenedores
title: Introducción a la tecnología de contenedores
slideOptions:
  transition: slide
  theme: white
---

<style>
.reveal section img { background:none; border:none; box-shadow:none; }
</style>

# 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)

---

:::success
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

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

![](https://i.imgur.com/pBKkTNc.png =600x)

---

### 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](https://archives.flockport.com/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](#estrategias-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

![](https://i.imgur.com/5vh8eiD.png)


---

## Fin