En esta página
En resumen: Empieza con Raspberry Pi OS de 64 bits compatible, SSH operativo y un único servicio pequeño de Docker Compose. Mantén el puerto web en localhost, entra mediante un túnel SSH y comprueba una copia antes de añadir datos importantes. Un contenedor en marcha es el inicio del laboratorio, no una prueba de que se pueda recuperar.
Construiremos un ejemplo deliberadamente sencillo: una página estática servida por nginx. Permite entender los límites entre equipo, contenedor, red y datos sin empezar desplegando una base de datos, un gestor de contraseñas o un panel de administración público. Los comandos son ejemplos propuestos, no evidencia de una prueba de AYXWORKS con ese hardware exacto.
1. Prepara un sistema limpio y define el alcance
Necesitas una Raspberry Pi adecuada para la carga prevista, alimentación y refrigeración compatibles, almacenamiento fiable y conexión de red. Una Pi 4 o Pi 5 con un sistema de 64 bits admitido es un punto de partida razonable para este ejemplo; no garantiza capacidad para cualquier servicio posterior. Consulta la documentación de la placa para almacenamiento y arranque.
Utiliza Raspberry Pi Imager y las instrucciones oficiales de acceso remoto para configurar tu cuenta y SSH. Aquí el usuario de ejemplo es labuser y el nombre del equipo, lab; sustitúyelos por los reales. Confirma SSH en tu red doméstica de confianza antes de instalar aplicaciones. Si el nombre .local no se resuelve, consulta la dirección en el router.
No reinstales la imagen de un servidor existente para seguir esta guía. La grabación borra el almacenamiento seleccionado. Usa una unidad de repuesto o respaldada y comprueba cuidadosamente el destino. Si ya hay Docker o servicios, revisa esa instalación en lugar de reemplazarla con estos comandos.
2. Verifica sistema operativo y arquitectura
En la Pi, consulta:
cat /etc/os-release
dpkg --print-architecture
uname -m
La instalación siguiente es para Raspberry Pi OS de 64 bits basado en una versión de Debian admitida. Comprueba que dpkg indica arm64 y revisa el nombre real de la versión. Las instrucciones de Docker consultadas incluyen Bookworm y Trixie entre las compatibles. Que el kernel sea de 64 bits no demuestra por sí solo que también lo sea el espacio de usuario.
Con una instalación de 32 bits, una versión no admitida u otra distribución, detente y utiliza sus instrucciones oficiales. No pongas un nombre de versión arbitrario para conseguir que el repositorio acepte el sistema.
3. Instala Docker desde el repositorio compatible
En el equipo limpio y compatible, sigue el procedimiento del repositorio Debian de Docker. Revisa las preguntas del gestor de paquetes y detente ante errores. El bloque escribe un archivo de repositorio: no sobrescribas una configuración personalizada existente sin revisarla.
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run --rm hello-world
sudo docker compose version
Las comprobaciones esperadas son un mensaje satisfactorio de hello-world y una versión de Compose, no un número de versión inventado aquí. El ejemplo mantiene sudo para administrar Docker. Como explica su documentación, pertenecer al grupo docker concede privilegios equivalentes a root; no es solo una comodidad inocua.
4. Crea un proyecto Compose aislado
El siguiente bloque se niega a sobrescribir ~/homelab/web si ya existe. Crea una página y un archivo Compose. El control de errores del subshell detiene el bloque si el directorio existe o falla un comando.
(
set -eu
test ! -e "$HOME/homelab/web"
mkdir -p "$HOME/homelab/web/site"
cd "$HOME/homelab/web"
printf '%s\n' '<!doctype html><title>Home lab</title><h1>Home lab is running</h1>' > site/index.html
cat > compose.yaml <<'YAML'
name: lab-web
services:
web:
image: nginx:stable-alpine
ports:
- "127.0.0.1:8080:80"
volumes:
- ./site:/usr/share/nginx/html:ro
restart: unless-stopped
logging:
driver: local
YAML
)
La imagen aporta el servidor web; la página permanece en el directorio site del anfitrión, montado como solo lectura en el contenedor. El puerto escucha únicamente en la dirección de bucle local de la Pi. Es intencional: no has abierto una web a la red local ni a internet. El controlador de registro local proporciona rotación acotada, evitando acumular registros predeterminados sin límite.
La etiqueta de imagen facilita empezar, pero no fija una versión inmutable. Después de probarla, registra el digest resuelto y úsalo para una instalación reproducible. Descargar la misma etiqueta meses después no garantiza obtener el mismo software.
5. Arranca y comprueba la página real
Ejecuta desde el nuevo proyecto y detente a investigar cualquier fallo:
cd "$HOME/homelab/web" || exit 1
sudo docker compose config --quiet
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
curl --fail http://127.0.0.1:8080/
La validación no debería mostrar errores, el servicio debería aparecer en marcha y curl devolver el HTML de ejemplo. Estar “running” no demuestra que la aplicación funcione. Si curl falla, revisa registros, puerto y montaje antes de instalar más software.
6. Accede desde el portátil sin publicar el puerto
En el portátil, abre el túnel SSH con la cuenta y el nombre configurados:
ssh -N -l labuser -L 127.0.0.1:8080:127.0.0.1:8080 lab.local
Deja ese terminal abierto y visita http://127.0.0.1:8080/ en el navegador del portátil. Es normal que el comando siga activo sin ofrecer una consola. Ciérralo con Ctrl+C al terminar. Si el puerto 8080 ya está ocupado en el portátil, cambia el primer puerto del argumento de reenvío y usa el nuevo en el navegador.
No añadas reenvío de puertos en el router ni expongas el socket de Docker. Los puertos publicados por Docker pueden interactuar con las reglas del cortafuegos; no presupongas que cualquier contenedor publicado queda protegido solo por tener firewall. Entrar desde fuera de casa exige un diseño de acceso revisado, no un panel abierto.
7. Revisa registros, almacenamiento e imagen probada
cd "$HOME/homelab/web" || exit 1
sudo docker compose ps
sudo docker compose logs --tail=50 web
df -h
sudo docker image inspect nginx:stable-alpine --format '{{index .RepoDigests 0}}'
Utiliza los registros de Compose para errores de la aplicación y el uso de disco para la capacidad del equipo. El último comando muestra la referencia resuelta de la imagen: consérvala con Compose al fijar una versión probada. Antes de compartir registros, comprueba que no contienen datos privados.
No despliegues una pila enorme porque funciona la primera página. Añade un servicio cada vez, revisando arquitectura, memoria, datos persistentes, credenciales, red y recuperación. Estar en un contenedor no convierte automáticamente software incompatible en software para ARM.
8. Crea y verifica una copia del ejemplo
En este ejemplo estático, el directorio del proyecto contiene datos y configuración necesarios. Sin ediciones simultáneas, ejecuta:
(
set -eu
umask 077
mkdir -p "$HOME/backups"
backup="$HOME/backups/lab-web-$(date +%Y%m%d-%H%M%S).tar.gz"
test ! -e "$backup"
tar -C "$HOME/homelab" -czf "$backup" web
gzip -t "$backup"
sha256sum "$backup"
restore=$(mktemp -d "$HOME/lab-restore.XXXXXX")
tar -xzf "$backup" -C "$restore"
cmp "$HOME/homelab/web/site/index.html" "$restore/web/site/index.html"
cmp "$HOME/homelab/web/compose.yaml" "$restore/web/compose.yaml"
printf 'Backup: %s\nRestored copy: %s\n' "$backup" "$restore"
)
El archivo se comprueba, se extrae en un directorio temporal nuevo y se compara con los originales. Los comandos cmp no imprimen nada cuando coinciden; un fallo detiene el bloque. Esto verifica recuperación de archivos, no un ensayo completo de recuperación de una aplicación en ejecución. Conserva la extracción hasta inspeccionarla.
Copia el archivo a otro equipo o destino de respaldo y protégelo. Una copia solo en la Pi se pierde con su almacenamiento. Las bases de datos requieren una copia o volcado consistente admitido por la aplicación; copiar su directorio mientras funciona no garantiza validez. Los volúmenes de Docker también necesitan un plan, como explica la documentación de volúmenes.
9. Actualiza con criterio y aprende a detenerlo
Antes de actualizar, conserva Compose, la referencia de imagen probada y la copia de datos. Revisa las notas de versión, descarga la imagen elegida, recrea el servicio y repite la comprobación. Si hay migraciones de esquema, volver a la imagen anterior puede no deshacer los datos; sigue el proceso de recuperación de la aplicación.
Para detener este ejemplo y eliminar sus contenedores y red de Compose:
cd "$HOME/homelab/web" || exit 1
sudo docker compose down
No se borra el directorio site montado desde el anfitrión. No añadas -v sin pensar a otros proyectos ni uses comandos de limpieza de volúmenes para evitar entender dónde están los datos. Puedes recrear este ejemplo con su Compose conservado y up -d.
Qué añadir cuando lo básico ya funciona
Antes de guardar información irremplazable, importan autenticación, TLS, copias externas, monitorización y una política de actualización. Incorpóralos según la aplicación real. Mantén los secretos fuera del control de versiones y limita quién administra Docker o SSH.
El primer hito es modesto: explicar dónde vive la página, cómo se accede, qué imagen la sirve, qué sobrevive al borrar el contenedor y cómo se comprobó la copia. Eso vale más que un panel lleno de servicios cuya recuperación nadie ha ensayado.
Fuentes y límites de validación
La documentación enlazada de Raspberry Pi y Docker se revisó el 14 de octubre de 2026. Debes comprobar capacidad, disponibilidad de imágenes y compatibilidad para el equipo elegido. Esta guía sustituye afirmaciones personales no demostradas por un tutorial explícito; no atribuye a AYXWORKS una instalación de hardware realizada ni una mejora de fiabilidad medida.
