Copia de seguridad de volúmenes en Docker: el patrón canónico
Un contenedor escribe sus datos en un volumen con nombre; ese volumen vive fuera del contenedor, gestionado por Docker. Para respaldarlo, no tocamos el contenedor de la aplicación: lanzamos un segundo contenedor alpine desechable que monta el volumen y una carpeta del host a la vez, y usa tar czf para empaquetar los datos en un único archivo. Al terminar, el contenedor se borra solo (--rm) y el .tar.gz se queda en el host.
Restaurar en un volumen nuevo
Restaurar es el mismo patrón al revés: un contenedor alpine desechable monta un volumen recién creado y la carpeta con la copia, y usa tar xzf para extraer los datos dentro. El volumen restaurado no tiene por qué llamarse igual que el original —lo comprobamos en el lab, que usa app_data_restored— porque el archivo .tar.gz no guarda ningún nombre de volumen, solo el contenido.
Cuándo usar –volumes-from
Si no recuerdas el nombre exacto del volumen pero sabes qué contenedor lo usa, docker run --volumes-from <contenedor> reutiliza sus montajes en el contenedor de backup sin que tengas que averiguar el nombre. Este lab respalda los mismos datos con ambos métodos y compara el contenido de las dos copias para demostrar que son intercambiables.
Este laboratorio encaja con nuestras guías sobre volúmenes y bind mounts en Docker, con límites de recursos y logs en Docker y con cómo instalar Portainer con Docker Compose, además del resto de laboratorios prácticos. Para profundizar, la referencia oficial está en la documentación de volúmenes de Docker y en el manual de GNU tar.
Preguntas frecuentes
¿Dónde vive físicamente un volumen Docker en el host?
Docker guarda los volúmenes con nombre bajo /var/lib/docker/volumes/ en el host, en una carpeta gestionada por el propio Docker. No se accede a esa ruta directamente: se monta el volumen por su nombre (-v app_data:/data) y es Docker quien resuelve dónde están los datos.
¿Por qué usar un contenedor alpine desechable para el backup en lugar de tar directamente en el host?
Porque no siempre tienes acceso directo (o permisos) a la ruta interna del volumen en el host, y esa ruta es un detalle de implementación que puede cambiar. Un contenedor alpine con –rm monta el volumen por su nombre, hace el tar y se borra solo: funciona igual sin importar dónde ni cómo almacene Docker el volumen por dentro.
¿Qué diferencia hay entre –volumes-from y montar el volumen con -v?
-v app_data:/data monta el volumen por su nombre exacto. –volumes-from app copia todos los montajes de otro contenedor (aquí, 'app') al contenedor de backup, sin que tengas que conocer el nombre del volumen. El resultado del backup es idéntico; –volumes-from es útil cuando solo recuerdas qué contenedor usa los datos.
¿Puedo restaurar una copia de seguridad en un volumen con un nombre distinto?
Sí. El .tar.gz no contiene ningún nombre de volumen, solo los archivos. Basta con crear un volumen nuevo, con el nombre que quieras, y extraer el archivo dentro con tar xzf: es exactamente lo que hacemos en este lab al restaurar en app_data_restored en lugar del app_data original.