LXC es una interface de espacio de usuario para el soporte de contenedores sobre el kernel de Linux. Permite crear y administrar contenedores de sistemas o aplicaciones a través de herramientas sencillas y una potente API.
Los contenedores LXC frecuentemente son considerados como algo entre chroot y una máquina virtual. El objetivo fundamental de LXC es crear un entorno lo más cercano posible a una instalación estándar de Linux, pero sin la necesidad de un kernel independiente.
LXC actualmente se compone de varios componentes individuales: la biblioteca liblxc, varios bindings de lenguajes de programación para la API, tales como: Python 2 y 3, Lua, Go, Ruby y Haskell, un conjunto de heramientas estándar para controlar los contenedores, además de plantillas de contenedores de distribución.
LXC 2.0 y 3.0 son versiones LTS (soporte extendido), la primera tendrá soporte hasta junio de 2021 y la última hasta junio de 2023. La versión 2.0 está disponible en Debian Stretch y la 3.0 en Debian Buster.
apt install lxc
El paquete lxc
instala bridge-utils
y dnsmasq-base
, necesarios para el correcto funcionamiento de la herramienta lxc-net
, que permite configurar un bridge simple para los contenedores. Sin embargo, podemos prescindir de esta herramienta como se verá más adelante. Esta guía utiliza el modelo de red en el que se usa un bridge compartido entre el host y los guests.
Los paquetes de Debian no incluyen ninguna configuración de red por defecto para los contenedores. El archivo /etc/lxc/default.conf
contiene solamente el valor lxc.network.type = empty
.
A un contenedor típico se le puede asignar su propia interface de red física (phys) o puede tener un dispositivo virtual (veth) el que puede ser puesto directamente en un dispositivo de red con bridge compartido con el host. También puede ser colocado en un dispositivo de red con bridge al que se le asigna una red interna y se enmascara para acceder hacia redes externas.
En este caso se hará uso de veth con host-shared bridge. Editar el archivo /etc/network/interfaces
como sigue:
# The loopback netwok interface
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
bridge_ports enp0s3
bridge_fd 0
address 192.168.0.100
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.1.255
gateway 192.168.0.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.0.1
dns-search dominio.tld
En la configuración anterior se hace uso de una dirección de red estática, de existir un servidor DHCP se debe configurar como sigue:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports enp0s3
bridge_fd 0
bridge_maxwait 0
Reiniciar el host
La sección network
en la configuración del contenedor, almacenada en el host en /var/lib/lxc/nombre-del-contenedor/config
luciría como sigue:
## Network
lxc.utsname = nombre-del-contenedor
lxc.network.type = veth
lxc.network.flags = up
# Interface del bridge definida en el host
lxc.network.link = br0
# Nombre del dispositivo de red en el contenedor
# por defecto eth0, aunque se puede seleccionar cualquier otro
# lxc.network.name = lxcnet0
# Dirección física del dispositivo de red
lxc.network.hwaddr = 00:FF:AA:00:00:01
# En el caso de usar DHCP se puede omitir esta línea
# o establecer 0.0.0.0/24
lxc.network.ipv4 = 192.168.0.101/24
# Puerta de enlace
lxc.network.ipv4.gateway = 192.168.0.1
Es posible también utilizar una plantilla para los nuevos contenedores. Editar el archivo /etc/lxc/default.conf
como sigue:
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx
Crear contenedores
Los contenedores se descargan utilizando debootstrap
, posteriormente un sistema Debian mínimo se instala en /var/lib/lxc/rootfs
listo para ejecutarse y ser usado.
lxc-create -n -t debian -- -r stretch
Si se accede a Internet a través de un proxy, es posible especificarlo en variables de entorno para descargar los archivos del contenedor.
export http_proxy=http://usuario:contraseña@proxy:puerto/
export https_proxy=http://usuario:contraseña@proxy:puerto/
Si se tiene un mirror del repositorio de paquetes de Debian también es posible pasar los parámetros --mirror=MIRROR
y --security-mirror=MIRROR
quedando así:
lxc-create -n -t debian -- -r stretch --mirror=http//debian.dominio.tld/stretch --security-mirror=http//debian.dominio.tld/stretch-security
Iniciar un contenedor en segundo plano
lxc-start -n nombre-del-contenedor
Ejecutar una consola en el contenedor
lxc-console -n nombre-del-contenedor
Detener un contenedor enviando un apagado limpio
lxc-stop -n nombre-del-contenedor
Detener un contenedor terminando todos los procesos activos
lxc-stop -k -n nombre-del-contenedor
Para iniciar automáticamente durante el arranque del host, editar la configuración del contenedor añadiendo lxc.start.auto = 1
.
lxc-ls --fancy
lxc-attach -n passwd
El objetivo de esta sencilla guía es tener un entorno LXC funcional sobre Debian Stretch. Como recomendación consultar el manual de cada una de las herramientas proporcionadas por LXC.
Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo…
La inteligencia artificial está revolucionando las industrias al automatizar tareas, predecir patrones y permitiendo tomar…
Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…
Percona Monitoring and Management (PMM) es una herramienta de código abierto para la supervisión y…
Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…
Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…