contenedores

los contendores basicamente aislan ciertos procesos o empaquetarlos dentro de un hosts pero ademas estos se pueden comunicar mediante networks pero comparten recursos.

tradicionalmente se dice y repite que los contendores surgieron por el problema de compatibildad entre maquinas al desplegar software en distintos entornos, el problema era que en linux existen diferentes empaquetadores como rpm, debian, aur entre muchos otros, los equipos de software despues desplegaban en diferentes maquinas y empezaban a ver problemas o era tedioso instalar todo y pues los contendores resuelven eso, envias el archivo ejecutable y las dependencias de una sola manera donde ya verificaste que funciona y tienes las dependencias necesarias..

maquinas virtuales vs contendores

seguido los contendores y las maquinas virtuales son comparados, cuando usas una maquina virtual la persona tiene que manejar todo lo que esto conlleva, logs, actualizaciones de seguridad, backups del sistema operativo (de cada sistema operativo por ejemplo en una sola maquina tienes multiples sistemas o aplicaciones si estos no comparten recursos como bases de datos, caching etc tienes que manejar el sistema operativo principal y ademas los dos restantes), los contendores no corren un sistema operativo completo estos solo corren un userpaces sobre el sistema operativo principal que ya tiene la maquina.

userspace

y bueno seguramente te estas pregutando que rayos es el userspace es todo el software que corre encima del kernel: procesos, bibliotecas, shells, gestores de servicios y el sistema de ficheros “de usuario”. El kernel (modo núcleo) ofrece los servicios (planificación, memoria, drivers, syscalls) y el userspace usa esas herramientas para funcionar.

Los contenedores empaquetan un userspace (binarios, librerías, sistema de ficheros raíz) y lo ejecutan sobre el mismo kernel del host. Es decir:

  • Dentro del contenedor hay un sistema de archivos, procesos y herramientas todo eso es userspace que cree que tiene su propio sistema operativo.
  • Pero cuando esos procesos hacen llamadas al sistema (syscalls) usan el kernel del host, no un kernel propio.
  • Para crear la sensación de “entorno separado”, los contenedores usan varias primitivas del kernel: namespaces (PID, mount, net, ipc, uts) y cgroups (para recursos). El userspace del contenedor se apoya en esas primitivas para estar “aislado”, aunque el kernel sea el mismo.

ahora para entender esto bien o de manera completa tienes que entender que no se instala el sistema operativo completo dentro del contenedor solo se instala el userspace que consume las apis del sistema operativo de la maquina que tiene los contendores corriendo

por ejemplo si corremos un contendor con alpline linux: no es un Sistema operativo completo, es solo su userspace:

  • /bin, /sbin, /usr
  • librerías (musl en vez de glibc)
  • herramientas ( apk, sh, etc.)
  • archivos de configuración 🚫 No incluye:
  • kernel propio
  • drivers
  • systemd (normalmente)
  • arranque del sistema

Entonces, ¿qué kernel se usa?

👉 El kernel del host (Ubuntu supongamos que es tu maquina) Todos los procesos dentro del contenedor hacen syscalls contra el kernel de Ubuntu, aunque:

  • usen herramientas de Alpine
  • vean /etc/os-release diciendo “Alpine”
  • tengan apk en lugar de apt Por eso esto funciona sin problemas.

para que te entre en tu cabecita El contenedor es solo procesos + filesystem, no un sistema operativo completo

Para contrastar maquina virtual y contendores :

VM (ej. Alpine en VirtualBox sobre Ubuntu)

  • Alpine sí trae su kernel
  • arranca como un SO real
  • drivers virtuales
  • init completo

Contenedor (Alpine sobre Ubuntu)

  • Alpine no trae kernel
  • no hay boot
  • se lanza directamente el proceso ( /bin/sh, nginx, etc.)
  • comparte kernel con el host

y como se da esta compatibilidad ?

La compatibilidad existe por una regla muy fuerte de Linux: la ABI del kernel. El kernel de Linux expone una interfaz estable hacia userspace Esa interfaz son las system calls (syscalls). Mientras un programa:

  • esté compilado para Linux
  • use syscalls estándar funciona sobre cualquier kernel Linux moderno, sin importar la distro.

Las distros NO definen el kernel, definen el userspace: Distro Qué cambia Alpine musl libc, busybox, apk Ubuntu glibc, coreutils, apt Debian glibc, dpkg creo que con eso ya queda claro que son los contendores en los proximos dias creare mas articulos acerca de los contendores