GNU/Linux >> Tutoriales Linux >  >> Linux

Desmitificando espacios de nombres y contenedores en Linux

Los contenedores han conquistado el mundo. Ya sea que piense en Kubernetes, Docker, CoreOS, Silverblue o Flatpak cuando escuche el término, está claro que las aplicaciones modernas se ejecutan en contenedores por conveniencia, seguridad y escalabilidad.

Sin embargo, los contenedores pueden ser confusos de entender. ¿Qué significa correr en un contenedor? ¿Cómo pueden los procesos en un contenedor interactuar con el resto de la computadora en la que se ejecutan? Al código abierto no le gusta el misterio, por lo que este artículo explica el backend de la tecnología de contenedores, al igual que mi artículo sobre Flatpak explicó un frontend común.

Espacios de nombres

Los espacios de nombres son comunes en el mundo de la programación. Si habita en los lugares altamente técnicos del mundo de la informática, entonces probablemente haya visto un código como este:

using namespace std;

O puede que hayas visto esto en XML:

<book xmlns="http://docbook.org/ns/docbook" xml:lang="en">

Este tipo de frases proporcionan contexto para los comandos que se usan más adelante en un archivo de código fuente. La única razón por la que C++ sabe, por ejemplo, qué quieren decir los programadores cuando escriben cout es porque C++ conoce el cout espacio de nombres es una palabra significativa.

Contenedores Linux

  • ¿Qué son los contenedores de Linux?
  • Una introducción a la terminología de contenedores
  • Descargar:Introducción a los contenedores
  • Operadores de Kubernetes:automatización de la plataforma de orquestación de contenedores
  • eBook:Patrones de Kubernetes para diseñar aplicaciones nativas de la nube
  • ¿Qué es Kubernetes?

Si eso es demasiado técnico para que lo imagine, puede que se sorprenda al saber que todos usamos espacios de nombres todos los días en la vida real también. No los llamamos espacios de nombres, pero usamos el concepto todo el tiempo. Por ejemplo, la frase "Soy fanático de Enterprise" tiene un significado en una empresa de TI que atiende a grandes empresas (que comúnmente se denominan "empresas"), pero puede tener un significado diferente en una convención de ciencia ficción. La pregunta "¿qué motor está funcionando?" tiene un significado en un garaje y un significado diferente en el desarrollo web. No siempre declaramos un espacio de nombres en una conversación informal porque somos humanos y nuestros cerebros pueden adaptarse rápidamente para determinar el contexto, pero para las computadoras, el espacio de nombres debe declararse explícitamente.

Para los contenedores, un espacio de nombres es lo que define los límites de la "conciencia" de un proceso de qué más se ejecuta a su alrededor.

lsns

Puede que no se dé cuenta, pero su máquina Linux mantiene silenciosamente diferentes espacios de nombres específicos para procesos dados. Usando una versión reciente de util-linux paquete, puede enumerar los espacios de nombres existentes en su máquina:

$ lsns
        NS TYPE   NPROCS   PID USER    COMMAND
4026531835 cgroup     85  1571 seth /usr/lib/systemd/systemd --user
4026531836 pid        85  1571 seth /usr/lib/systemd/systemd --user
4026531837 user       80  1571 seth /usr/lib/systemd/systemd --user
4026532601 user        1  6266 seth /usr/lib64/firefox/firefox [...]
4026532928 net         1  7164 seth /usr/lib64/firefox/firefox [...]
[...]

Si su versión de util-linux no proporciona el lsns comando, puede ver las entradas del espacio de nombres en /proc :

$ ls /proc/*/ns
1571
6266
7164
[...]
$ ls /proc/6266/ns
ipc net pid user uts [...]

Cada proceso que se ejecuta en su máquina Linux se enumera con un ID de proceso (PID). A cada PID se le asigna un espacio de nombres. Los PID en el mismo espacio de nombres pueden tener acceso entre sí porque están programados para operar dentro de un espacio de nombres determinado. Los PID en diferentes espacios de nombres no pueden interactuar entre sí de forma predeterminada porque se ejecutan en un contexto diferente o espacio de nombres . Esta es la razón por la cual un proceso que se ejecuta en un "contenedor" bajo un espacio de nombres no puede acceder a la información fuera de su contenedor o a la información que se ejecuta dentro de un contenedor diferente.

Creando un nuevo espacio de nombres

Una característica habitual del software que se ocupa de los contenedores es la gestión automática del espacio de nombres. Un administrador humano que inicia una nueva aplicación o entorno en contenedores no tiene que usar lsns para verificar qué espacios de nombres existen y luego crear uno nuevo manualmente; el software que usa espacios de nombres PID lo hace automáticamente con la ayuda del kernel de Linux. Sin embargo, puede imitar el proceso manualmente para obtener una mejor comprensión de lo que sucede detrás de escena.

Primero, debe identificar un proceso que no ejecutándose en su computadora. Para este ejemplo, usaré el shell Z (Zsh) porque estoy ejecutando el shell Bash en mi máquina. Si está ejecutando Zsh en su computadora, use Bash o tcsh o algún otro shell que no esté ejecutando actualmente. El objetivo es encontrar algo que pueda probar que no funciona. Puedes probar que algo no funciona con el pidof comando, que consulta su sistema para descubrir el PID de cualquier aplicación que nombre:

$ pidof zsh
$ sudo pidof zsh

Mientras no se devuelva ningún PID, la aplicación que ha consultado no se está ejecutando.

Dejar de compartir

El dejar de compartir El comando ejecuta un programa en un espacio de nombres no compartido de su proceso padre. Hay muchos tipos de espacios de nombres disponibles, así que lea dejar de compartir página man para todas las opciones disponibles.

Para crear un nuevo espacio de nombres para su comando de prueba:

$ sudo unshare --fork --pid --mount-proc zsh
%

Debido a que Zsh es un shell interactivo, lo lleva convenientemente a su espacio de nombres al momento del lanzamiento. No todos los procesos hacen eso, porque algunos procesos se ejecutan en segundo plano, dejándolo en un mensaje en su espacio de nombres nativo. Mientras permanezca en la sesión de Zsh, puede ver que ha dejado el espacio de nombres habitual mirando el PID de su nuevo proceso bifurcado:

% pidof zsh
pid 1

Si sabe algo sobre los ID de proceso de Linux, entonces sabe que PID 1 siempre está reservado, principalmente por la naturaleza del proceso de arranque, para la aplicación de inicialización (systemd en la mayoría de las distribuciones fuera de Slackware, Devuan y tal vez algunas instalaciones personalizadas de Arch) . Es casi imposible que Zsh, o cualquier aplicación que no sea una aplicación de inicialización de arranque, sea PID 1 (porque sin un sistema de inicio, una computadora no sabría cómo arrancar). Sin embargo, por lo que sabe su caparazón en esta demostración, Zsh ocupa la ranura PID 1.

A pesar de lo que ahora le dice su shell, el PID 1 en su sistema no sido reemplazado. Abra una segunda terminal o pestaña de terminal en su computadora y observe el PID 1:

$ ps 1
init

Y luego encuentre el PID de Zsh:

$ pidof zsh
7723

Como puede ver, su sistema "anfitrión" ve el panorama general y entiende que Zsh en realidad se está ejecutando como un PID de número alto (probablemente no sea 7723 en su computadora, excepto por coincidencia). Zsh se ve a sí mismo como PID 1 solo porque su alcance está confinado a (o contenido) dentro) de su espacio de nombres. Una vez que haya bifurcado un proceso en su propio espacio de nombres, sus procesos secundarios se numeran a partir del 1, pero solo dentro de ese espacio de nombres.

Espacios de nombres, junto con otras tecnologías como cgroups y más, forman la base de la contenedorización. Comprender que los espacios de nombres existen dentro del contexto del espacio de nombres más amplio de un entorno de host (en esta demostración, esa es su computadora, pero en el mundo real, el host suele ser un servidor o una nube híbrida) puede ayudarlo a comprender cómo y por qué actúan las aplicaciones en contenedores. la forma en que lo hacen. Por ejemplo, un contenedor que ejecuta un blog de Wordpress no "sabe" que no se está ejecutando en un contenedor; sabe que tiene acceso a un kernel y algo de RAM y cualquier archivo de configuración que le haya proporcionado, pero probablemente no pueda acceder a su directorio de inicio ni a ningún directorio al que no le haya dado permiso de acceso específico. Además, un proceso fuera de control dentro de ese software de blog no puede afectar ningún otro proceso en su sistema, porque hasta donde sabe, el "árbol" PID solo vuelve a 1, y 1 es el contenedor en el que se está ejecutando.

Los contenedores son una característica poderosa de Linux y se están volviendo más populares cada día. Ahora que comprende cómo funcionan, intente explorar la tecnología de contenedores, como Kubernetes, Silverblue o Flatpak, y vea qué puede hacer con las aplicaciones en contenedores. Los contenedores son Linux, así que inícielos, inspecciónelos cuidadosamente y aprenda sobre la marcha.


Linux
  1. Espacios de nombres de Linux

  2. Comandos de Linux:trabajos, bg y fg

  3. 6 recursos y 3 consejos para ayudarte a entrar en el mundo de los contenedores Linux

  4. ¿Qué es Docker (y los contenedores de Linux?)

  5. Linux:¿Qué es un espacio de nombres Uts?

Mi terminal Linux mínimo y rico en funciones

Introducción a la gestión de contenedores de Linux

Kernel de Linux y sus funciones

Instalar y configurar Ansible en Linux

Instalación y configuración de Jenkins en Linux

Cómo instalar y configurar contenedores LXC Linux en CentOS/RHEL/Ubuntu