Docker

Daemon de Docker en el VPS y apps como proyectos Compose: imagen, registro privado, repo o Compose, con HTTPS opcional.

  • Categoría: Servidores e infraestructura
  • Estado: Disponible
  • Requisitos: Un VPS activo con la función docker disponible (Ubuntu 22.04 la tiene); Al menos 256 MB de RAM libre y 1 GB de disco libre medidos; Ser miembro con acceso al VPS para instalar; admin para desinstalar
  • Herramientas MCP (Solo leen): ver_catalogo_apps, ver_preflight_app, listar_apps_empresa, ver_app, ver_operacion_app
  • Herramientas MCP (Escriben o modifican): instalar_app, controlar_app, reintentar_operacion_app, refrescar_apps
  • Herramientas MCP (Destructivas): desinstalar_app

Markdown

¿Qué permite hacer?

Docker en ArduMaker tiene dos partes: el daemon, que es una capacidad del VPS, y las apps Docker, cada una un proyecto Compose propio que la plataforma escribe, levanta, observa y da de baja.

  • Instalar el daemon con un clic (o dejar que lo instale la primera app que lo necesite).
  • Desplegar una imagen pública, una imagen de un registro privado con token, o un repo de GitHub con Dockerfile.
  • Desplegar un Compose avanzado (como objeto JSON) con varios servicios.
  • Iniciar, detener y reiniciar el proyecto, y publicarlo con HTTPS si expone un puerto web.
  • Desde la pestaña Docker del VPS: listar contenedores, ver sus logs, detenerlos, reiniciarlos o borrarlos, y ver imágenes, volúmenes y redes.

¿Cuándo conviene usarlo?

  • Una aplicación ya empaquetada como imagen (un panel, una herramienta interna, un servicio de terceros).
  • Varios servicios que se levantan juntos con Compose.
  • Para código propio en GitHub con un proceso que no es Docker conviene el deploy desde GitHub.

¿Cómo funciona en ArduMaker?

El daemon

Los VPS nuevos nacen con los permisos de contenedor que Docker necesita, sin ser privilegiados. Un VPS viejo que no los tiene los recibe al instalar Docker y necesita un reinicio (el preflight avisa con requiere_reinicio_vps). El daemon se instala con el paquete docker.io y fuse-overlayfs, con userns-remap activado: los procesos de los contenedores no corren como el root real del VPS.

Una app Docker

  1. Se valida la configuración y el preflight (función del sistema, Docker posible en el host, memoria y disco).
  2. Si el daemon falta, se instala; si otra instalación está en curso, la operación espera y se reintenta.
  3. Se escribe /opt/ardumaker-apps/app<id>/docker-compose.yml (con copia del anterior) y se valida con docker compose config; si no valida, se restaura el anterior.
  4. Se corre docker compose -p app<id> up -d --remove-orphans como paso largo, así una descarga pesada no corta por tiempo.
  5. Si hay port, se publica con HTTPS y se verifica el enlace.

Todos los contenedores llevan la etiqueta ardumaker.app_id y el proyecto se llama app<id>: el nombre no lo elige el usuario y la plataforma nunca toca nada fuera de él. Repetir el despliegue es idempotente: el mismo archivo y up -d no recrean lo que no cambió.

¿Qué cambia realmente?

QuéDónde
Archivo Compose/opt/ardumaker-apps/app<id>/docker-compose.yml
Código clonado (modo repo)/opt/ardumaker-apps/app<id>/src
Datos con ruta relativa/opt/ardumaker-apps/app<id>/datos
Volúmenes con nombrePropios del proyecto (data<i> en modo simple)
Token de registro privadoCifrado en la plataforma; el VPS hace docker login con el token por stdin

Configuración de una app Docker

ModoClaves
Imagenimage, port, container_port, env (hasta 50), volumes, health_path, registry
Repo de GitHubrepo_id, branch, port, container_port, env, volumes, health_path
Compose avanzadocompose (objeto JSON, no YAML) y port opcional
  • image, compose y repo_id son excluyentes.
  • port es el puerto del VPS (desde 1024 y nunca uno protegido); con port hace falta container_port. "auto" toma uno libre.
  • Los puertos se publican solo en 127.0.0.1: un contenedor nunca queda abierto directo a internet.
  • En env no se aceptan nombres de secreto (*_PASSWORD, *_TOKEN…): la configuración no guarda secretos.

Qué se rechaza en un Compose

Cada servicio admite una lista blanca de claves (image, command, entrypoint, environment, ports, volumes, restart, depends_on, healthcheck, working_dir, user, expose, networks, mem_limit, cpus, labels, tmpfs, stop_grace_period, read_only, init). Se rechaza con un código por ruta (compose.services.<servicio>.<clave>):

CódigoQué lo dispara
privilegedprivileged, devices, security_opt, userns_mode
network_mode_hostnetwork_mode: host
pid_hostpid o ipc del host
cap_addCapacidades extra
docker_socketMontar docker.sock, /run o /var/run
host_mountRutas absolutas, ~ o .. (solo ./algo dentro del directorio propio)
puerto_publicoCualquier puerto que no sea 127.0.0.1:H:C

Tampoco se aceptan build, container_name, env_file, configs, secrets, extends ni name, ni etiquetas com.docker.* o ardumaker.*.

Desinstalar y datos

La baja corre docker compose down --remove-orphans, fuerza el borrado de los contenedores con la etiqueta del proyecto y borra el archivo Compose. Los volúmenes y la carpeta ./datos quedan, salvo que se pida borrar datos: entonces corre down -v y borra la carpeta del proyecto. Nada fuera de app<id> se toca.

Esquema

  1. Internet: HTTPS en docker-<id> o un dominio propio
  2. nginx del VPS: server block del dominio
  3. `127.0.0.1:<port>`: único puerto publicado por el contenedor
  4. Proyecto Compose `app<id>`: contenedores con etiqueta ardumaker.app_id
  5. Volúmenes: persisten hasta que se pide borrar datos
Una app Docker publicada — Sin port no hay URL: la app se administra desde la pestaña Docker.

Resultado esperado

La app aparece en Apps con su estado observado: running si todos sus contenedores corren, stopped si todos están parados, degraded si hay mezcla y missing si no queda ninguno. Con port, la URL HTTPS aparece solo cuando el enlace respondió sin error 5xx.

docker compose -p app<id> ps
docker ps --filter label=com.docker.compose.project=app<id>

Errores y resolución

ErrorCausa¿Reintentar?
requiere_dockerEl host no soporta DockerNo
requiere_reinicio_vpsFaltan los permisos de contenedor y hay que reiniciar el VPSTras reiniciar
recursos_insuficientesMenos de 256 MB de RAM o 1 GB de disco libresTras liberar recursos
docker_instalandose / docker_no_instaladoEl daemon se está instalando o no pudo arrancarSí
compose_no_disponible / despliegue_fallido / baja_fallidaNo se pudo preparar Compose, falló el pull o el arranque, o el down no terminóSí (up -d y down son idempotentes)
compose_invalidodocker compose config rechazó el archivo; se restauró el anteriorNo, hay que corregirlo
puerto_ocupadoOtra app del VPS publica o declara ese puertoCon otro puerto
config_invalidaClave no permitida o secreto en env; fields dice cuálCorrigiendo el pedido

Relación con MCP

Las apps Docker se operan por MCP con las herramientas de Apps; la referencia está en /mcp/docs y /mcp/servicios.

  • Lectura: ver_catalogo_apps, ver_preflight_app (valida la config exacta antes de instalar), listar_apps_empresa, ver_app, ver_operacion_app.
  • Modifican: instalar_app con app_type: docker (exige idempotency_key), controlar_app (start, stop, restart), reintentar_operacion_app, refrescar_apps.
  • Destructiva: desinstalar_app (solo admin, confirm=true; los volúmenes se borran solo con delete_data y confirm_delete_data).

Funciones relacionadas