Tecnología de contenedores: la esencia de Docker

1. La tecnología principal de la tecnología de contenedores

En primer lugar, la tecnología de contenedores no es la tecnología de Docker, sino la tecnología del kernel de Linux.

1 Revive el proceso

1.1 Procedimiento

Suponga que ahora desea escribir un pequeño programa para calcular la suma. La entrada para este programa proviene de un archivo y el resultado después del cálculo se envía a otro archivo.

Dado que la computadora solo reconoce 0 y 1, no importa qué idioma se use para escribir este código, es necesario traducirlo a un archivo binario de alguna manera antes de que pueda ejecutarse en el sistema operativo de la computadora.

Para que estos códigos se ejecuten normalmente, a menudo tenemos que proporcionarle datos, como los archivos de entrada que necesita nuestro programa de adición. Estos datos más el archivo binario del código en sí, colocado en el disco, es lo que normalmente llamamos un "programa", también llamado imagen ejecutable del código.

1.2 Proceso

En primer lugar, el sistema operativo encuentra en el "programa" que los datos de entrada están almacenados en un archivo, por lo que estos datos se cargarán en la memoria en espera. Al mismo tiempo, el sistema operativo lee la instrucción para calcular la suma y, en este momento, debe indicarle a la CPU que complete la operación de suma. La CPU coopera con la memoria para realizar cálculos de suma y utiliza registros para almacenar valores y pilas de memoria para almacenar comandos y variables ejecutados. Al mismo tiempo, hay archivos abiertos en la computadora y varios dispositivos de E / S llaman constantemente para modificar su propio estado. De esta manera, una vez que se ejecuta el "programa", cambia del archivo binario en el disco a los datos en la memoria de la computadora, el valor en el registro, la instrucción en la pila, el archivo abierto y el estado de varios dispositivos Una colección de información. La suma del entorno de ejecución de la computadora después de que se ejecuta dicho programa es el proceso.

La función principal de la tecnología actual de contenedores con las manos desnudas es crear un "límite" restringiendo y modificando el rendimiento dinámico del proceso.

Para la mayoría de los contenedores de Linux, como Docker, la tecnología Cgroups es el método principal utilizado para crear restricciones, y la tecnología de espacio de nombres es el método principal utilizado para modificar la vista del proceso.

2 Espacio de nombres Aislamiento del espacio de nombres

El espacio de nombres se utiliza para aislar directamente el proceso, que es para garantizar que el proceso solo pueda ver los recursos que especificamos.

Por ejemplo, haz el siguiente experimento para estar en escena.

mkdir -p container/{
    
    lib64,tmp}
cp  `ldd /usr/bin/bash | grep -P '/lib64/.*so.\d+' -o` container/lib64
cp -n `ldd /usr/bin/ls | grep -P '/lib64/.*so.\d+' -o` container/lib64/
cp -n `ldd /usr/bin/pwd | grep -P '/lib64/.*so.\d+' -o` container/lib64
cp /usr/bin/{
    
    bash,ls,pwd}  container/

Luego ejecuta el siguiente comando

chroot  container  /bash

chroot La función del comando es ayudarlo a "cambiar el sistema de archivos raíz", es decir, cambiar el directorio raíz del proceso a la ubicación que especifique.

Después de la re-ejecución /pwdy el /lscomando

Suceden cosas extrañas con tanta frecuencia y, lo que es más importante, para el proceso chrooted, no sentirá que su directorio raíz ha sido "modificado".

Este es el efecto de un espacio de nombres de montaje de muchos espacios de nombres de Linux.

De hecho, Mount Namespace se inventó sobre la base de la mejora continua de chroot y también es el primer espacio de nombres en el sistema operativo Linux.

Por supuesto, para que el directorio raíz del contenedor parezca más "real", generalmente montamos un sistema de archivos de un sistema operativo completo bajo el directorio raíz del contenedor, como la estructura de directorios de Centos7. De esta forma, luego de que se inicia el contenedor, ejecutamos "ls /" en el contenedor para ver el contenido del directorio raíz, que son todos los directorios y archivos de Centos7.

La tecnología de espacio de nombres en realidad modifica la "vista" del proceso de la aplicación a toda la computadora, es decir, su "línea de visión" está restringida por el sistema operativo y sólo puede "ver" cierto contenido específico. Pero para el anfitrión, estos procesos "aislados" no son muy diferentes de otros procesos.

El sistema de archivos montado en el directorio raíz del contenedor y utilizado para proporcionar un entorno de ejecución aislado para el proceso del contenedor es la denominada "imagen del contenedor". También tiene un nombre más profesional, llamado: rootfs (sistema de archivos raíz)

Nota: En el kernel de Linux, hay muchos recursos y objetos que no pueden tener espacio de nombres. El ejemplo más típico es el tiempo.

Límite de recursos de 2 grupos C

Después de introducir la tecnología de "aislamiento" de los contenedores, veamos las "limitaciones" de los contenedores.

Linux Cgroups es una función importante en el kernel de Linux que se utiliza para establecer límites de recursos para los procesos.

El nombre completo de Linux Cgroups es Linux Control Group. Su función principal es limitar el límite superior de recursos que puede usar un grupo de procesos, incluida la CPU, la memoria, el disco, el ancho de banda de la red, etc.

Además, Cgroups también puede establecer prioridades, auditar procesos y suspender y reanudar procesos.

Por el momento, solo me centraré en hablar con usted sobre las capacidades "restringidas" que están más estrechamente relacionadas con los contenedores, y le presentaré Cgroups a través de una serie de prácticas.

En Linux, Cgroups expuestos a la interfaz de usuario es una operación del sistema de archivos, es decir, la forma en que se organiza en directorios y archivos del sistema operativo /sys/fs/cgroupde la ruta.

mount -t  cgroup  

Como puede ver, hay muchos subdirectorios como cpuset, cpu y memory en / sys / fs / cgroup, que también se denominan subsistemas. Estos son los tipos de recursos que Cgroups puede restringir en mi máquina. Y bajo el tipo de recurso correspondiente al subsistema, puede ver los métodos específicos que se pueden restringir para este tipo de recurso. Por ejemplo, para el subsistema de la CPU, podemos ver los siguientes archivos de configuración. Este comando es:

[root@localhost ~]# ls  /sys/fs/cgroup/cpu
cgroup.clone_children  cpuacct.usage_percpu  cpu.stat
cgroup.event_control   cpu.cfs_period_us     notify_on_release
cgroup.procs           cpu.cfs_quota_us      release_agent
cgroup.sane_behavior   cpu.rt_period_us      tasks
cpuacct.stat           cpu.rt_runtime_us
cpuacct.usage          cpu.shares
[root@localhost ~]#

Atencion cpu.cfs_period_usypu.cfs_quota_us

Estos dos parámetros deben usarse en combinación, se pueden usar para limitar la duración del proceso en cpu.cfs_period_usun período de tiempo, solo se puede asignar a una cantidad total de pu.cfs_quota_ustiempo de CPU.

A continuación, los usaremos para realizar un pequeño experimento para estar en escena.

Ahora ingrese al directorio / sys / fs / cgroup / cpu:

[root@localhost ~]# cd /sys/fs/cgroup/cpu

Luego crea un directorio container

[root@localhost cpu]# mkdir container

Luego observe el contenido de este directorio

[root@localhost cpu]# ls container/
cgroup.clone_children  cpuacct.usage_percpu  cpu.shares
cgroup.event_control   cpu.cfs_period_us     cpu.stat
cgroup.procs           cpu.cfs_quota_us      notify_on_release
cpuacct.stat           cpu.rt_period_us      tasks
cpuacct.usage          cpu.rt_runtime_us
[root@localhost cpu]#

Este directorio se denomina "grupo de control". Verá que el sistema operativo generará automáticamente el archivo de límite de recursos correspondiente al subsistema en el directorio contenedor recién creado.

Ahora, ejecutamos dicho script en segundo plano:

while : ; do : ; done &
[root@localhost cpu]# jobs -l
[1]+  1752 Running                 while :; do
    :;
done &

Luego observe el uso de la CPU a través del comando superior

Como puede ver en el resultado, el uso de la CPU ha sido del 100%.

[root@localhost cpu]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
-1
[root@localhost cpu]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us
100000
[root@localhost cpu]#

A continuación, podemos establecer restricciones modificando el contenido de estos archivos. Por ejemplo, escriba 20 ms (20000 us) en el archivo cfs_quota en el grupo de contenedores

 echo 20000 > container2/cpu.cfs_quota_us

Combinado con la introducción anterior, debe poder comprender el significado de esta operación, significa que en cada 100 ms de tiempo, el proceso restringido por el grupo de control solo puede usar 20 ms de tiempo de CPU, lo que significa que este proceso puede solo use el 20% del ancho de banda de la CPU. A continuación, escribimos el PID del proceso restringido en el archivo de tareas en el grupo de contenedores, y la configuración anterior entrará en vigor para el proceso:

echo 1752 > /sys/fs/cgroup/cpu/container/tasks 

Ver el comando superior de nuevo

Como puede ver, el uso de la CPU de la computadora se redujo inmediatamente al 20%
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_22648091/article/details/115310046
Recomendado
Clasificación