- Blog
- ¿Qué es Docker y para qué sirve?
¿Qué es Docker y para qué sirve?
El despliegue de aplicaciones informáticas en entornos de hosting web, servidores dedicados y plataformas en la nube ha experimentado una evolución drástica en la última década. Docker se ha establecido como la tecnología de virtualización ligera de referencia en la industria del software, transformando la forma en que los desarrolladores y administradores de sistemas empaquetan, distribuyen y ejecutan cargas de trabajo digitales.
A diferencia de las infraestructuras tradicionales basadas en máquinas virtuales con un elevado consumo de recursos, el motor de Docker permite aislar programas dentro de unidades operativas eficientes denominadas contenedores. Para empresas y profesionales que gestionan sus proyectos en infraestructuras, dominar esta herramienta resulta clave para optimizar la densidad de aplicaciones por servidor, acelerar los ciclos de desarrollo y garantizar que un servicio funcione exactamente igual en un entorno local que en un servidor VPS en producción.
¿Qué es Docker?
Docker es una plataforma de código abierto diseñada para automatizar el empaquetado, la distribución y la ejecución de aplicaciones informáticas mediante la tecnología de contenedores a nivel de sistema operativo. Creado originalmente en 2013, este proyecto permite empaquetar un programa informático junto a sus dependencias exactas, librerías del sistema, binarios y archivos de configuración en un único elemento ejecutable, portátil e independiente del entorno subyacente.
La diferencia estructural entre la virtualización basada en hipervisores y la tecnología de Docker reside en la gestión del núcleo (kernel) del sistema operativo. Mientras que una máquina virtual requiere instalar un sistema operativo completo (Guest OS) que consume GB de disco y memoria RAM para cada instancia, los contenedores comparten el kernel del sistema operativo anfitrión (Host OS), aislando únicamente los procesos y el sistema de archivos de la aplicación mediante mecanismos criptográficos y de permisos.
¿Cómo funciona Docker?
Comprender el funcionamiento interno de esta plataforma requiere analizar su arquitectura cliente-servidor y cómo aprovecha las capacidades nativas del núcleo de Linux para lograr un aislamiento ágil y eficiente sin emular hardware.
Arquitectura cliente-servidor
El funcionamiento interno de la tecnología se organiza mediante un modelo cliente-servidor compuesto por tres componentes estructurales: la interfaz de línea de comandos (Docker CLI), el demonio de ejecución en segundo plano (dockerd) y el registro centralizado de imágenes (Docker Registry). El usuario introduce comandos en la consola de administración, los cuales se envían en forma de peticiones HTTP a la API REST gestionada por el servicio central.
El demonio dockerd es el motor encargado de construir las imágenes, ejecutar los contenedores, estructurar las redes virtuales privadas y gestionar el almacenamiento persistente en el servidor. Por su parte, el registro de imágenes (donde Docker Hub actúa como repositorio público principal) almacena los componentes preconfigurados que los desarrolladores descargan para desplegar servicios en cuestión de segundos.
Virtualización a nivel de sistema operativo mediante namespaces y cgroups
La capacidad que permite a la plataforma aislar procesos sin emular hardware se apoya en dos funciones avanzadas del kernel de Linux: los espacios de nombres (namespaces) y los grupos de control (cgroups). Los namespaces aíslan la vista del sistema operativo que posee cada contenedor, impidiendo que un proceso pueda inspeccionar o interferir en las variables, redes o procesos de otros contenedores.
El motor configura diferentes namespaces por cada instancia: PID (aislamiento de la tabla de procesos), NET (interfaces de red e IP privadas), MNT (puntos de montaje del sistema de archivos), IPC (comunicación interproceso) y USER (mapeo de identificadores de usuario). De forma paralela, los cgroups limitan y supervisan la cantidad exacta de hardware disponible, imponiendo topes máximos en la memoria RAM, el porcentaje de procesador CPU y la velocidad de lectura/escritura en disco.
Sistema de archivos por capas e imágenes de solo lectura con OverlayFS
Las imágenes de la plataforma no son archivos monolíticos masivos, sino una superposición ordenada de capas de solo lectura unificadas mediante sistemas de archivos de unión como Overlay2. Cada instrucción especificada durante la configuración del entorno genera una capa inmutable que se almacena en la caché local para su posterior reutilización.
Cuando el motor arranca un contenedor a partir de una imagen, añade una capa ligera de lectura y escritura en la parte superior de la pila. Cualquier modificación, creación o borrado de archivos dentro del contenedor en ejecución utiliza el mecanismo Copy-on-Write (CoW). En el que los archivos originales de solo lectura permanecen inalterados en la capa inferior, mientras que las modificaciones se escriben exclusivamente en la capa temporal superior del contenedor.
Empaquetado y aislamiento de aplicaciones mediante contenedores independientes
Un contenedor es un proceso del sistema operativo anfitrión ejecutado bajo fronteras criptográficas y de permisos que le impiden acceder a la memoria o archivos fuera de su alcance. Este empaquetado hermético incluye el código fuente de la aplicación, el ejecutable del lenguaje (Node.js, Python, PHP, Go), las librerías del sistema y las variables de entorno.
Esta arquitectura elimina por completo los conflictos de dependencias entre diferentes proyectos alojados en un mismo servidor. Es posible mantener en la misma máquina física un contenedor que ejecuta una aplicación antigua sobre PHP 7.4 junto a otro proyecto moderno sobre PHP 8.3, garantizando que los módulos del sistema no entren en conflicto.
Flujo de construcción, distribución y ejecución desde el Dockerfile hasta el contenedor
El ciclo de vida de un servicio se gestiona mediante tres fases: la especificación del entorno, la compilación de la imagen y la instanciación del contenedor. Todo comienza con la redacción de un archivo de texto plano denominado Dockerfile, en el cual se especifican las instrucciones de configuración del sistema.
# Ejemplo de Dockerfile para una aplicación Node.js en producción FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm install --production COPY . . EXPOSE 3000 USER node CMD ['node', 'server.js']
Mediante la orden docker build, el motor procesa el archivo y compila la imagen binaria. Posteriormente, esta imagen puede subirse a un registro privado mediante docker push y descargarse en cualquier servidor remoto con docker pull. Finalmente, la instrucción docker run instancia la imagen, creando un contenedor ejecutable en milisegundos.
¿Para qué sirve Docker?
La adopción masiva de esta tecnología se debe a su capacidad para resolver problemas históricos en el ciclo de vida del desarrollo de software, aportando agilidad, eficiencia y portabilidad a cualquier proyecto tecnológico moderno.
Estandarización de entornos de desarrollo
Uno de los mayores obstáculos en el desarrollo de software es el fallo de ejecución provocado por diferencias entre la configuración del ordenador del programador y el servidor de producción. La herramienta resuelve esta fricción al empaquetar la aplicación completa dentro de una imagen idéntica e inmutable.
Al compartir el archivo de configuración entre los miembros del equipo, se garantiza que todos los desarrolladores ejecuten la misma versión del sistema operativo, el mismo motor de base de datos y las mismas dependencias de código, eliminando las horas de trabajo dedicadas a depurar incoherencias del entorno local.
Despliegue ágil y escalable de arquitecturas de microservicios
Las arquitecturas de software modernas han evolucionado desde grandes bloques monolíticos hacia aplicaciones compuestas por microservicios independientes. La plataforma es la tecnología idónea para gestionar esta modularidad, encapsulando cada microservicio (API REST, servidor web, base de datos, colas de mensajes) en un contenedor dedicado.
Esta separación facilita el escalado horizontal diferido: si el servicio de autenticación experimenta un pico de tráfico, los administradores pueden instanciar múltiples contenedores de ese módulo específico en un servidor VPS sin necesidad de duplicar el resto de los componentes del sistema.
Migración simplificada de aplicaciones entre entornos multicloud y servidores locales
La portabilidad es uno de los atributos fundamentales de los contenedores que cumplen con la especificación abierta OCI (Open Container Initiative). Una vez construida y validada una imagen, esta funcionará exactamente igual en una estación de trabajo, en un servidor dedicado bare-metal o en cualquier infraestructura en la nube.
Esta independencia evita que las empresas queden atrapadas por dependencias propietarias de un proveedor (vendor lock-in). Migrar una pila tecnológica compleja entre un servidor local y una plataforma en la nube se reduce a transferir las imágenes y ejecutar las instancias correspondientes.
Optimización del consumo de recursos de hardware frente a la virtualización tradicional
Al eliminar la sobrecarga de ejecutar múltiples sistemas operativos invitados en el mismo servidor, los contenedores ofrecen una densidad de empaquetado muy superior a la de los hipervisores tradicionales. Una sola máquina física puede alojar decenas o cientos de contenedores de forma simultánea manteniendo un consumo muy bajo de CPU y RAM.
Esta eficiencia repercute en una reducción directa de los costes de infraestructura. La potencia de procesamiento de los servidores se aprovecha de forma íntegra para ejecutar la lógica de negocio de la empresa, maximizando el rendimiento del hardware contratado.
Automatización e integración continua en pipelines de CI/CD
En los entornos de Integración Continua y Despliegue Continuo (CI/CD), la velocidad y la capacidad de repetición son fundamentales. Herramientas como GitHub Actions, GitLab CI/CD o Jenkins utilizan contenedores efímeros para compilar el código fuente, ejecutar las pruebas unitarias y verificar la calidad del software.
Una vez validadas las pruebas automatizadas, el pipeline de CI/CD compila la imagen final del proyecto y la despliega automáticamente en el servidor de destino. Este nivel de automatización permite realizar múltiples entregas de software al día con total seguridad y sin interrupciones de servicio.
Aislamiento y ejecución segura de aplicaciones o entornos de prueba
Ejecutar código no verificado o probar software de terceros directamente en un servidor de producción puede comprometer la estabilidad del sistema. Los contenedores proporcionan un entorno aislado (sandbox) donde ejecutar programas sin riesgo de contaminar el sistema anfitrión.
Si una aplicación dentro de un contenedor sufre un error crítico de memoria o es comprometida por un fallo de programación, el incidente queda restringido al espacio del contenedor. Destruir la instancia afectada y volver a desplegar un contenedor limpio requiere una única línea de comando.
Simplificación de pruebas de software y ejecución de tests automatizados
Las pruebas de integración requieren la presencia de dependencias externas como bases de datos, servidores de caché o motores de búsqueda. Instalar y limpiar manualmente estos servicios en un entorno de pruebas es un proceso lento y propenso a errores.
Mediante el uso de contenedores, los desarrolladores pueden arrancar instancias de PostgreSQL o Redis en segundos con una sola instrucción, ejecutar las baterías de prueba automatizadas contra esos servicios y destruirlos inmediatamente al finalizar, garantizando siempre un entorno de test completamente limpio.
¿Cómo instalar Docker en diferentes sistemas?
Desplegar el motor de contenedores es un proceso accesible y bien documentado, aunque los pasos específicos de configuración varían ligeramente dependiendo de la arquitectura y el sistema operativo del equipo anfitrión.
Instalación de Docker Desktop en Windows mediante la integración con WSL2
En sistemas Windows 10 y Windows 11, la opción óptima para ejecutar contenedores es mediante Docker Desktop aprovechando la arquitectura del Subsystem for Linux v2 (WSL2). WSL2 proporciona un kernel de Linux real optimizado directamente por Microsoft dentro de Windows.
El proceso de configuración requiere tres pasos:
- Activar la característica WSL2 abriendo una consola de PowerShell con permisos de administrador y ejecutando wsl –install.
- Descargar el archivo ejecutable de Docker Desktop desde el sitio web oficial e instalar la aplicación.
- Iniciar la herramienta y comprobar en el panel de configuración (Settings > General) que la opción «Use the WSL 2 based engine» está habilitada de forma predeterminada.
Configuración e instalación de Docker Desktop en macOS con soporte para Apple Silicon
Para los usuarios de ordenadores Mac, la instalación se realiza descargando el instalador adaptado a la arquitectura del procesador (procesadores Intel o procesadores Apple Silicon M1/M2/M3/M4). La versión para Apple Silicon utiliza la arquitectura de virtualización nativa de macOS para ejecutar máquinas virtuales Linux ARM64 con aceleración por hardware.
Tras trasladar la aplicación a la carpeta de Aplicaciones, se deben otorgar permisos de administración al sistema para configurar los enlaces simbólicos de los comandos docker y docker-compose. Además, las opciones de la aplicación permiten asignar el número de núcleos de CPU, el límite de memoria RAM y el motor de sincronización de archivos (virtiofs) para optimizar la velocidad de lectura en disco.
Despliegue del motor Docker Engine en distribuciones Linux basadas en Debian y Ubuntu
En servidores de producción con sistemas operativos Ubuntu Server o Debian, se recomienda instalar la versión oficial del motor (docker-ce) directamente desde los repositorios apt verificados por el proyecto, evitando el uso de empaquetados genéricos de la distribución.
# Paso 1: Actualizar repositorios e instalar dependencias del sistema sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg # Paso 2: Importar la clave GPG oficial del repositorio de Docker sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Paso 3: Configurar el repositorio oficial e instalar el motor ejecutable echo 'deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release & echo '$VERSION_CODENAME') stable' | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Instalación de Docker en distribuciones Linux empresariales como RHEL, Rocky Linux y Fedora
En servidores con distribuciones basadas en paquetes RPM (tales como Red Hat Enterprise Linux, Rocky Linux, AlmaLinux o Fedora), el despliegue se gestiona mediante el gestor de paquetes dnf. El proceso exige añadir el repositorio oficial mediante la orden dnf-config-manager –add-repo, instalar los paquetes docker-ce, docker-ce-cli y containerd.io, e iniciar el servicio en el sistema de gestión systemd mediante la orden sudo systemctl enable –now docker. Es necesario además ajustar las reglas del cortafuegos firewalld para permitir el tráfico de red de las interfaces virtuales del motor.
Verificación de la instalación y ejecución del primer contenedor «Hello World»
Tras completar la instalación en cualquier sistema operativo, la prueba para verificar que el cliente de comandos se comunica correctamente con el demonio central se realiza ejecutando una imagen de prueba. Al introducir la orden docker run hello-world en la consola, el motor ejecuta la siguiente secuencia de forma automatizada:
- Verifica si la imagen hello-world está disponible en la caché local del servidor.
- Al no encontrarla localmente, conecta con el registro público Docker Hub y descarga la imagen.
- Instancia un nuevo contenedor a partir de la imagen descargada y lo pone en ejecución.
- El contenedor muestra un texto explicativo en pantalla confirmando la correcta instalación y finaliza su proceso de forma limpia.
Kubernetes vs Docker
Aunque a menudo se debaten como si fueran alternativas excluyentes, comprender las diferencias de escala, complejidad y propósito entre ambas herramientas es fundamental para diseñar una infraestructura sólida y escalable.
Diferencias entre un motor de ejecución de contenedores y un orquestador masivo
Es común comparar ambas herramientas como si fueran alternativas excluyentes, cuando en realidad son tecnologías diseñadas para operar en diferentes niveles de la infraestructura. Docker es un motor de empaquetado y ejecución de contenedores (container runtime) diseñado para gestionar instancias en un único nodo o servidor.
Por su parte, Kubernetes (K8s) es una plataforma de orquestación masiva que coordina clústeres enteros formados por múltiples servidores físicos o virtuales. Mientras el motor básico gestiona el contenedor a nivel local, Kubernetes coordina el clúster global, decidiendo en qué máquina del sistema debe ejecutarse cada contenedor según la capacidad de cómputo disponible.
Gestión de un nodo con Docker Compose frente a clústeres con Kubernetes
Para aplicaciones que se ejecutan en un único servidor dedicado o VPS, la herramienta Docker Compose permite coordinar y conectar arquitecturas compuestas por múltiples contenedores mediante un único archivo de configuración estructurado.
# Definición de arquitectura multicontenedor con Docker Compose
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- '80:80'
depends_on:
- app
app:
build: .
environment:
- DB_HOST=db
db:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: clave_segura_db
volumes:
- datos_postgres:/var/lib/postgresql/data
volumes:
datos_postgres:
Docker Compose es la opción idónea para entornos de desarrollo y servidores de pequeña o mediana escala. Sin embargo, cuando la aplicación requiere ejecutarse sobre decenas de servidores distribuidos con tolerancia a fallos geográficos, Kubernetes aporta la capa de abstracción necesaria para coordinar la red y el almacenamiento del clúster de forma unificada.
Balanceo de carga, autoescalado y recuperación automática de fallos en producción
El motor básico incluye políticas simples de reinicio de instancias (como –restart always), pero no puede supervisar la salud avanzada a nivel de clúster ni escalar los servicios de forma automática ante variaciones en la demanda de tráfico.
Kubernetes añade capacidades de autoasistencia, pues analiza continuamente la disponibilidad de los pods, reemplaza de forma transparente los contenedores que fallan, distribuye el tráfico de red entre las instancias réplica y puede modificar la cantidad de contenedores activos (Horizontal Pod Autoscaler) según las métricas de uso de procesador o memoria RAM en tiempo real.
Curva de aprendizaje, complejidad operativa y costes de mantenimiento de cada herramienta
Desplegar aplicaciones mediante contenedores en un servidor VPS presenta una curva de aprendizaje accesible. Cualquier desarrollador o técnico de sistemas puede aprender los comandos esenciales en poco tiempo y poner servicios en producción con un coste de mantenimiento bajo.
En cambio, implementar y administrar un clúster de Kubernetes exige un esfuerzo de arquitectura elevado. Requiere dominar conceptos avanzados como ingress controllers, service meshes, políticas de aislamiento de red y almacenamiento distribuido, lo que implica costes de gestión mayores y la necesidad de contar con perfiles especializados en ingeniería DevOps.
Uso de contenedores Docker dentro de un clúster de Kubernetes
Durante años, el motor de la plataforma fue la tecnología por defecto empleada por Kubernetes para la ejecución de contenedores. Aunque Kubernetes evolucionó para utilizar la interfaz estándar Container Runtime Interface (CRI) mediante motores de menor nivel como containerd o CRI-O, la compatibilidad con las imágenes sigue siendo completa.
Las imágenes compiladas mediante las herramientas de esta plataforma cumplen estrictamente los estándares de la Open Container Initiative (OCI). Esto garantiza que cualquier imagen creada con la herramienta tradicional puede desplegarse en un clúster de Kubernetes sin realizar ningún cambio en la estructura del proyecto.
Persistencia de datos y gestión de redes en la arquitectura de Docker
El aislamiento por defecto que ofrecen los contenedores plantea retos técnicos esenciales sobre cómo conservar la información a largo plazo sin perderla al reiniciar y sobre cómo establecer comunicaciones fiables entre distintos servicios.
Diferencias entre volúmenes gestionados (Volumes) y montajes directos (Bind Mounts)
Dado que la capa de lectura y escritura de un contenedor es efímera y se borra al eliminar la instancia, la conservación de la información requiere utilizar mecanismos de almacenamiento independientes del ciclo de vida del contenedor.
Existen dos alternativas principales para almacenar datos persistentes:
- Volúmenes gestionados (Docker Volumes): Son directorios creados y administrados directamente por el motor en una ruta reservada del sistema operativo anfitrión (/var/lib/docker/volumes/). Son la opción recomendada para bases de datos en producción, ya que ofrecen mayor rendimiento, mejor aislamiento y facilidad para realizar copias de seguridad.
- Montajes directos (Bind Mounts): Conectan un archivo o carpeta específica del servidor anfitrión con una ruta interna dentro del contenedor. Son la opción más utilizada en entornos de desarrollo, ya que permiten editar el código fuente en la máquina local y ver los cambios reflejados de inmediato dentro del contenedor.
Funcionamiento de los controladores bridge, host, none y overlay
El sistema de red de la plataforma incluye diferentes controladores (drivers) para configurar la conectividad y el aislamiento de las aplicaciones:
- Bridge: Se trata del controlador predeterminado que crea una red privada virtual en el servidor anfitrión, asignando una dirección IP interna a cada contenedor y gestionando el acceso externo mediante traducción de puertos (NAT).
- Host: Desactiva el aislamiento de red entre el contenedor y el servidor físico. El contenedor utiliza directamente la dirección IP y los puertos del anfitrión, ofreciendo el máximo rendimiento a costa de eliminar el aislamiento de red.
- None: Desconecta completamente el contenedor de cualquier interfaz de red, aislándolo de cualquier comunicación externa o interna para ejecutar procesos de alta seguridad.
- Overlay: Crea una red privada distribuida que conecta contenedores ejecutados en diferentes servidores físicos dentro de un clúster (Docker Swarm), cifrando la comunicación entre nodos de forma transparente.
Estrategias de copia de seguridad, restauración y migración de datos entre contenedores
Proteger la información alojada en los volúmenes del sistema requiere aplicar rutinas estandarizadas de copia de seguridad. Puesto que los volúmenes gestionados están encapsulados por el propio motor, la técnica recomendada consiste en ejecutar un contenedor temporal que monta el volumen y comprime sus archivos hacia el disco anfitrión.
# Comando para respaldar el contenido de un volumen gestionado a un archivo comprimido docker run --rm \ --volumes-from contenedor_db_produccion \ -v $(pwd):/backup \ ubuntu tar cvzf /backup/copia_seguridad_postgres.tar.gz /var/lib/postgresql/data
Para restaurar los datos en un nuevo servidor, el proceso se realiza a la inversa, pues se crea un volumen vacío y se ejecuta un contenedor auxiliar que descomprime el archivo de respaldo en la ruta asignada, simplificando la migración de bases de datos entre servidores VPS.
Comunicación aislada y segura entre microservicios utilizando redes privadas personalizadas
Utilizar la red bridge predeterminada del sistema no es aconsejable en entornos de producción, ya que todos los contenedores no asignados comparten esa misma red y dependen de direcciones IP que pueden cambiar tras un reinicio.
La práctica adecuada consiste en crear redes privadas personalizadas (docker network create red-aplicacion). Los contenedores conectados a una red privada disponen de resolución DNS automática por nombre de servicio, así la aplicación web puede conectar con la base de datos utilizando simplemente el nombre del contenedor db, manteniéndose además aislada del tráfico de otros servicios del servidor.
Seguridad, monitorización y buenas prácticas de producción en Docker
Llevar una arquitectura basada en contenedores desde un entorno de pruebas local hasta un servidor en producción exige implementar políticas estrictas de control de accesos, auditoría continua y gestión de rendimiento.
Ejecución de contenedores sin permisos de superusuario (rootless)
Por defecto, el demonio central de la plataforma se ejecuta con privilegios de superusuario (root) en el servidor anfitrión, y los procesos dentro de los contenedores heredan estos derechos administrativos a menos que se especifique una regla distinta. Si un atacante logra explotar una vulnerabilidad en una aplicación y escapar del aislamiento del contenedor, obtendría control total sobre el servidor.
La directriz de seguridad fundamental en entornos de producción consiste en implementar el modo Rootless Docker, el cual ejecuta tanto el demonio como los contenedores dentro de un espacio de nombres de usuario sin privilegios (User Namespace). Asimismo, en el Dockerfile de cada proyecto debe incluirse la instrucción USER especificando un usuario no privilegiado para la ejecución del servicio.
Escaneo automático de vulnerabilidades en imágenes antes del despliegue en producción
Las imágenes base descargadas desde repositorios públicos pueden incorporar componentes obsoletos con fallos de seguridad conocidos (CVEs) en sus librerías de sistema. Es indispensable analizar el estado de las imágenes antes de desplegarlas en un entorno de producción.
Herramientas de análisis de seguridad como Trivy, Grype o Docker Scout inspeccionan las capas de las imágenes e identifican vulnerabilidades en los paquetes del sistema operativo o en las dependencias del lenguaje de programación. Integrar estos escaneos dentro de las tuberías de CI/CD permite detener automáticamente el despliegue de cualquier imagen que presente vulnerabilidades de severidad alta o crítica.
Control de salud (Healthchecks), recolección de métricas y gestión centralizada de logs
Para garantizar la disponibilidad de las aplicaciones en producción, las imágenes deben incluir la directiva HEALTHCHECK en su archivo de configuración. Esta instrucción indica al motor cómo verificar si el servicio interno funciona correctamente (por ejemplo, realizando una petición HTTP a una ruta de control cada 30 segundos).
# Instrucción de control de salud dentro del Dockerfile HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -f https://localhost:3000/health || exit 1
Respecto a los registros de actividad (logs), las aplicaciones deben enviar todas sus salidas por las corrientes estándar (stdout y stderr). El motor captura estas transmisiones y permite canalizarlas mediante controladores de registro (logging drivers) hacia plataformas centralizadas como Grafana Loki, Elasticsearch o syslog, evitando que los archivos de registro llenen el espacio de almacenamiento local del servidor.
Inyección y gestión segura de secretos (Docker Secrets) y variables de entorno sensibles
Escribir contraseñas de bases de datos, claves de cifrado o tokens de acceso directamente dentro de un Dockerfile o en el código fuente representa un riesgo de seguridad grave. Cualquier usuario con acceso a la imagen podría consultar su historial de capas mediante el comando docker history y recuperar las credenciales.
En sistemas de producción, la asignación de credenciales sensibles debe realizarse en tiempo de ejecución utilizando variables de entorno cargadas desde archivos protegidos no versionados (.env), o preferiblemente mediante la herramienta Docker Secrets en entornos Swarm. Docker Secrets cifra la información confidencial tanto en tránsito como en reposo, montando los datos exclusivamente en la memoria temporal del contenedor (tmpfs) mientras el servicio permanece activo.