Si alguna vez intentaste levantar un contenedor con docker-compose up -d y te apareció este error:

ERROR: for portainer Cannot start service portainer: AppArmor enabled on system but the docker-default profile could not be loaded

No te preocupes, es un problema común cuando ejecutas Docker dentro de entornos contenedorizados como LXC o Proxmox. Aquí te explico 3 formas de solucionarlo, desde la más rápida hasta la más permanente.


🔍 ¿Por qué ocurre este error?

Docker intenta cargar su perfil docker-default de AppArmor (un sistema de seguridad de Linux), pero el kernel del contenedor LXC no permite cargar perfiles nuevos. Esto genera el código de error exit status 185.


✅ Solución 1: Rápida (para un solo contenedor)

Añade security_opt en el servicio problemático de tu docker-compose.yml:

services:
  portainer:
    image: portainer/portainer-ce:latest
    ports:
      - "9443:9443"
    security_opt:
      - apparmor=unconfined   # 👈 línea mágica

Luego reinicia:

docker-compose down
docker-compose up -d

Ventaja: Rápido y efectivo. Desventaja: Hay que hacerlo en cada contenedor.

✅ Solución 2: Para entornos LXC/Proxmox (recomendada)

Si tu Docker corre dentro de un contenedor LXC en Proxmox, esta es la mejor solución.

  1. Edita la configuración del contenedor LXC desde el host Proxmox:
nano /etc/pve/lxc/<ID-CONTENEDOR>.conf
  1. Añade esta línea al final:
lxc.apparmor.profile: unconfined
  1. Reinicia el contenedor:
pct restart <ID-CONTENEDOR>

Ventaja: Soluciona el problema para todos los contenedores Docker dentro de ese LXC. Desventaja: Requiere acceso al host Proxmox.

✅ Solución 3: Definitiva (desactivar AppArmor en Docker)

Si no usas LXC o prefieres una solución global, este truco con systemd es ideal.

  1. Crea un “override” para el servicio Docker:
systemctl edit docker

Pega esto dentro:

[Service]
Environment=container="setmeandforgetme"
  1. Guarda (Ctrl+O), sal (Ctrl+X) y recarga:
systemctl daemon-reload
systemctl restart docker

4. Verifica que AppArmor quedó desactivado:

```bash
docker info | grep -i apparmor
# No debería mostrar nada

Ventaja: No tocas ni LXC ni cada contenedor. Desventaja: Desactiva la integración con AppArmor globalmente.

⚠️ Nota de seguridad

Desactivar AppArmor (unconfined) reduce la seguridad del contenedor. Esto está bien para:

  • Entornos de desarrollo

  • Laboratorios caseros

  • Proxmox doméstico

No lo recomiendo para servidores de producción críticos sin otras medidas como firewalls, redes aisladas o actualizaciones constantes.

📌 Resumen rápido

Situación Solución recomendada
Un solo contenedor falla Solución 1 (security_opt)
Docker dentro de LXC/Proxmox Solución 2 (editar .conf del LXC)
Quieres arreglarlo de una vez Solución 3 (systemd)

🧪 ¿Cómo probar que funcionó?

Ejecuta un contenedor de prueba:

docker run --rm -it alpine sh

Si entras al shell sin errores… ¡todo está listo!

🧠 Conclusión

El error AppArmor profile could not be loaded es más un problema de compatibilidad que un fallo real. Con cualquiera de estas 3 soluciones podrás seguir usando Docker con normalidad dentro de entornos LXC o Proxmox.

¿Sigues con problemas? Revisa que tu kernel soporte AppArmor o comenta debajo tu caso específico.

💡 ¿Te sirvió? Comparte este tutorial con alguien que también tenga problemas con Docker en Proxmox. ¡Y no olvides dejar una estrella en mi blog si te gustó el contenido!