Incus
Actualizado a 21 de agosto de 2026
Artículo en redacción.
Esta tecnología puede ser un reemplazo adecuado para
Vagrant
incus proporciona soporte para:
- contenedores de sistema (VM simulada con mismo kernel que el
host) - contenedores de aplicaciones
- máquinas virtuales (VM con kernel propio)
Mientras, puedes revisar ésta web o la doc oficial.
Instalación¶
Ver doc oficial
Sin ROOT¶
Añadimos el grupo incus-admin al usuario actual y luego cargamos el grupo:
sudo usermod -aG incus-admin $USER
newgrp incus-admin
Si lo anterior no te funcionara, hazlo así:
sudo adduser $USER incus-admin
newgrp incus-admin
Configuración inicial¶
Usando incus admin init --minimal o mediante un yml:
cat <<EOF | incus admin init --preseed
config:
# Socket de escucha del servicio
core.https_address: 192.0.2.1:9999
# Intervalo de actualización (horas)
images.auto_update_interval: 15
networks:
# Bridge de red para los contenedores y mv
- name: incusbr0
type: bridge
config:
ipv4.address: auto
ipv6.address: none
EOF
Empleamos la técnica de "here document" `<<EOF` para crear un documento al vuelo que,
con la tubería `|`, pasamos al comando `incus`.
La configuración por defecto se guarda en
$HOME/.config/incus/config.yml, pero puede cambiarse con la variable de entornoINCUS_CONF.
Una vez creada la configuración inicial, podemos invocar el WebUI con incus webui y continuar la configuración de forma gráfica
Crear storage-pool¶
A menudo es recomendable mover la ubicación de las imágenes para lo que crearemos un un nuevo storage pool.
Luego modificaremos el perfil default para tomar este nuevo pool.
Lo básico¶
🔧 Configuración de Incus con YAML (reemplaza Vagrantfile)¶
Incus no usa Vagrantfile ni docker-compose.yml, pero sí permite definir contenedores en archivos YAML que puedes versionar y reutilizar. Es el equivalente más cercano.
1. Estructura básica de un archivo YAML para Incus¶
Crea un archivo como my-container.yaml:
# Configuración del contenedor (reemplaza "my-app-container" por tu nombre)
name: my-app-container
architecture: x86_64
description: "App container with Nginx"
config:
limits.cpu: "2" # Límite de CPU
limits.memory: "2GB" # Límite de memoria
user.user-data: | # Datos de inicio (como cloud-init)
# Instala Nginx al crear el contenedor
# (equivalente a `config.vm.provision` en Vagrant)
# !/bin/bash
apt update && apt install -y nginx
devices:
eth0:
name: eth0
type: nic
nictype: bridged
parent: br0 # Red de tu sistema (ej: bridge "br0")
app-data:
path: /app # Monta tu código en el contenedor
source: /home/user/proyecto # Ruta local en tu host
type: disk
port-80:
name: port-80
type: proxy
listen: tcp:0.0.0.0:8080
connect: tcp:127.0.0.1:80
2. Cómo usarlo (reemplaza vagrant up)¶
# 1. Importa e instancia imagen, y corre contenedor:
incus launch images:ubuntu/24.04
# ... o en modo MV:
incus launch images:ubuntu/24.04 --vm
# 2. Importa el contenedor desde el YAML
incus import my-container.yaml
# 3. Inicia el contenedor
incus start CONTENEDOR
# 4. Verifica estado
incus list
# 5a. Entra en CLI del contenedor (con usuario)
incus console CONTENEDOR
# 5b. Ejecutar shell (sh|bash|...) en el contenedor (como root)
incus shell CONTENEDOR
# 5c. Visualiza el contenedor (GUI)
incus console CONTENEDOR -t vga
# 6. Detiene contenedor
incus stop CONTENEDOR
# 7. Elimina contenedor
incus delete CONTENEDOR
# 8. Copiar contenedor
incus copy CONTENEDOR NUEVO
💡 Nota:
-user.user-dataes el equivalente aconfig.vm.provisionen Vagrant (ej: instalar paquetes al crear el contenedor).
-devicesdefine redes, volúmenes y puertos (reemplazaconfig.vm.networkyconfig.vm.synced_folder).
3. ¿Por qué no hay docker-compose.yml en Incus?¶
| Docker Compose | Incus |
|---|---|
| Diseñado para orquestar múltiples contenedores (ej: app + DB). | Gestiona contenedores individuales (no está pensado para orquestar múltiples). |
| Usa YAML para definir relaciones entre contenedores. | No hay "relaciones" entre contenedores (cada contenedor es independiente). |
Ejemplo: services: app, db. |
Ejemplo: Cada contenedor tiene su propio YAML (ej: app.yaml, db.yaml). |
✅ Solución para múltiples contenedores:
Usa scripts de Bash para crear/arrancar varios contenedores definidos por YAML:
# Crea y arranca 2 contenedores
incus import app.yaml
incus import db.yaml
incus start app-container
incus start db-container
📌 Ejemplo práctico: Migrar un Vagrantfile a Incus YAML¶
Vagrantfile original¶
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/bionic64"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.synced_folder ".", "/app"
config.vm.provision "shell", inline: "apt update && apt install -y nginx"
end
Equivalente en Incus YAML (app.yaml)¶
name: app-container
config:
user.user-data: |
# Instala Nginx al crear el contenedor
# (equivalente a provision)
apt update && apt install -y nginx
devices:
eth0:
name: eth0
type: nic
nictype: bridged
parent: br0
app-data:
path: /app
source: /home/user/proyecto
type: disk
port-80:
name: port-80
type: proxy
listen: tcp:0.0.0.0:8080
connect: tcp:127.0.0.1:80
⚙️ Herramientas adicionales para automatizar¶
1. Incus Profiles¶
Para configuraciones reutilizables:
# Crea un perfil base (ej: para todos los contenedores)
incus profile create dev-profile
incus profile set dev-profile limits.cpu 2
incus profile set dev-profile limits.memory 2GB
# Aplica el perfil al contenedor
incus profile assign app-container dev-profile
2. Script para gestionar múltiples contenedores¶
start-all.sh:
#!/bin/bash
incus import app.yaml
incus import db.yaml
incus start app-container
incus start db-container
📚 Recursos clave para YAML en Incus¶
- Documentación oficial:
Incus Instance Configuration (YAML) - Ejemplo de YAML real:
Incus GitHub - Examples - Generador automático:
Usaincus config show my-container > container.yamlpara exportar una configuración existente.
💡 Consejo final¶
- No esperes un reemplazo "1:1" de Vagrant: Incus es más ligero y rápido que Vagrant (contenedores vs VMs), pero requiere ajustar tu mentalidad (ej: no hay "boxes", sino imágenes de contenedores).
- Empieza con un contenedor simple: Usa
incus launch ubuntu:22.04 my-containery luego exporta su configuración a YAML para versionarla. - Para múltiples contenedores: Combina YAML + scripts Bash (no necesitas Docker Compose).
✅ Ejemplo de flujo migrado:
# 1. Crea el contenedor desde YAML
incus import app.yaml
# 2. Inicia el contenedor (reemplaza "vagrant up")
incus start app-container
# 3. Accede al contenedor (reemplaza "vagrant ssh")
incus exec app-container -- bash
¡Con esto tendrás un flujo más rápido y ligero que Vagrant, sin depender de HCP! 🚀
Networking¶
Por favor, lee TODO antes de hacer nada.
Este punto es delicado por lo que vamos a comenzar viendo que es lo que queremos hacer, pero NO vamos a realizarlo. sólo ver.
En el enlace anterior se explica que queremos hacer y se realiza con una herramienta bridge-utils ya deprecated.
Después continuaremos con una orientación de que es lo que vamos ha hacer, pero aún NO haremos nada.
Aun vez que tenemos una idea de que vamos a hacer, crearemos el bridge y luego lo tomaremos como padre del perfil de red de incus con parent=br0 o de forma gráfica con WebUI:
perfil ➡️ device ➡️ network ➡️ edit ➡️ *Network ➡️
br0(bridge)
Crear bridge