Qué es un contenedor Docker y cómo funciona

contenedor-docker
contenedor-docker

Un contenedor Docker es un proceso de aplicación que se ejecuta de forma aislada a partir de una imagen. No es una máquina virtual completa: utiliza el kernel del sistema que lo aloja y recibe su propio entorno de archivos, configuración, red y procesos. Esta diferencia explica por qué arranca rápido, qué datos se pierden al eliminarlo y por qué una imagen no garantiza por sí sola que la aplicación funcione igual en cualquier equipo.

Imagen, contenedor y proceso

Una imagen Docker es una plantilla de solo lectura que reúne los archivos de usuario y la configuración necesaria para arrancar una aplicación: por ejemplo, binarios, bibliotecas, certificados, código y un comando inicial. Al crear un contenedor desde esa imagen, Docker añade una capa escribible propia y configura el proceso, las redes, los montajes y otras opciones de ejecución.

ConceptoQué esQué ocurre con su ciclo de vida
ImagenPlantilla de solo lectura con archivos y valores predeterminados.Se puede reutilizar para crear varios contenedores.
ContenedorEntorno aislado donde se ejecuta un proceso desde una imagen.Puede iniciarse, detenerse, reiniciarse y eliminarse.
VolumenAlmacenamiento montado fuera de la capa escribible del contenedor.Puede conservar datos aunque se elimine el contenedor.
Máquina virtualMáquina con sistema operativo y kernel propios bajo un hipervisor.Incluye un sistema operativo invitado completo.

El contenedor no lleva su propio kernel de Linux. En un host Linux comparte el kernel del host; Docker Desktop en macOS y Windows proporciona el entorno Linux mediante una máquina virtual ligera. Por eso la portabilidad tiene límites: influyen la arquitectura del procesador, el sistema operativo, las dependencias del kernel, los montajes del host y los servicios externos.

Qué aporta el aislamiento

En Linux, Docker combina funciones del kernel para separar aspectos del proceso. Los namespaces aíslan vistas como los procesos, la red y los puntos de montaje. Los cgroups permiten organizar procesos y aplicar límites de recursos cuando se configuran. El resultado es un entorno separado para la aplicación, aunque los contenedores sigan compartiendo el kernel del host.

Ese aislamiento no equivale a una frontera idéntica a la de una máquina virtual. Los contenedores pueden compartir recursos y dependen del kernel; una vulnerabilidad, una configuración demasiado permisiva o el acceso a recursos del host puede afectar a la seguridad. Ejecuta solo imágenes confiables y concede a cada servicio los permisos y montajes que necesita.

Ciclo de vida: crear, ejecutar, detener y eliminar

El comando docker run crea un contenedor nuevo y arranca su proceso principal. En este ejemplo se ejecuta Nginx, se publica el puerto 8080 del host hacia el puerto 80 del contenedor y se le asigna un nombre:

docker run --name web-demo -d -p 8080:80 nginx:stable
docker ps --filter name=web-demo
docker logs web-demo
curl -I http://localhost:8080

El puerto no queda publicado automáticamente: la opción -p establece la relación entre el puerto del host y el del contenedor. En este caso puedes visitar http://localhost:8080. Si otro proceso ya ocupa ese puerto, el arranque fallará y tendrás que escoger otro puerto local.

El contenedor permanece en ejecución mientras su proceso principal siga activo. Si ese proceso termina, Docker marca el contenedor como detenido; no es un sistema operativo completo que continúa funcionando sin una aplicación. Detenerlo no lo elimina: puedes volver a arrancar el mismo contenedor con docker start. Eliminarlo sí borra su capa escribible.

docker stop web-demo
docker start web-demo
docker rm -f web-demo

El último comando elimina el contenedor llamado web-demo; la opción -f también lo detiene si sigue activo. La imagen Nginx no se elimina con ese comando. Si el contenedor guardaba archivos únicamente en su capa escribible, se pierden al borrarlo.

Dónde se guardan los datos

La capa escribible sirve para cambios temporales que hace el proceso, pero no debe ser el único lugar para guardar datos que deban sobrevivir a la eliminación del contenedor. Para persistirlos, monta un volumen o un directorio del host según el caso. Los volúmenes son una opción habitual para bases de datos y datos gestionados por Docker; los bind mounts resultan útiles cuando necesitas compartir una ruta concreta del host.

También es importante distinguir detener de eliminar: un contenedor detenido conserva su capa escribible mientras el contenedor exista. Al eliminarlo, esa capa desaparece. Un volumen montado tiene un ciclo de vida independiente y no se borra automáticamente al quitar el contenedor, salvo que utilices opciones explícitas de limpieza.

Contenedores y máquinas virtuales: diferencias prácticas

AspectoContenedorMáquina virtual
KernelComparte el kernel del host o del entorno Linux que proporciona la plataforma.Arranca con el kernel de su sistema operativo invitado.
Unidad de ejecuciónUno o varios procesos aislados y su configuración.Un sistema operativo invitado con sus procesos.
Arranque y recursosSuele iniciar con menos carga que un sistema operativo invitado completo.Debe arrancar y mantener el sistema invitado además de las aplicaciones.
AislamientoSe basa en mecanismos del kernel y depende de la configuración.La virtualización separa máquinas mediante el hipervisor.

No se trata de que una tecnología sustituya siempre a la otra. Una máquina virtual puede ofrecer una separación útil entre sistemas operativos; dentro de ella pueden ejecutarse contenedores para empaquetar aplicaciones. La elección depende del nivel de aislamiento, compatibilidad, rendimiento y operación que requiera el sistema.

Errores comunes al trabajar con contenedores

  • Confundir imagen y contenedor: la imagen es la plantilla; el contenedor es una instancia configurada que ejecuta un proceso.
  • Esperar que el contenedor siga activo sin proceso: cuando termina su proceso principal, el contenedor pasa a estado detenido.
  • Guardar datos importantes solo en la capa escribible: esos datos desaparecen al eliminar el contenedor; monta almacenamiento persistente.
  • Suponer que todos los puertos son accesibles desde el host: publica únicamente los puertos necesarios y revisa a qué interfaz quedan vinculados.
  • Creer que la imagen incluye un kernel o garantiza compatibilidad universal: la ejecución sigue dependiendo del kernel y la plataforma disponibles.
  • Dar acceso excesivo al host: evita privilegios y montajes innecesarios; limita los recursos y permisos a las necesidades de la aplicación.

Preguntas frecuentes

¿Un contenedor es una máquina virtual?

No. Un contenedor ejecuta procesos aislados y comparte el kernel del entorno que lo aloja. Una máquina virtual ejecuta un sistema operativo invitado con su propio kernel.

¿Se pierden los datos al detener un contenedor?

Detenerlo no elimina su capa escribible ni un volumen montado. Al eliminar el contenedor desaparece su capa escribible; un volumen conserva sus datos mientras no lo elimines expresamente.

¿Puedo ejecutar una imagen de Linux en Windows o macOS?

Con Docker Desktop, la plataforma proporciona un entorno Linux para ejecutar contenedores Linux. La compatibilidad también depende de la arquitectura y las necesidades de la imagen; no significa que todos los contenedores puedan ejecutarse sin diferencias en cualquier equipo.

Documentación y lecciones relacionadas

🐳 Si quieres aprender más de Docker, visita el curso de Docker gratis.

Comentarios

No hay comentarios aún. ¿Por qué no comienzas el debate?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *