Virtualización, contenedores y Docker - Ines023/Vampiro-Chaminade GitHub Wiki
🖥️ Virtualización y Contenedores
📚 Introducción a la Virtualización
Como los niños pedantes de una liga de debate de la ESO...
La DRAE define virtual como: Que tiene existencia aparente y no real.
Creo que esta definición nos va a ayudar un poco. Pensemos esto como un problema de colegio, aunque la electrónica no sea algo tan sencillo.
Si yo tengo una memoria con 8 GB de espacio y la quiero repartir entre dos ordenadores a partes iguales puedo dar a cada uno una memoria de 4 GB; o puedo querer que uno tenga 2 GB y el otro 6 GB.
Ahora, mira cada una de las partes que hacen a un ordenador (CPU, GPU, RAM...) y aplica la misma lógica.
Vamos a crear "máquinas virtuales". Cada una tiene sus propios recursos, que los acabamos de repartir. También tienen su propio sistema operativo, sus propias aplicaciones... Esencialmente son ordenadores separados, los vemos y tratamos como tal.
Sin embargo, físicamente usan el mismo hardware. Por eso: Que tiene existencia aparente y no real.
❓ ¿Para qué?
Es cierto que parece que en el ordenador de escritorio de tu casa no tiene mucho sentido dividir tu propia máquina en varias sub-máquinas; pero tiene más usos de los que crees.
☁️ Alquiler de servidores en la nube
Antes, un servidor era una única máquina y ofrecía más de un servicio.
Si quisieras montar un negocio que alquila ordenadores a gente que quiera tener una página web, para adaptarte a las necesidades de tus clientes tendrías que montar un ordenador con capacidades de procesado y memoria personalizados para cada empresa que compre tus servicios. Peor aún, cuando quisieran añadir cosas a su web y necesitasen más recursos tendrías que montar un ordenador nuevo. Y si le ocurría algo al software, como un virus, perdías todo.
Ahora sin embargo puedes tener servidores gigantes y repartir la potencia que tienen sin tocar un solo cable o componente. Mejor aún, cuando necesiten un ordenador más o menos potente, simplemente guardas sus datos, eliminas esa máquina virtual y haces una nueva con otras características donde los cargas otra vez.
También si algo falla o se corrompe, como todo funciona de forma independiente, no hay que tirarlo todo abajo.
Es mucho más seguro y fiable.
Entender esto es importante porque nosotros vamos a alquilar una máquina virtual a una de estas empresas. La que alquilaremos será pequeñita y si nos pasáramos de recursos nos moverían a una más grande y más cara (pero no va a pasar). De hecho, probablemente solo se cobre por la creación de los recursos, pero consumirán tan poco que entrará dentro del Tier gratuito.
Hay 3 grandes empresas dedicadas a ofrecer computación en la nube (alquilar servidores) son AWS (Amazon Web Services), Azure (Microsoft) y Google Cloud. Nosotros lo haremos con Azure.
🔒 Entornos controlados
A veces desconfiamos de un programa, o incluso desconfiamos de nuestras propias habilidades y nos da miedo romper nuestro ordenador. Podemos montar sobre él una máquina virtual hosted (luego verás qué es) y no nos arriesgamos a dañar nada fuera de ese entorno aislado. Si se rompe cualquier cosa podemos borrarla y montar una nueva.
💻 Compatibilidad de programas
No todas las aplicaciones están hechas para todos los sistemas operativos. Es posible que te encuentres alguna solo disponible en Linux, o solo en Windows. Puedes crear una máquina virtual en tu ordenador para tener acceso a ese software sin tener que comprarte un ordenador nuevo o reconfigurar el tuyo propio.
VIDEOJUEGOS:
Más allá de esto, también se crean emuladores para jugar videojuegos de los cuales no tienes la consola. Reservas de tu ordenador los recursos que suele utilizar una consola así y eres capaz de jugar a la nintendo 64 en tu portátil.
Como hemos visto, de primeras parece un concepto lejano pero es algo muy presente en nuestra vida en internet e incluso en nuestra vida cotidiana si somos un poco frikis.
🏗️ Arquitectura de una máquina virtual
Aquí están los conceptos clave:
- Recursos Físicos: El hardware de la máquina (CPU, memoria, almacenamiento, red).
- Recursos Virtualizados: División de los recursos físicos que se asigna a diferentes VMs.
- Máquina Virtual (VM): Una emulación de un ordenador completo independiente, con su propio sistema operativo y aplicaciones.
- Hipervisor: Es el software que permite la virtualización. Existen dos tipos principales:
-
Tipo 1 (Bare-metal): Se ejecuta directamente sobre el hardware físico y gestiona múltiples máquinas virtuales (VMs).
- El hypervisor es un Sistema Operativo cuya única misión es gestionar conjuntos de clusters (varios servidores trabajando bajo la misma IP), Máq. Virtuales, unidades de almacenamiento, etc…
Ejemplos: VMware ESXi, Microsoft Hyper-V., [Proxmox]
-
Tipo 2 (Hosted/Paravirtualización): Se ejecuta sobre un sistema operativo anfitrión. En otras palabras, es una aplicación de escritorio en un ordenador que gestiona las VMs a coste de reducir su propio rendimiento.
Ejemplos: VMware Workstation, Oracle VirtualBox (¡El que uso yo!).
-
🆚 Contenedores vs Máquinas Virtuales
🔥 El infierno de las dependencias
Te voy a presentar un concepto que persigue a los gestores de servidores por la noche:
La matriz del infierno
Tú quieres desplegar una web que tiene una base de datos, un proxy inverso, la app en sí... Vamos, un montón de apps distintas. Y como ya hemos visto, tenerlas en el mismo sitio a todas no es buena idea. De hecho, es probable que se basen en el mismo software... pero ¡no en la misma versión! Y ahí sí que es imposible tener varias versiones de lo mismo para cada app. El intentar que todo encaje con las necesidades de cada parte es a lo que se llama la matriz del infierno. THE MATRIX FROM HELL.
Con el conocimiento que tenemos hasta ahora se nos ocurre poner una máquina virtual para cada cosa. Así tenemos un entorno aislado en que podemos poner la versión 3.8 de Python y la 3.11. Sin embargo esto no es lo más eficiente. Cada VM incluye un sistema operativo completo, lo que puede llevar a un uso ineficiente de recursos.
📦 Contenedores
Los contenedores son un siguiente paso en la virtualización. Los creamos sobre el kernel/núcleo del sistema operativo sobre el que los montamos. Dentro de ellos empaquetamos solo aplicaciones y sus dependencias, lo que los hace mucho más ligeros y eficientes. (Hablamos de un contenedor de decenas de Megas vs una VM de Gigas).
Básicamente, en vez de meter todo Ubuntu 5 veces [Ubuntu es una distribución de Linux. Es Linux con más cosas.] cogemos solo lo básico del Linux que hay debajo y creamos ambientes un poco menos aislados donde meter solo los extras que nos hagan falta para cada aplicación + la aplicación en sí.
En resumen, vamos a poner el software justo y necesario para sacarle el mayor partido posible a los recursos que tenemos.
🐳 Docker
Docker es uno de estos softwares de Virtualización para gestionar contenedores. Es de código abierto y el más usado de todos.
De hecho, se suele hablar de apps "dockerizadas".
Está disponible tanto para Linux, donde se planteó inicialmente, como para Windows.
Lo que hará será crear esos contenedores y una red que los conecte para que puedan comunicarse entre ellos.
A continuación presentamos conceptos básicos de Docker que necesitaremos para continuar:
-
Imágenes: Plantillas a partir de las cuales lanzamos los contenedores.
Pueden estar en repositorios públicos o privados (creados por nosotr@s mism@s)Piensa en una receta de cocina. Es una serie de instrucciones y configuraciones que, cuando pones en práctica, resultan en un plato. Puedes tenerla pública buscando en un blog o un libro de recetas o privada en el cuaderno de tu abuela con sus pasos personales.
-
Contenedores: Se ejecutan a partir de las imágenes.
Esto sería la tarta en sí. Puedes hacer y tirar cuantas quieras a partir de tu receta.
-
Volúmenes: Herramienta para conseguir la persistencia de los datos en la ejecución de contenedores.
Si guardas memoria en un entorno que destruyes, destruirás con él la memoria. En vez de eso, declaramos que los archivos que se generen en ese contenedor se guarden también en el ordenador en el que está Docker, en un sitio donde estén seguros/no se vayan a perder. -
Redes: Vamos a ejecutar una app que necesita consultar una base de datos, pero hemos metido cada una en un contenedor. Necesitan poder interactuar así que igual que físicamente conectamos dos ordenadores con un cable para que puedan interactuar, configuramos una red virtual para que dos mini-máquinas-virtuales se puedan comunicar.