Instalar en casa tus propios servicios, lo que se conoce como self-hosting, choca pronto con un problema: cada programa pide sus versiones y sus dependencias, y no siempre conviven bien en la misma máquina. Docker empaqueta cada aplicación en un contenedor con todo lo que necesita para funcionar. La documentación oficial de Docker lo define como una plataforma abierta para desarrollar, distribuir y ejecutar aplicaciones, que permite separarlas de la infraestructura.
Repasamos sus piezas (imagen, contenedor, volumen, red y Compose), en qué se diferencia de una máquina virtual y, sobre todo, qué resuelve en un servidor casero y qué deja en tus manos, con la documentación de Docker y la de Jellyfin, consultadas el 14 de octubre de 2026.
Imagen y contenedor: la plantilla y lo que se ejecuta
Una imagen es una plantilla de solo lectura con las instrucciones para crear un contenedor. Suele partir de otra imagen con algún añadido: el ejemplo de Docker es una imagen basada en la de Ubuntu que incluye además el servidor web Apache, la aplicación y la configuración que necesita para arrancar. Las tuyas se crean con un fichero llamado Dockerfile, en el que cada instrucción crea una capa; al cambiarlo, solo se reconstruyen las capas que han cambiado, y por eso las imágenes son ligeras, pequeñas y rápidas.
Las imágenes se guardan en un registro. Docker Hub es uno público que puede usar cualquiera y es donde Docker las busca por defecto, aunque también puedes montar el tuyo privado. Con docker pull o docker run, Docker baja del registro configurado la imagen que haga falta.
Un contenedor es una instancia de una imagen que se puede ejecutar: se crea, se arranca, se para, se mueve o se borra con la API o la línea de comandos de Docker. Por defecto está bastante bien aislado de los demás contenedores y de la máquina anfitriona, y lo definen su imagen y las opciones que le das al crearlo o arrancarlo. Un detalle que importa en casa: al borrar un contenedor, desaparece cualquier cambio de su estado que no esté en un almacenamiento persistente.
Por debajo, Docker funciona como cliente y servidor. La orden docker envía lo que escribes al demonio dockerd, que es quien construye, ejecuta y distribuye los contenedores y gestiona imágenes, contenedores, redes y volúmenes. Docker Desktop, la aplicación para Mac, Windows o Linux, incluye el demonio, el cliente y Docker Compose; en Windows, ese cliente se usa desde una terminal como las que explicamos en Windows Terminal y PowerShell. Docker está escrito en Go y aprovecha funciones del núcleo de Linux: usa los espacios de nombres (namespaces) para crear el espacio de trabajo aislado que es el contenedor.
Volúmenes: los datos que sobreviven al contenedor
Los volúmenes son almacenes de datos persistentes para los contenedores, creados y gestionados por Docker. Se crean a mano con docker volume create o los crea Docker al crear el contenedor, y se guardan en una carpeta de la máquina anfitriona, que es lo que se monta dentro del contenedor.
Docker los presenta como el mecanismo preferido para guardar los datos que generan y usan los contenedores. Su contenido vive fuera del ciclo de vida del contenedor: cuando este se destruye, su capa de escritura se va con él, pero el volumen sigue ahí aunque se borre el contenedor que lo usaba. Tampoco desaparece solo cuando ya no lo usa ningún contenedor; para limpiar los que sobran está docker volume prune.
La alternativa son los montajes de carpetas del anfitrión (bind mounts), que dependen de la estructura de directorios y del sistema de la máquina. Docker los recomienda cuando necesitas llegar a los ficheros tanto desde el contenedor como desde el anfitrión. La guía de instalación en contenedor de Jellyfin, el servidor multimedia de software libre, ofrece las dos vías para su configuración y su caché, y para una instalación sencilla considera más fácil usar carpetas montadas; la biblioteca de medios se monta como carpeta.
Redes y puertos publicados
Al arrancar un contenedor sin opciones de red, Docker le crea una interfaz conectada a la red predeterminada y le asigna una dirección IP; por defecto, el contenedor sale a redes externas a través de la conexión de la máquina anfitriona. Un mismo contenedor se puede conectar a una o varias redes, y el modo predeterminado es el de puente (bridge).
La página de publicación de puertos lo explica así: los puertos de los contenedores en redes puente son accesibles desde el anfitrión y desde los contenedores de la misma red, pero no desde fuera del anfitrión. Para abrir uno se publica con --publish o -p: -p 8080:80 enlaza el puerto 8080 del anfitrión con el puerto 80 del contenedor. El ejemplo de Jellyfin publica el 8096 por TCP, que es su puerto HTTP, y el 7359 por UDP, que necesita para el descubrimiento automático.
Compose: el servicio entero en un fichero
Una buena práctica de los contenedores, recuerda la página de Docker Compose, es que cada uno haga una sola cosa y la haga bien. Con varios servicios se pueden lanzar varias órdenes docker run, pero pronto hay que gestionar redes, todas las opciones para conectar los contenedores a ellas y una limpieza más complicada al terminar.
Docker Compose permite definir todos los contenedores y su configuración en un único fichero YAML, en el que cada servicio indica su imagen, sus puertos, sus volúmenes y sus redes. Es una herramienta declarativa: describes lo que quieres y, si cambias algo, vuelves a ejecutar docker compose up y Compose concilia los cambios del fichero y los aplica. No es lo mismo que un Dockerfile: este da las instrucciones para construir una imagen, y el de Compose define los contenedores que se ejecutan.
La guía de Jellyfin trae un docker-compose.yml de ejemplo con su imagen oficial, los puertos, las carpetas de configuración, caché y medios y una política de reinicio. Basta con ejecutar docker compose up en la carpeta del fichero, con -d para dejarlo en segundo plano.
Las cinco piezas, con lo que publican las documentaciones de Docker y de Jellyfin:
| Pieza | Qué es | Para qué sirve |
|---|---|---|
| Imagen | Una plantilla de solo lectura con las instrucciones para crear un contenedor | Repartir la aplicación con lo que necesita; se baja de un registro, por defecto Docker Hub |
| Contenedor | Una instancia ejecutable de una imagen, bastante aislada de los demás contenedores y del anfitrión | Ejecutar la aplicación; al borrarlo se pierde lo que no esté en almacenamiento persistente |
| Volumen | Un almacén de datos persistente creado y gestionado por Docker | Guardar los datos fuera del ciclo de vida del contenedor; se copia o migra más fácil que una carpeta montada |
| Red | La interfaz a la que Docker conecta cada contenedor; el modo predeterminado es el de puente | Comunicar contenedores de la misma red; un puerto solo sale del anfitrión si se publica con -p |
| Compose | Una herramienta declarativa que define todos los contenedores en un fichero YAML | Arrancar el conjunto y aplicar los cambios del fichero con docker compose up |
En qué se diferencia de una máquina virtual
La página que explica qué es un contenedor lo resume sin entrar en detalles: una máquina virtual es un sistema operativo entero, con su propio núcleo, sus controladores de hardware, sus programas y sus aplicaciones, y levantar una solo para aislar una aplicación supone mucha sobrecarga. Un contenedor es un proceso aislado con los ficheros que necesita para funcionar; si ejecutas varios, todos comparten el mismo núcleo, y eso permite meter más aplicaciones en menos infraestructura.
No se excluyen: Docker explica que a menudo se usan juntos, porque en la nube las máquinas suelen ser virtuales y una con un motor de contenedores puede ejecutar varias aplicaciones en lugar de una sola. Su página de presentación lo define como una alternativa viable y económica a las máquinas virtuales basadas en hipervisor, ideal para despliegues pequeños y medianos en los que hay que hacer más con menos recursos.
Qué resuelve en un servidor de casa
Las dependencias. La documentación plantea la pregunta tal cual: cómo asegurarte de que la versión de Python, de Node o de la base de datos que necesita una aplicación no se ve afectada por lo que ya tienes instalado, y cómo gestionar los conflictos. Según Docker, cada contenedor es autosuficiente: tiene todo lo que necesita para funcionar, sin depender de nada preinstalado en la máquina.
El aislamiento. Como se ejecutan aislados, los contenedores influyen poco en el anfitrión y en los demás contenedores, lo que aumenta la seguridad de las aplicaciones. Además, cada uno se gestiona por separado: borrar un contenedor no afecta a los demás, así que quitar un servicio que ya no usas no toca al resto.
Las actualizaciones. Se apoyan en las etiquetas de las imágenes. Jellyfin publica su imagen oficial en Docker Hub y en el registro de contenedores de GitHub, para varias arquitecturas, basada en Debian y compilada directamente desde su código fuente. La etiqueta latest sigue siempre la última versión estable, incluidos los saltos de versión mayor y menor, mientras que otras como 10.11 o 10.11.0 siguen una versión menor o fijan una versión concreta. Y como los datos de un volumen viven fuera del ciclo de vida del contenedor, siguen ahí aunque este se borre.
Lo que Docker no resuelve
Las copias de seguridad. Los volúmenes se copian o migran más fácil que las carpetas montadas, y la documentación explica cómo hacerlo: un contenedor temporal monta el volumen y empaqueta su contenido en un fichero backup.tar con tar, y otro lo devuelve a su sitio. Pero lo presenta como técnicas que puedes automatizar con tus herramientas preferidas: la copia la programas tú.
La seguridad de los puertos expuestos. Docker lo advierte en un recuadro: publicar los puertos de un contenedor es inseguro por defecto, porque quedan disponibles no solo para el anfitrión, sino para el resto del mundo. Si al publicar añades la dirección local (127.0.0.1 o ::1), solo el propio anfitrión llega a ese puerto, como en -p 127.0.0.1:8080:80.
Ojo también con el cortafuegos. La página sobre filtrado de paquetes y cortafuegos explica que, en Linux, Docker crea sus propias reglas y pide no modificarlas, porque sus redes puente las necesitan. Con ufw, el cortafuegos que trae Ubuntu, son incompatibles: al publicar un puerto, el tráfico del contenedor se desvía antes de pasar por la configuración de ufw, que en la práctica queda ignorada.
Que todo funcione igual en cualquier sistema. Jellyfin avisa de que en Windows o macOS hay que instalarlo de forma nativa: en un contenedor sobre esos sistemas no tiene soporte, y se sabe que fallan funciones como la transcodificación acelerada por hardware.
Te puede interesar
Tech Planet participa en el programa de afiliados de Amazon. Si compras a través de estos enlaces, recibimos una pequeña comisión sin coste extra para ti, lo que nos ayuda a seguir creando contenido como este.
| Imagen | Producto | Características | Comprar |
|---|---|---|---|
![]() |
UGREEN NASync DXP2800 | Intel N100 · 8 GB DDR5 · dos bahías de 3,5″ y dos ranuras M.2 NVMe | Ver precio en Amazon |
![]() |
Synology DiskStation DS224+, sin discos | Dos bahías, sin discos · copia de seguridad y restauración · acceso y sincronización multiplataforma | Ver precio en Amazon |
![]() |
WD Red Plus 4 TB | 4 TB · clase 5.400 rpm · SATA 6 Gb/s · CMR y 128 MB de caché · tecnología NASware | Ver precio en Amazon |
![]() |
Seagate IronWolf 4 TB | 4 TB · SATA 6 Gb/s · para NAS de hasta ocho bahías (ST4000VNZ06) | Ver precio en Amazon |









