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.

containers

¿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.

  1. aptitude update
  2. aptitude install lxc libvirt-bin debootstrap

Una vez instalados los programas y dependencias. Verificaremos la configuración por defecto con el siguiente comando:

  1. lxc-checkconfig

Una muestra:

contenedores-lxc-debian-001

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.

  1. 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:

  1. 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:

  1. lxc.utsname = debian8
  2. lxc.network.type = veth
  3. lxc.network.flags = up
  4. lxc.network.link = br0
  5. lxc.network.ipv4 = 0.0.0.0/24

El fichero de configuración, en el contenedor configurado para el artículo, se muestra así:

lxc-config-contenedor-2

Interactuar con los contenedores

Si queremos encender, apagar o acceder a uno de ellos, debemos utilizar una serie de órdenes.

  1. #Para encender un contenedor
  2. lxc-start -n nombre-contenedor -d
  3. #Para apagar un contenedor
  4. lxc-stop -n nombre-contenedor
  5. #Para acceder a la consola del contenedor
  6. lxc-console -n nombre-contenedor
  7. #Para obtener información de un contenedor
  8. lxc-info -n nombre-contenedor
  9. #Para destruir un contenedor
  10. 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:

  1. lxc-ls --fancy

En mi laptop, ya me ha dado tiempo a configurar dos, tal y como se muestra:

lxc-lista-contenedores

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

  1. 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:

Página web de LXC

Wiki Debian para LXC

Wiki Ubuntu LXC