Hableremos historia de los contenedores, por qué son necesarios, cómo docker llegó a cambiar el panoram, competencia de docker (rkt, etc.), la mejor ruta de aprendizaje y mejores prácticas.
3. Procesos de Linux
• Linux es un sistema operativo multiprocesamiento.
• Los procesos son tareas separadas, cada una con sus propios permisos y responsabilidades. Si
un proceso falla, no afectará otro proceso en el sistema.
• Cada proceso individual se ejecuta en su propio espacio de dirección virtual y no es capaz de
interactuar con otro proceso, excepto a través de mecanismos seguros gestionados por el kernel.
• Utilizará el CPU del sistema para ejecutar sus instrucciones y la memoria física del sistema para
guardar sus datos. Usará archivos dentro de los sistemas de archivos y puede usar directa o
indirectamente los dispositivos físicos en el sistema.
• Linux debe realizar un seguimiento del proceso en sí y de los recursos del sistema que tiene para
que pueda administrarlo y los demás procesos del sistema de manera justa. No sería justo para
los otros procesos en el sistema si un proceso monopolizara la mayor parte de la memoria física
del sistema o sus CPU.
4. CPU
• El recurso más valioso del sistema es la CPU.
• Linux es un sistema operativo multiprocesamiento, su objetivo es tener un proceso
ejecutándose en cada CPU del sistema en todo momento, para maximizar la utilización
de la CPU. Si hay más procesos que CPU, el resto de los procesos deben esperar antes
de que una CPU quede libre hasta que puedan ejecutarse.
• El multiprocesamiento es una idea simple; un proceso se ejecuta hasta que deba
esperar, generalmente por algún recurso del sistema; cuando tiene este recurso, puede
volver a ejecutarse.
• Cada vez que un proceso tiene que esperar, el sistema operativo le quita la CPU y lo
entrega a otro proceso. Es el planificador (scheduler) el que elige cuál es el proceso más
apropiado para ejecutar a continuación y Linux utiliza una serie de estrategias de
planificación para garantizar la equidad.
5. • Para que Linux pueda administrar los procesos en el sistema, cada
proceso está representado por una estructura de datos: task_struct
(tarea y proceso son términos que Linux usa indistintamente). El vector
tasks es una matriz de punteros a cada estructura de datos task_struct
en el sistema.
• Esto significa que el número máximo de procesos en el sistema está
limitado por el tamaño del vector tasks. A medida que se crean los
procesos, se asigna una nueva task_struct desde la memoria del sistema
y se agrega al vector de tareas. Para facilitar su búsqueda, el puntero
actual señala el proceso actual en ejecución.
6.
7. Creación de procesos
• La llamada fork() al sistema crea un nuevo proceso al duplicar uno existente.
• El proceso que llama fork () es el padre, mientras que el nuevo proceso es
el hijo.
• El padre reanuda la ejecución y el hijo comienza la ejecución en el mismo
lugar: donde vuelve la llamada a fork().
• La llamada al sistema fork() regresa del kernel dos veces: una en el
proceso padre y otra vez en el hijo recién creado.
• fork() esta implementado por la llamada al sistema clone()
8. Forking
• Linux implementa fork() a través de la llamada al sistema clone() que
toma una serie de flags que especifican qué recursos deben compartir el
proceso primario y secundario.
• Las llamadas fork(), vfork() y __clone() invocan la llamada al sistema
clone() con los flags necesarios.
• La llamada al sistema clone() llama a do_fork().
• do_fork() invoca copy_process()
9. • copy_process() hace cosas realmente interesantes:
• Permite duplicar o compartir recursos como:
• Archivos
• Filesystems
• Espacios de direcciones de procesos
• Namespaces
• Regresa el apuntador al proceso recién creado
10. Linux namespaces
• Namespaces dividen los recursos del kernel de modo que un conjunto de
procesos ve un conjunto de recursos mientras que otro conjunto de
procesos ve un conjunto diferente de recursos. Ejemplos de nombres de
recursos que pueden existir en múltiples espacios, son ID de proceso,
nombres de host, ID de usuario, nombres de archivo y algunos nombres
asociados con el acceso a la red y la comunicación entre procesos.
• Linux comienza con un solo espacio de nombres de cada tipo, utilizado por
todos los procesos. Los procesos pueden crear espacios de nombres
adicionales y unir diferentes espacios de nombres.
• Los espacios de nombres son un aspecto fundamental de los contenedores
en Linux.
12. Control Groups (cgroups)
• Limitan el uso y consumo de recursos de los procesos
• Creados en Google por Paul Menage y Rohit Seth en 2006
• En ese tiempo se llamaba “process containers”
• En 2007 se cambia el nombre a control groups
• Se incorpora en el kernel de Linux 2.6.24 en Enero de 2008. Versión 1
• Actualmente esta vigente la versión 2, que es una reescritura hecha por
Tejun Heo, introducida en la versión 4.5 en Marzo de 2016.
14. LXC
• LXC proporciona virtualización a nivel de sistema operativo a través de un
entorno virtual que tiene su propio proceso y espacio de red, en lugar de
crear una máquina virtual completa.
• LXC se basa en la funcionalidad cgroups de kernel de Linux que se lanzó
en la versión 2.6.24. También se basa en otros tipos de funcionalidad de
aislamiento de espacio de nombres, que se desarrollaron e integraron en
el núcleo principal de Linux.
• Inicialmente implementado por IBM en 2008
20. Docker Inc
• Sus implantaciones y aportes ayudaron a definir los dos principales
estándares de industria que existen sobre Contenedores (2015)
• Runtime Specification (runtime-spec)
• Image Specification (image-spec)
• Ambas especificaciones están mantenidos por la Open Containers
Iniciative (OCI)
• https://www.opencontainers.org/