Trabajar con Linux Containers – LXC
Hoy vamos a ver cómo crear y manejar Linux Containers o LXC desde la línea de comandos. Se trata de un producto similar a los contenedores OpenVZ, pero más moderno y con más funciones. De hecho, PROXMOX, desde la versión 4, los sustituyo por estos. Recordad que un contenedor es una tecnología de virtualización a nivel de sistema operativo para Linux. Digamos que un servidor físico puede ejecutar múltiples instancias de sistemas operativos aislados, conocidos como Servidores Virtuales Privados (VPS) o Entornos Virtuales (EV) No lo debemos confundir con una máquina virtual. Simplificando, provee de un entorno virtual con su propio espacio de procesos y redes. A nivel de licencia utiliza de software libre, como GPL y BSD, para sus diferentes componentes.
¿Cómo se definen los LXC?
Si indagamos un poco en su web, podemos obtener una definición ciertamente exacta. Se define como una interfaz de usuario para las funciones del contenido del núcleo de Linux. Utiliza una potente API y una serie de herramientas simples, que permite a los usuarios crear y manejar fácilmente sistemas y aplicaciones en contenedores.
Utiliza las siguientes características del núcleo:
- Espacio de nombres del kernel (ipc, uts, mount, pid, network y user)
- Apparmor y SELinux
- Políticas Seccomp
- Chroots, utilizando pivot_root
- Capacidades del Kernel
- CGroups
Un contenedor se podría considerar como algo intermedio entre un Chroot y una máquina virtual. Según leemos “El objetivo de LXC es crear un entorno lo más cerca posible a una instalación estándar de Linux pero sin la necesidad de un núcleo separado.”
Actualmente se divide en los siguientes componentes:
- Librería liblxc
- Varios lenguajes disponibles para la API (python3, lua, Go, ruby, python2 y haskell)
- Un set de herramientas para interactuar con los contenedores
- Plantillas con diferentes versiones de distribuciones GNU Linux
Instalación en Debian Jessie
Para el laboratorio de pruebas utilizaré una distribución Debian, en su versión 8.2 En mi laptop dual core Toshiba del año 2010. No es un hardware muy potente, pero creo que es una buena manera de medir el usuo de recursos y la usabilidad de los contenedores. Primero de todo debemos instalar los paquetes básicos. Después de realizar una actualización de los repositorios, instalaremos el paquete lxc, que nos permitirá instalar y trabajar con ellos. También la paquete libvirt-bin, que funciona a modo de API, para interactuar con las últimas versiones del kernel de Linux. Y por último el paquete debootstrap, que permite instalar Debian en una subcarpeta de otro sistema. También se necesita el paquete bridge-utils, pero ya lo tenemos instalado.
aptitude update
aptitude install lxc libvirt-bin debootstrap
Una vez instalados los programas y dependencias. Verificaremos la configuración por defecto con el siguiente comando:
lxc-checkconfig
Una muestra:
Antes de continuar y empezar a trabajar, debemos configurar, almenos en la configuración que yo he probado y me ha funcionado, el modo public bridge. Para que así LXC pueda utilizar la red. Una vez hecho nos podemos descargar la primera plantilla, que también será Debian 8. Indicamos la ubicación de la URL y algunos datos más.
LANG=C SUITE=jessie MIRROR=http://httpredir.debian.org/debian lxc-create -n debian8 -t debian
El proceso es algo lento, depende mucho de nuestra conexión y la capacidad de CPU del equipo. Otra forma de realizar la misma tarea sería la siguiente:
lxc-create -n debian8 -t debian -- -r jessie
¡Ojo! Al crear el contenedor, nos dará una contraseña de root, que debemos apuntar! Una vez hecho esto debemos configurar la red del nuevo contenedor. Los ficheros de configuración de estos están ubicados en /var/lib/lxc, justo en la carpeta con su nombre, en nuestro caso /var/lib/lxc/debian8/ Debemos configurar la red, para que utilice la interfaz recién configura, en mi caso llamada «br0» Añadimos al fichero /var/lib/lxc/debian8/config, los siguientes parámetros:
lxc.utsname = debian8
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 0.0.0.0/24
El fichero de configuración, en el contenedor configurado para el artículo, se muestra así:
Interactuar con los contenedores
Si queremos encender, apagar o acceder a uno de ellos, debemos utilizar una serie de órdenes.
#Para encender un contenedor
lxc-start -n nombre-contenedor -d
#Para apagar un contenedor
lxc-stop -n nombre-contenedor
#Para acceder a la consola del contenedor
lxc-console -n nombre-contenedor
#Para obtener información de un contenedor
lxc-info -n nombre-contenedor
#Para destruir un contenedor
lxc-destroy -n nombre-contenedor
Comentario importante, para salir de la consola y volver al host, debemos utilizar la combinación de teclas «<ctrl>+a» y después la tecla «q» Una vez dicho esto, os voy hablar de un comando muy útil, que nos permite listar los contenedores y sus estado. Concretamente es lxc-ls, que usariamos de la siguiente manera:
lxc-ls --fancy
En mi laptop, ya me ha dado tiempo a configurar dos, tal y como se muestra:
Por último un parámetro muy interesante. Si queremos que al encender el host anfitrion se enciendan los contenedores, debemos añadir en el fichero de configuración ubicado en /var/lib/lxc/contenedor/config
lxc.start.auto = 1
Y de momento lo dejamos aquí. En próximos capítulos iremos viendo más cosas. Si queréis ampliar información al respecto os dejo varios enlaces:
Por fin un tuto en español.
Qué gran trabajo, gracias.
Gracias Jock. Tengo más artículos en mente, para tratar los diferentes modos de configurar la red o la creación de instantaneas o snapshots.
Saludos!
Iba a decir lo mismo que @jock, se habla mucho de los linux containers pero no hay demasiado información práctica, así que bienvenido este post y otros tutos que hagas en un futuro.
Un saludo colega!
Los tengo en mente y ya sé más o menos de que irán, todo es ponerme 🙂 Estad atentos!
Hola, antes de nada, enhorabuena por el bloq que sigo a diario.
Me ha venido de maravilla este tuto ya que ando estos días probando la ultima proxmox y migrando openvz que ya tengo a lxc para ver como se comporta. Y sinceramente, LXC no me agrada mucho comparado con ovz. Vosotros que opináis? lo veis para meterlo en producción?
Un saludo!
KVM/QUEMU esta al mismo nivel que VirtualBox? Tras los de Containers que tienes en mente como continuación de este, que me parece super interesante, pues llevo tiempo tratando de saber más de LXC, estaría bien ver Docker por un lado, KVM, por otro, y Chroot finalmente.
Gracias.
Hola Alex
,
De KVM/QEMU ya he hablado en la web, es más para entornos de producción o alto rendimiento. VirtualBox es para entornos domésticos. De Docker también tengo algún artículo, aunque quizás no es un tema que haya tratado en profundidad. Chroot es un tema que tengo pendiente, que espero tratar en breve.
Saludos!
Hola no se si te ha ocurrido pero hasta ahora no he podido configurr bridge para poder comunicar un contenedor con el host
Hola,
¿Has realizado los pasos que indico en esta entrada?
https://www.ochobitshacenunbyte.com/2014/09/30/configuracion-de-red-en-kvm-en-modo-public-bridge/
Saludos
Respondo el post que indicas, gracias
Disculpa mi ignorancia en el tema. Me gustaría saber ¿si en alguno de los contenedores, ya sea LXC o Docker se puede instalar un entorno gráfico de linux?
Hola,
Los contenedores están enfocados en crear y gestionar microservicios, por lo que no, no están pensados para hacer funcionar escritorios. Aunque poderse hacer se puede hacer.
Saludos!!!