Skip to content

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 entorno INCUS_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-data es el equivalente a config.vm.provision en Vagrant (ej: instalar paquetes al crear el contenedor).
- devices define redes, volúmenes y puertos (reemplaza config.vm.network y config.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

  1. Documentación oficial:
    Incus Instance Configuration (YAML)
  2. Ejemplo de YAML real:
    Incus GitHub - Examples
  3. Generador automático:
    Usa incus config show my-container > container.yaml para 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-container y 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

Fuentes