GNU/Linux >> Tutoriales Linux >  >> Linux

Detrás de escena con los contenedores de Linux

¿Se pueden tener contenedores de Linux sin Docker? ¿Sin OpenShift? ¿Sin Kubernetes?

Sí tu puedes. Años antes de que Docker hiciera de los contenedores un término familiar (si vives en un centro de datos), el proyecto LXC desarrolló el concepto de ejecutar una especie de sistema operativo virtual, compartiendo el mismo kernel, pero contenido dentro de grupos definidos de procesos.

Docker se basó en LXC, y hoy en día hay muchas plataformas que aprovechan el trabajo de LXC tanto directa como indirectamente. La mayoría de estas plataformas hacen que la creación y el mantenimiento de contenedores sean sumamente simples y, para implementaciones grandes, tiene sentido utilizar servicios tan especializados. Sin embargo, no todos administran una gran implementación o tienen acceso a grandes servicios para aprender sobre la contenedorización. La buena noticia es que puede crear, usar y aprender contenedores con nada más que una PC con Linux y este artículo. Este artículo lo ayudará a comprender los contenedores analizando LXC, cómo funciona, por qué funciona y cómo solucionar problemas cuando algo sale mal.

Eludir la simplicidad

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 está buscando una guía de inicio rápido para LXC, consulte el excelente sitio web Linux Containers .

Instalando LXC

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

En Fedora o similar, ingresa:

$ sudo dnf install lxc lxc-templates lxc-doc

En Debian, Ubuntu y similares, ingrese:

$ sudo apt install lxc

Creando un puente de red

La mayoría de los contenedores asumen que habrá una red disponible y la mayoría de las herramientas de contenedor esperan que el usuario pueda crear dispositivos de red virtual. La unidad más básica necesaria para los contenedores es el puente de red, que es más o menos el software equivalente a un conmutador de red. Un conmutador de red es un poco como un adaptador en Y inteligente que se usa para dividir un conector de auriculares para que dos personas puedan escuchar lo mismo con auriculares separados, excepto que en lugar de una señal de audio, un conmutador de red une los datos de la red.

Puede crear su propio puente de red de software para que su computadora host y su sistema operativo contenedor puedan enviar y recibir diferentes datos de red a través de un solo dispositivo de red (ya sea su puerto Ethernet o su tarjeta inalámbrica). Este es un concepto importante que a menudo se pierde una vez que se gradúa de la generación manual de contenedores, porque sin importar el tamaño de su implementación, es muy poco probable que tenga una tarjeta de red física dedicada para cada contenedor que ejecute. Es vital comprender que los contenedores se comunican con los dispositivos de red virtual, para que sepa dónde comenzar a solucionar problemas si un contenedor pierde su conexión de red.

Para crear un puente de red en su máquina, debe tener los permisos apropiados. Para este artículo, use el sudo comando para operar con privilegios de root. (Sin embargo, los documentos de LXC proporcionan una configuración para otorgar a los usuarios permiso para hacer esto sin usar sudo .)

$ sudo ip link add br0 type bridge

Verifique que se haya creado la interfaz de red imaginaria:

$ sudo ip addr show br0
7: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc
   noop state DOWN group default qlen 1000
   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff

Desde br0 se ve como una interfaz de red, requiere su propia dirección IP. Elija una dirección IP local válida que no entre en conflicto con ninguna dirección IP existente en su red y asígnela a br0 dispositivo:

$ sudo ip addr add 192.168.168.168 dev br0

Y finalmente, asegúrese de que br0 está en funcionamiento:

$ sudo ip link set br0 up

Configuración de la configuración del contenedor

El archivo de configuración para un contenedor LXC puede ser tan complejo como debe ser para definir el lugar de un contenedor en su red y el sistema host, pero para este ejemplo, la configuración es simple. Cree un archivo en su editor de texto favorito y defina un nombre para el contenedor y la configuración requerida de la red:

lxc.utsname = opensourcedotcom
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 4a:49:43:49:79:bd
lxc.network.ipv4 = 192.168.168.1/24
lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596

Guarde este archivo en su directorio de inicio como mycontainer.conf .

El lxc.utsname es arbitrario Puedes llamar a tu contenedor como quieras; es el nombre que usará al iniciarlo y detenerlo.

El tipo de red se establece en veth , que es una especie de cable de conexión Ethernet virtual. La idea es que el veth la conexión va desde el contenedor hasta el dispositivo puente, que está definido por lxc.network.link propiedad, establecida en br0 . La dirección IP del contenedor está en la misma red que el dispositivo puente pero es única para evitar colisiones.

Con la excepción del veth tipo de red y el arriba indicador de red, inventa todos los valores en el archivo de configuración. La lista de propiedades está disponible en man lxc.container.conf . (Si falta en su sistema, busque en su administrador de paquetes paquetes de documentación LXC separados). Hay varios archivos de configuración de ejemplo en /usr/share/doc/lxc/examples , que deberías revisar más tarde.

Lanzamiento de un shell de contenedor

En este punto, está a dos tercios del camino hacia un contenedor operativo:tiene la infraestructura de red y ha instalado las tarjetas de red imaginarias en una PC imaginaria. Todo lo que necesita ahora es instalar un sistema operativo.

Sin embargo, incluso en esta etapa, puede ver LXC en funcionamiento al iniciar un shell dentro de un espacio contenedor.

$ sudo lxc-execute --name basic \
--rcfile ~/mycontainer.conf /bin/bash \
--logfile mycontainer.log
#

En este contenedor muy básico, observe la configuración de su red. Debería parecerle familiar, pero único, para usted.

# /usr/sbin/ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state [...]
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
[...]
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> [...] qlen 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
   valid_lft forever preferred_lft forever
inet6 2003:db8:1:0:214:1234:fe0b:3596/64 scope global
   valid_lft forever preferred_lft forever
[...]

Su contenedor es consciente de su infraestructura de red falsa y de un núcleo familiar pero único.

# uname -av
Linux opensourcedotcom 4.18.13-100.fc27.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Utilice la salida comando para salir del contenedor:

# exit

Instalación del sistema operativo del contenedor

La creación de un entorno completamente en contenedores es mucho más compleja que los pasos de red y configuración, por lo que puede tomar prestada una plantilla de contenedor de LXC. Si no tiene plantillas, busque un paquete de plantillas LXC separado en su repositorio de software.

Las plantillas LXC predeterminadas están disponibles en /usr/share/lxc/templates .

$ ls -m /usr/share/lxc/templates/
lxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos, lxc-cirros, lxc-debian, lxc-download, lxc-fedora, lxc-gentoo, lxc-openmandriva, lxc-opensuse, lxc-oracle, lxc-plamo, lxc-slackware, lxc-sparclinux, lxc-sshd, lxc-ubuntu, lxc-ubuntu-cloud

Elija su favorito, luego cree el contenedor. Este ejemplo usa Slackware.

$ sudo lxc-create --name slackware --template slackware

Ver cómo se ejecuta una plantilla es casi tan educativo como construir una desde cero; es muy detallado, y puedes ver que lxc-create establece la "raíz" del contenedor en /var/lib/lxc/slackware/rootfs y se están descargando e instalando varios paquetes en ese directorio.

La lectura de los archivos de plantilla le brinda una idea aún mejor de lo que implica:LXC configura un árbol de dispositivos mínimo, archivos de spool comunes, una tabla de sistemas de archivos (fstab), archivos de inicio, etc. También evita que se inicien algunos servicios que no tienen sentido en un contenedor (como udev para la detección de hardware). Dado que las plantillas cubren un amplio espectro de configuraciones típicas de Linux, si tiene la intención de diseñar la suya propia, es aconsejable basar su trabajo en una plantilla más cercana a lo que desea configurar; de lo contrario, seguramente cometerá errores de omisión (al menos) que el proyecto LXC ya ha tropezado y contabilizado.

Una vez que haya instalado el entorno de sistema operativo mínimo, puede iniciar su contenedor.

$ sudo lxc-start --name slackware \
--rcfile ~/mycontainer.conf

Ha iniciado el contenedor, pero no se ha adjuntado a él. (A diferencia del ejemplo básico anterior, esta vez no solo está ejecutando un shell, sino un sistema operativo en contenedor). Adjunte a él por nombre.

$ sudo lxc-attach --name slackware
#

Compruebe que la dirección IP de su entorno coincida con la de su archivo de configuración.

# /usr/sbin/ip addr SHOW | grep eth
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...] 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0

Salga del contenedor y apáguelo.

# exit
$ sudo lxc-stop slackware

Ejecución de contenedores del mundo real con LXC

En la vida real, LXC facilita la creación y ejecución de contenedores seguros y protegidos. Los contenedores han recorrido un largo camino desde la introducción de LXC en 2008, así que aproveche la experiencia de sus desarrolladores.

Si bien las instrucciones de LXC en linuxcontainers.org simplifican el proceso, este recorrido por el lado manual de las cosas debería ayudarlo a comprender lo que sucede detrás de escena.


Linux
  1. Comience con NetworkManager en Linux

  2. Programación de tareas con el comando cron de Linux

  3. Programar una tarea con Linux al mando

  4. Analizar el kernel de Linux con ftrace

  5. Introducción a los cortafuegos de Linux

Haga que Linux sea más fuerte con firewalls

Aprende Linux con la Raspberry Pi

Network Manager en Linux con ejemplos

Vaya detrás de escena con una instalación de Postman y una guía práctica

Asegure Linux con el archivo Sudoers

Cómo configurar una red externa para contenedores en contenedores de Linux (LXC)