Explorando contenedores simples de Linux con lxc

Si le pregunta a los administradores de sistemas por qué aman Linux, una de las primeras respuestas que obtendrá es . Parece que las herramientas de Linux tienden a construirse con la cantidad justa de esfuerzo para usted, dejándolo con la cantidad justa de trabajo para hacer por su cuenta. Debido a que con frecuencia se recurre a un administrador del sistema para resolver problemas que aún no tienen una solución obvia, Linux proporciona el bloque de construcción ideal.

Cuando los contenedores se convirtieron en un nombre familiar, pocas personas sabían qué hacer con ellos o qué era posible. Por el contrario, parecían completamente contrarios a las filosofías habituales de Linux. Muchos administradores de sistemas han tenido problemas para editar un archivo YAML y luego reconstruir un contenedor que se negó a almacenar sus propios archivos de configuración persistentes.

Ahora que el polvo se ha asentado y los administradores de sistemas pueden ver los contenedores para los sistemas Linux en la escala infinita que son, el objetivo es sacar los contenedores de las industrias especializadas y llevarlos a los flujos de trabajo convencionales. En otras palabras, los contenedores ya no son solo para CI/CD y administradores de sistemas. Estos son juegos de herramientas que pueden usar los usuarios normales y los desarrolladores. Y es porque se inclina hacia lo genérico que el lxc El proyecto es ideal para el uso diario en contenedores.

De hecho, lxc en sí mismo fue la base sobre la que se construyó Docker, y hoy en día existen muchas plataformas que aprovechan el trabajo de lxc tanto directa como indirectamente. Lxc, a diferencia de otras soluciones de contenedor, no impone un demonio o una cadena de herramientas específicos. Lxc se toma tan en serio su integración en su flujo de trabajo que proporciona enlaces de Python3 para que pueda crear herramientas a su alrededor.

Si es nuevo en lxc, puede integrar contenedores genéricos de Linux en el diseño de su propio sistema para resolver cualquier problema que crea que puede resolver un contenedor.

Índice

    Instalando lxc

    Si aún no está instalado, puede instalar lxc con su administrador de paquetes:

    $ sudo dnf install lxc lxc-templates lxc-doc 
      libcgroup-pam libcgroup-tools libcgroup

    Limitar privilegios

    Los contenedores no son contenedores físicos reales, por supuesto que son solo espacios de nombres. Los espacios de nombres están destinados a limitar lo que un proceso "atrapado" dentro de un contenedor puede hacer en un sistema (en particular, solo debería poder hacer lo que especifica su contenedor principal). Para asegurarse de que su infraestructura de contenedores paralice adecuadamente los procesos que no son usuarios reales del sistema, verifique que su usuario tenga un UID de mapa y un GID definidos en /etc/subuid y /etc/subgid:

    $ cat /etc/subuid
    seth:100000:65536
    bob:165536:65536

    Es común que una distribución asigne 65536 UID y GID a cada usuario. Si un proceso debe salir de un contenedor iniciado por el usuario seth (en este ejemplo) se le daría un UID de 100000 a 165535, por lo que terminaría sin permisos.

    Interfaz de red virtual

    Un contenedor asume que hay una red disponible y que la mayoría de sus interacciones con un contenedor se realizan a través de una conexión de red, incluso si esa red es una interfaz de red local definida por software. Para crear NIC virtuales, un usuario debe tener permiso para hacerlo y esta no es la configuración predeterminada para la mayoría de las cuentas de usuario de Linux.

    Si aún no existe, créalo. /etc/lxc/lxc-usernet archivo, utilizado para establecer cuotas de dispositivos de red para usuarios sin privilegios. De forma predeterminada, su cuenta de usuario no tiene permiso para crear dispositivos de red, pero si desea crear y utilizar contenedores, debe otorgarse los permisos adecuados. Agrega tu usuario a /etc/lxc/lxc-usernet archivo, junto con el dispositivo de red, el puente y el número:

    seth veth virbr0 24

    En este ejemplo, el usuario seth ahora se le permite crear hasta 24 veth dispositivos conectados a virbr0 puente de red el veth dispositivo se refiere a un adaptador Ethernet virtual y el dispositivo virbr0 es un puente virtual. Un puente virtual es, más o menos, el equivalente en software de un conmutador de red o un adaptador en Y para conectores de auriculares o cables de alimentación.

    Configuración LXC

    Los contenedores se definen mediante archivos de configuración. Si ya construyó un ordenador física e instaló Linux en ella, puede pensar en una configuración de contenedor como la versión lxc de este proceso. Si usó un archivo Kickstart en RHEL o Fedora, o un archivo Ansible en cualquier distribución de Linux, no tendrá problemas para comprender la configuración de un contenedor. Ya sea que tenga o no alguna de estas experiencias, le alegrará saber que el proyecto lxc proporciona un archivo de configuración de inicio en el que puede construir.

    Primero, cree los directorios locales requeridos:

    $ mkdir -p $HOME/.config/lxc
    $ mkdir -p $HOME/.cache/lxc

    Luego copia /etc/lxc/default.conf en $HOME/.config/lxc/default.conf:

    $ cat /etc/lxc/default.conf > $HOME/.config/lxc/default.conf

    Ahora agregue información sobre su tarjeta UID y GID al archivo de configuración. Suponiendo que es el primer usuario en su sistema host:

    $ echo "lxc.idmap = u 0 100000 65536" >> $HOME/.config/lxc/default.conf
    $ echo "lxc.idmap = g 0 100000 65536" >> $HOME/.config/lxc/default.conf

    Ábralo en un archivo de texto y realice estos cambios:

    lxc.net.0.type = veth
    lxc.net.0.link = virbr0
    lxc.net.0.flags = up
    lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
    lxc.idmap = u 0 100000 65536
    lxc.idmap = g 0 100000 65536

    Si no es el primer usuario, o si los valores de UID y GID difieren en su sistema, ajuste los valores de acuerdo con lo que tiene en /etc/subuid y /etc/subgid.

    Para reiniciar

    Reinicie su sistema, luego vuelva a iniciar sesión. Técnicamente, solo debería poder cerrar la sesión, pero un reinicio es seguro. Para asegurarse de que sus permisos de usuario hayan sido actualizados.

    Crear un contenedor lxc

    Una vez reconectado, puede crear su primer contenedor usando el lxc-create pedido. Definición del modelo en download solicita a lxc que descargue una lista de configuraciones base disponibles, incluidas CentOS y Fedora.

    $ lxc-create --template download --name penguin

    Cuando se le solicite, ingrese la distribución, la versión y la arquitectura deseadas. El rootfs y el índice de imágenes se descargan y se crea su primer contenedor.

    Comenzando su contenedor

    Ahora solo tiene uno, pero eventualmente podrá recopilar más, por lo que si necesita enumerar los contenedores disponibles en su sistema, use lxc-ls:

    $ lxc-ls --fancy
    NAME    STATE   AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED 
    penguin STOPPED 0         -      -    -    true 

    Para iniciar un contenedor:

    lxc-start --daemon --name penguin 

    Puede verificar que un contenedor se está ejecutando con el lxc-ls pedido:

    $ lxc-ls --fancy

    Comenzó el contenedor, pero no lo adjuntó. Adjuntarlo por nombre:

    $ sudo lxc-attach --name penguin
    # 

    No siempre es fácil saber cuándo estás en un contenedor. Algunas pistas son reveladas por whoami, ip, y uname:

    Desde el interior del contenedor:

    $ whoami
    root
    $ ip a show | grep global
        inet 192.168.122.8/24 brd 192.168.122.255 [...]
    $ uname -av
    Linux penguin 5.4.10-200.fc31.x86_64 #1 SMP [...]

    Desde fuera del contenedor:

    $ whoami
    seth
    $ ip a show | grep global
        inet 10.1.1.5/24 brd 10.1.1.31 scope global [...]
    $ uname -av
    Linux fedora31 5.4.10-200.fc31.x86_64 #1 SMP [...]

    Ahora tiene un contenedor listo para el desarrollo, o para usarlo como sandbox, o entorno de capacitación, o lo que quiera hacer con su sandbox lxc.

    Cuando haya terminado, salga del contenedor y ciérrelo:

    # exit
    $ sudo lxc-stop --name penguin

    Contención

    Los contenedores han cambiado la forma en que funcionan el desarrollo y el hospedaje. Hicieron de Linux la opción predeterminada para la nube. Sin embargo, no tienes que cambiar tu forma de trabajar para aprovechar su poder. Con lxc, puede construir y hacer crecer contenedores de la forma en que funcionan para usted.

    Artículos de interés

    Subir