Preguntas y Respuestas de Entrevista sobre Docker

DockerBeginner
Practicar Ahora

Introducción

¡Bienvenido a esta guía completa diseñada para equiparte con el conocimiento y la confianza necesarios para destacar en tu próxima entrevista de Docker! Ya seas un desarrollador, ingeniero DevOps o administrador de sistemas, dominar Docker es crucial en el panorama actual de la nube nativa. Este documento cubre un amplio espectro de temas de Docker, desde conceptos fundamentales y gestión de imágenes hasta orquestación avanzada, seguridad y solución de problemas, incluyendo preguntas específicas para roles y desafíos prácticos. Prepárate para profundizar tu comprensión y mostrar tu experiencia, preparándote para el éxito en cualquier rol relacionado con Docker.

DOCKER

Fundamentos y Conceptos Clave de Docker

¿Qué es Docker y para qué se utiliza?

Respuesta:

Docker es una plataforma de código abierto que automatiza el despliegue, escalado y gestión de aplicaciones utilizando la contenerización. Se utiliza para proporcionar un entorno consistente para las aplicaciones, asegurando que se ejecuten de manera fiable en diferentes entornos informáticos, desde el desarrollo hasta la producción.


Explica la diferencia entre una Imagen de Docker y un Contenedor de Docker.

Respuesta:

Una Imagen de Docker es un paquete ejecutable, ligero e independiente que incluye todo lo necesario para ejecutar una pieza de software, como el código, el tiempo de ejecución, herramientas del sistema, bibliotecas del sistema y configuraciones. Un Contenedor de Docker es una instancia ejecutable de una Imagen de Docker. Puedes crear, iniciar, detener, mover o eliminar un contenedor.


¿Qué es un Dockerfile y cuál es su propósito?

Respuesta:

Un Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría llamar desde la línea de comandos para ensamblar una imagen. Proporciona una forma de automatizar el proceso de creación de imágenes, asegurando la reproducibilidad y el control de versiones del entorno de tu aplicación.


¿Cómo logra Docker el aislamiento?

Respuesta:

Docker logra el aislamiento principalmente a través de características del kernel de Linux como los namespaces y los grupos de control (cgroups). Los namespaces proporcionan vistas aisladas de los recursos del sistema (por ejemplo, IDs de procesos, interfaces de red), mientras que los cgroups limitan y monitorizan el uso de recursos (CPU, memoria, I/O) para los contenedores.


¿Qué son los volúmenes de Docker y por qué son importantes?

Respuesta:

Los volúmenes de Docker son el mecanismo preferido para persistir los datos generados y utilizados por los contenedores de Docker. Son importantes porque los contenedores son efímeros; sin volúmenes, los datos dentro de un contenedor se perderían cuando el contenedor se eliminara. Los volúmenes permiten que los datos sobrevivan al contenedor.


Explica el concepto de capas de Docker.

Respuesta:

Las imágenes de Docker se componen de múltiples capas de solo lectura, cada una representando una instrucción de Dockerfile. Cuando construyes una imagen, cada comando crea una nueva capa encima de la anterior. Esta estructura en capas permite un almacenamiento, intercambio y caché eficientes, ya que las capas comunes pueden ser reutilizadas en múltiples imágenes.


¿Qué es Docker Hub?

Respuesta:

Docker Hub es un servicio de registro basado en la nube proporcionado por Docker para encontrar y compartir imágenes de contenedores. Actúa como un repositorio central donde los usuarios pueden subir sus imágenes personalizadas y descargar imágenes oficiales o contribuidas por la comunidad. También ofrece compilaciones automatizadas y webhooks.


¿Cómo se expone un puerto de un contenedor de Docker a la máquina host?

Respuesta:

Se expone un puerto utilizando la bandera -p o --publish al ejecutar un contenedor. Por ejemplo, docker run -p 8080:80 my_image mapea el puerto 80 dentro del contenedor al puerto 8080 en la máquina host, permitiendo el acceso externo.


¿Cuál es el propósito del archivo .dockerignore?

Respuesta:

El archivo .dockerignore es similar a .gitignore y especifica archivos y directorios que deben excluirse al construir una imagen de Docker. Su propósito es evitar que archivos innecesarios (como código fuente, artefactos de compilación o datos sensibles) se copien en la imagen, reduciendo el tamaño de la imagen y el tiempo de compilación.


Explica brevemente el demonio de Docker (dockerd).

Respuesta:

El demonio de Docker (dockerd) es el servicio en segundo plano que se ejecuta en la máquina host y gestiona objetos de Docker como imágenes, contenedores, redes y volúmenes. Escucha las solicitudes de la API de Docker y las procesa, realizando tareas como la construcción de imágenes, la ejecución de contenedores y la gestión del almacenamiento.


Dockerfile y Gestión de Imágenes

¿Qué es un Dockerfile y para qué se utiliza?

Respuesta:

Un Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría llamar desde la línea de comandos para ensamblar una imagen. Se utiliza para automatizar el proceso de creación de imágenes de Docker, asegurando la consistencia y reproducibilidad en diferentes entornos.


Explica el propósito de la instrucción FROM en un Dockerfile.

Respuesta:

La instrucción FROM inicializa una nueva etapa de compilación y establece la imagen base para las instrucciones subsiguientes. Cada Dockerfile debe comenzar con FROM, especificando la imagen padre a partir de la cual se construirá tu imagen, por ejemplo, FROM ubuntu:22.04.


¿Cuál es la diferencia entre CMD y ENTRYPOINT en un Dockerfile?

Respuesta:

CMD proporciona argumentos predeterminados para un contenedor en ejecución, que pueden ser anulados por argumentos de línea de comandos. ENTRYPOINT configura un contenedor que se ejecutará como un ejecutable, y sus argumentos suelen ser fijos, con CMD proporcionando parámetros adicionales a este.


¿Cómo funciona la caché de compilación de Docker y por qué es importante?

Respuesta:

Docker almacena en caché cada capa durante el proceso de compilación. Si una instrucción y su contexto no han cambiado desde la última compilación, Docker reutiliza la capa en caché, acelerando significativamente las compilaciones posteriores. Esto es crucial para flujos de trabajo de desarrollo eficientes.


¿Qué es el archivo .dockerignore y cuál es su propósito?

Respuesta:

El archivo .dockerignore lista los archivos y directorios que deben excluirse cuando el contexto de compilación se envía al demonio de Docker. Esto evita que se incluyan archivos innecesarios en la imagen, reduciendo el tamaño de la imagen y el tiempo de compilación, de manera similar a .gitignore.


Explica el concepto de compilaciones multi-etapa (multi-stage builds) en Dockerfiles.

Respuesta:

Las compilaciones multi-etapa te permiten usar múltiples declaraciones FROM en tu Dockerfile, cada una iniciando una nueva etapa de compilación. Esto se utiliza para separar las dependencias de tiempo de compilación de las dependencias de tiempo de ejecución, lo que resulta en imágenes finales más pequeñas y seguras al copiar solo los artefactos necesarios de etapas anteriores.


¿Cómo se reduce el tamaño de una imagen de Docker?

Respuesta:

Para reducir el tamaño de la imagen, utiliza una imagen base mínima (por ejemplo, Alpine), aprovecha las compilaciones multi-etapa, limpia los archivos y cachés innecesarios después de la instalación, consolida los comandos RUN para minimizar las capas y utiliza .dockerignore para excluir archivos irrelevantes del contexto de compilación.


¿Qué es una capa de imagen de Docker y por qué son importantes?

Respuesta:

Una imagen de Docker se compone de múltiples capas de solo lectura, cada una representando una instrucción en el Dockerfile. Las capas permiten un almacenamiento y distribución eficientes a través de la caché y el intercambio de capas comunes entre imágenes, reduciendo el espacio en disco y los tiempos de descarga.


¿Cuándo usarías ADD en lugar de COPY en un Dockerfile?

Respuesta:

Generalmente se prefiere COPY ya que solo copia archivos o directorios locales a la imagen. ADD tiene funcionalidades adicionales, como la extracción automática de archivos tar de URLs o rutas locales, pero esto puede generar comportamientos inesperados o riesgos de seguridad si no se gestiona cuidadosamente.


¿Cómo se etiqueta una imagen de Docker y por qué es importante el etiquetado?

Respuesta:

Etiquetas una imagen usando docker build -t <image_name>:<tag> . o docker tag <source_image>:<source_tag> <target_image>:<target_tag>. El etiquetado es crucial para versionar imágenes, identificar diferentes compilaciones (por ejemplo, latest, dev, v1.0) y enviarlas a registros.


¿Para qué se utiliza la instrucción WORKDIR?

Respuesta:

La instrucción WORKDIR establece el directorio de trabajo para cualquier instrucción RUN, CMD, ENTRYPOINT, COPY o ADD que la siga en el Dockerfile. Ayuda a organizar el sistema de archivos dentro del contenedor y simplifica los comandos posteriores al proporcionar una ruta predeterminada.


Orquestación de Contenedores (Docker Compose & Swarm)

¿Qué es Docker Compose y cuándo se utilizaría?

Respuesta:

Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multi-contenedor. Utilizas un archivo YAML para configurar los servicios, redes y volúmenes de tu aplicación, y luego usas un solo comando (docker compose up) para iniciar todo. Es ideal para entornos de desarrollo local y pruebas.


Explica los componentes clave de un archivo docker-compose.yml.

Respuesta:

Un archivo docker-compose.yml típicamente incluye services (que definen los componentes de la aplicación como servidores web, bases de datos), networks (para la comunicación entre servicios) y volumes (para el almacenamiento persistente de datos). Cada servicio especifica su imagen, puertos, variables de entorno y dependencias.


¿Cómo se escalan los servicios utilizando Docker Compose?

Respuesta:

Si bien Compose es principalmente para entornos de un solo host, puedes escalar servicios utilizando la bandera --scale con docker compose up. Por ejemplo, docker compose up --scale web=3 iniciaría tres instancias del servicio 'web'. Para un escalado distribuido real, se utiliza Docker Swarm o Kubernetes.


¿Qué es Docker Swarm y cómo se diferencia de Docker Compose?

Respuesta:

Docker Swarm es la solución nativa de orquestación de contenedores de Docker para gestionar un clúster de motores Docker. Compose es para definir y ejecutar aplicaciones multi-contenedor en un solo host, mientras que Swarm te permite desplegar y escalar esas aplicaciones a través de múltiples hosts (nodos) de manera tolerante a fallos.


Describe los roles de los nodos 'manager' y 'worker' en un Docker Swarm.

Respuesta:

Los nodos manager se encargan de las tareas de gestión del clúster, como mantener el estado deseado, programar tareas y el descubrimiento de servicios. Los nodos worker reciben y ejecutan tareas de los nodos manager, ejecutando los contenedores reales. Para alta disponibilidad, un Swarm debe tener múltiples nodos manager.


¿Cómo se inicializa un Docker Swarm y se le añaden nodos?

Respuesta:

Inicializas un Swarm en un nodo manager usando docker swarm init. Este comando genera un token de unión. Para añadir nodos worker, ejecutas docker swarm join --token <token> <manager-ip>:<port> en cada worker. Los managers se pueden añadir de manera similar con un token de unión diferente.


¿Qué es un 'servicio' en el contexto de Docker Swarm?

Respuesta:

En Docker Swarm, un 'servicio' es la definición de las tareas que deseas ejecutar en el Swarm. Define qué imagen de Docker usar, cuántas réplicas ejecutar, qué puertos exponer y otras configuraciones de despliegue. Swarm asegura que el número deseado de réplicas de servicio siempre esté en ejecución.


¿Cómo maneja Docker Swarm el descubrimiento de servicios y el balanceo de carga?

Respuesta:

Docker Swarm tiene descubrimiento de servicios basado en DNS incorporado, lo que permite a los servicios encontrarse entre sí por nombre. También proporciona balanceo de carga interno (routing mesh) que distribuye las solicitudes a través de todas las réplicas saludables de un servicio, incluso si la solicitud llega a un nodo que no ejecuta una réplica.


Explica el concepto de 'actualizaciones continuas' (rolling updates) en Docker Swarm.

Respuesta:

Las actualizaciones continuas te permiten actualizar un servicio a una nueva versión sin tiempo de inactividad. Swarm actualiza las réplicas incrementalmente, reemplazando los contenedores antiguos por los nuevos uno por uno o en lotes, asegurando que un número suficiente de contenedores antiguos permanezca en ejecución hasta que los nuevos estén saludables.


¿Cuándo elegirías Docker Swarm sobre Kubernetes, o viceversa?

Respuesta:

Elige Docker Swarm para una orquestación Docker nativa más simple, una configuración más fácil y cuando necesites menos complejidad. Elige Kubernetes para despliegues a gran escala y altamente complejos, características avanzadas como escalado automático, auto-reparación y un ecosistema más amplio, a menudo a costa de una mayor complejidad y una curva de aprendizaje más pronunciada.


Redes y Almacenamiento en Docker

Explica los controladores de red predeterminados disponibles en Docker y sus casos de uso principales.

Respuesta:

Docker proporciona varios controladores de red predeterminados: bridge (predeterminado para contenedores independientes, red aislada), host (el contenedor comparte la pila de red del host, sin aislamiento) y none (el contenedor no tiene interfaces de red). overlay se utiliza para la comunicación multi-host en Swarm, y macvlan asigna una dirección MAC a un contenedor, haciéndolo aparecer como un dispositivo físico en la red.


¿Cuál es el propósito de una red bridge definida por el usuario en Docker y cómo se diferencia de la red bridge predeterminada?

Respuesta:

Las redes bridge definidas por el usuario proporcionan un mejor aislamiento, resolución DNS automática entre contenedores por nombre y una gestión más sencilla del mapeo de puertos en comparación con la red bridge predeterminada. Los contenedores en una bridge definida por el usuario pueden comunicarse entre sí utilizando sus nombres de servicio sin un mapeo de puertos explícito en el host.


¿Cómo se conecta un contenedor en ejecución a una red definida por el usuario existente?

Respuesta:

Puedes conectar un contenedor en ejecución a una red definida por el usuario existente utilizando el comando docker network connect. Por ejemplo: docker network connect my_network my_container. Esto permite que el contenedor se comunique con otros contenedores en esa red.


Describe los diferentes tipos de almacenamiento disponibles en Docker y cuándo usarías cada uno.

Respuesta:

Docker ofrece volumes, bind mounts y tmpfs mounts. Los volúmenes son el método preferido para datos persistentes, gestionados por Docker, e ideales para bases de datos. Los bind mounts enlazan una ruta del host directamente a una ruta del contenedor, útil para archivos de configuración o desarrollo. Los tmpfs mounts almacenan datos en la memoria del host, adecuados para datos no persistentes y sensibles.


¿Qué son los volúmenes de Docker y cuáles son sus ventajas sobre los bind mounts?

Respuesta:

Los volúmenes de Docker son la forma recomendada de persistir datos generados y utilizados por los contenedores de Docker. Son completamente gestionados por Docker, lo que facilita su copia de seguridad, migración y gestión. Los volúmenes también son más eficientes que los bind mounts, especialmente para cargas de trabajo intensivas en I/O, y funcionan en diferentes sistemas operativos.


¿Cómo se crea y se utiliza un volumen de Docker con nombre?

Respuesta:

Se puede crear un volumen con nombre usando docker volume create my_data. Para usarlo con un contenedor, lo especificas con la bandera -v durante la creación del contenedor: docker run -d -v my_data:/app/data my_image. Esto monta el volumen my_data en /app/data dentro del contenedor.


Explica el concepto del mecanismo de 'copy-on-write' en el almacenamiento de Docker.

Respuesta:

El mecanismo de copy-on-write (CoW) es utilizado por las capas de imagen de Docker. Cuando un contenedor se inicia, obtiene una capa delgada y escribible encima de las capas de imagen inmutables. Cualquier cambio realizado por el contenedor se escribe solo en esta capa superior, dejando intactas las capas de imagen subyacentes. Esto optimiza el almacenamiento y permite que múltiples contenedores compartan la misma imagen base de manera eficiente.


¿Cómo se pueden inspeccionar los detalles de red o la información de volúmenes en Docker?

Respuesta:

Para inspeccionar los detalles de red, usa docker network inspect <network_name_or_id>. Esto proporciona información completa que incluye contenedores conectados, subredes y gateways. Para información de volúmenes, usa docker volume inspect <volume_name>, que muestra el punto de montaje, el controlador y otros metadatos.


¿Cuándo elegirías un controlador de red host sobre un controlador de red bridge?

Respuesta:

Elegirías el controlador de red host cuando necesites el máximo rendimiento de red o acceso directo a los servicios de red del host sin mapeo de puertos. Esto se usa a menudo para aplicaciones críticas de rendimiento o cuando el contenedor necesita enlazarse directamente a puertos específicos del host, evitando la pila de red de Docker.


¿Cuál es la importancia de la bandera --mount en comparación con la bandera -v para gestionar el almacenamiento en Docker?

Respuesta:

La bandera --mount es la sintaxis más nueva, más explícita y preferida para gestionar el almacenamiento (volúmenes, bind mounts, tmpfs mounts). Utiliza pares clave-valor para mayor claridad, lo que facilita la lectura y comprensión del tipo de montaje y las opciones. La bandera -v es un atajo que puede ser ambiguo en cuanto a si es un volumen o un bind mount según la ruta de origen.


Preguntas Basadas en Escenarios y Solución de Problemas

Tu contenedor Docker se está ejecutando, pero tu aplicación dentro no es accesible. ¿Cuáles serían los primeros pasos que tomarías para solucionar esto?

Respuesta:

Primero, verifica docker logs <container_id> para ver errores de la aplicación. Luego, verifica los mapeos de puertos con docker ps para asegurarte de que el puerto del host esté correctamente expuesto. Finalmente, usa docker exec -it <container_id> bash para entrar al contenedor y comprobar si el proceso de la aplicación se está ejecutando y escuchando en el puerto esperado (por ejemplo, netstat -tulnp).


Un contenedor Docker se reinicia inmediatamente después de iniciarse. ¿Cuáles podrían ser las causas comunes y cómo lo investigarías?

Respuesta:

Las causas comunes incluyen un error en el script de entrada de la aplicación, una dependencia faltante o una excepción no manejada que provoca que el proceso se cierre. Usaría docker logs <container_id> para ver la salida antes del fallo y docker inspect <container_id> para verificar el RestartCount y el ExitCode.


Estás intentando construir una imagen Docker, pero falla durante la instrucción RUN con un error de 'command not found'. ¿Cómo depuras esto?

Respuesta:

Esto generalmente significa que el comando no está disponible en la imagen base o no se instaló correctamente en un paso RUN anterior. Añadiría sentencias echo antes del comando que falla para verificar las rutas, o cambiaría temporalmente el comando RUN a sh -c 'set -x; <original_command>' para ver los detalles de la ejecución del comando. Alternativamente, construiría hasta la capa que falla y luego ejecutaría docker run con esa imagen intermedia para depurar interactivamente.


El tamaño de tu imagen Docker es excesivamente grande. ¿Qué estrategias emplearías para reducir su tamaño?

Respuesta:

Usaría compilaciones multi-etapa (multi-stage builds) para separar las dependencias de tiempo de compilación de los artefactos de tiempo de ejecución. También elegiría una imagen base más pequeña (por ejemplo, Alpine), eliminaría archivos y cachés innecesarios, y combinaría comandos RUN usando && para minimizar las capas. Usar .dockerignore para excluir archivos irrelevantes también es crucial.


Necesitas compartir datos entre múltiples contenedores Docker. ¿Cuáles son tus opciones y cuándo elegirías cada una?

Respuesta:

Las opciones incluyen volúmenes de Docker, bind mounts y almacenamiento de red compartido. Los volúmenes de Docker son preferibles para datos persistentes y para gestionar el ciclo de vida de los datos, especialmente para bases de datos. Los bind mounts son buenos para el desarrollo, permitiendo que los cambios en los archivos del host se reflejen instantáneamente. El almacenamiento de red compartido (como NFS) es para aplicaciones distribuidas que necesitan acceso compartido a través de múltiples hosts.


Un contenedor Docker está consumiendo demasiada CPU/memoria. ¿Cómo identificarías el culpable y mitigarías el problema?

Respuesta:

Usaría docker stats para monitorear el uso de recursos en tiempo real. Si un contenedor específico es el problema, usaría docker exec para entrar en él y utilizaría herramientas como top o htop para identificar el proceso. La mitigación implica optimizar la aplicación, establecer límites de recursos (--cpus, --memory) durante docker run, o escalar el servicio.


Has actualizado tu imagen Docker, pero docker run sigue iniciando la versión antigua. ¿Qué está pasando?

Respuesta:

Esto generalmente significa que la etiqueta de imagen que estás usando (por ejemplo, myimage:latest) no se ha actualizado localmente. Primero ejecutaría docker pull myimage:latest para asegurarme de que se descargue la última imagen. Si el problema persiste, verifica el ID de la imagen con docker images para confirmar que estás descargando la correcta.


¿Cómo te asegurarías de que tus contenedores Docker se reinicien automáticamente si el propio demonio Docker se reinicia o si la máquina host se reinicia?

Respuesta:

Usaría una política de reinicio al ejecutar el contenedor, como --restart unless-stopped o --restart always. unless-stopped reiniciará el contenedor a menos que se haya detenido explícitamente, mientras que always lo reiniciará siempre independientemente de su estado anterior, incluso si se detuvo manualmente.


Estás experimentando problemas de conectividad de red entre dos contenedores Docker en el mismo host. ¿Qué pasos tomarías para diagnosticar esto?

Respuesta:

Primero, verifica que ambos contenedores estén en la misma red Docker usando docker inspect <container_id>. Luego, intenta hacer ping a un contenedor desde el otro usando su nombre de contenedor o dirección IP. Verifica las reglas del firewall en el host y dentro de los contenedores, y asegúrate de que no haya conflictos de puertos si están exponiendo puertos.


Tu contenedor Docker se está ejecutando, pero no puedes escribir en un directorio específico dentro de él. ¿Cuál podría ser el problema?

Respuesta:

Esto suele ser un problema de permisos. Usaría docker exec para entrar en el contenedor y verificar la propiedad y los permisos del directorio usando ls -ld <directory>. El usuario que ejecuta la aplicación dentro del contenedor podría no tener acceso de escritura. Ajustar los permisos con chmod o chown en el Dockerfile o en el script de entrada puede resolver esto.


Seguridad y Mejores Prácticas de Docker

¿Cuáles son las principales preocupaciones de seguridad al usar contenedores Docker?

Respuesta:

Las principales preocupaciones incluyen el escape de contenedores, imágenes inseguras, demonio mal configurado, escalada de privilegios, denegación de servicio y exposición de datos sensibles. Es crucial asegurar el host, las imágenes, los contenedores y la red.


¿Cómo se puede minimizar la superficie de ataque de una imagen Docker?

Respuesta:

Utiliza imágenes base mínimas (por ejemplo, Alpine), elimina paquetes y dependencias innecesarias, evita instalar herramientas de desarrollo y usa compilaciones multi-etapa para separar las dependencias de tiempo de compilación de los artefactos de tiempo de ejecución.


¿Por qué es una mala práctica ejecutar contenedores como root y cuál es la alternativa?

Respuesta:

Ejecutar como root otorga privilegios excesivos, aumentando el riesgo de escape de contenedores o escalada de privilegios si se ve comprometido. La alternativa es crear un usuario dedicado no root dentro del contenedor y ejecutar procesos como ese usuario.


Explica el principio de mínimo privilegio en el contexto de Docker.

Respuesta:

Significa otorgar solo los permisos necesarios para que un contenedor o proceso funcione. Esto incluye limitar las capacidades, evitar la bandera --privileged, restringir los montajes de volúmenes y ejecutar como un usuario no root.


¿Qué son Docker Content Trust y Docker Notary, y cómo mejoran la seguridad?

Respuesta:

Docker Content Trust (DCT) permite a los publicadores de imágenes firmar sus imágenes y a los consumidores verificar la integridad y autenticidad de las imágenes. Notary es la tecnología subyacente que proporciona publicación y verificación criptográficamente seguras.


¿Cómo se pueden gestionar de forma segura la información sensible (por ejemplo, claves de API, contraseñas) en contenedores Docker?

Respuesta:

Evita codificar secretos en Dockerfiles o comprometerlos en el control de versiones. Utiliza Docker Secrets (para Swarm) o Kubernetes Secrets (para Kubernetes), variables de entorno (con precaución) o herramientas externas de gestión de secretos como HashiCorp Vault.


¿Cuál es el propósito del perfil seccomp predeterminado de Docker?

Respuesta:

El perfil seccomp (modo de computación segura) predeterminado restringe las llamadas al sistema que un contenedor puede hacer al kernel. Esto reduce significativamente la superficie de ataque al prevenir llamadas al sistema maliciosas o innecesarias.


¿Cómo se escanean las imágenes Docker en busca de vulnerabilidades?

Respuesta:

Utiliza herramientas de escaneo de vulnerabilidades como Clair, Trivy, Anchore Engine o Docker Scout. Estas herramientas analizan las capas de la imagen en busca de vulnerabilidades conocidas en los paquetes y dependencias instalados, proporcionando informes accionables.


¿Cuáles son algunas de las mejores prácticas para asegurar el demonio Docker?

Respuesta:

Restringe el acceso al socket de Docker, habilita TLS para el acceso remoto, configura el registro (logging) apropiado, mantén actualizado el demonio y el motor de Docker, y evita exponer el demonio a redes no confiables.


¿Por qué deberías actualizar regularmente tus imágenes Docker y el motor Docker?

Respuesta:

Las actualizaciones regulares aseguran que tengas los últimos parches de seguridad y correcciones de errores tanto para las imágenes base como para el propio motor Docker. Esto mitiga las vulnerabilidades conocidas y mejora la estabilidad general del sistema.


Temas Avanzados de Docker y Optimización de Rendimiento

Explica el concepto de Redes Overlay de Docker y cuándo las usarías.

Respuesta:

Las Redes Overlay de Docker permiten la comunicación entre contenedores Docker que se ejecutan en diferentes hosts de demonio Docker. Son cruciales para la orquestación de contenedores multi-host, como en un clúster de Docker Swarm o Kubernetes, permitiendo que los servicios se comuniquen sin problemas a través de nodos sin configuraciones de enrutamiento complejas.


¿Cuál es el propósito de Docker Content Trust (DCT) y cómo funciona?

Respuesta:

Docker Content Trust (DCT) proporciona verificación criptográfica de los publicadores de imágenes y su integridad. Asegura que las imágenes extraídas de un registro sean firmadas por publicadores confiables, previniendo el uso de imágenes manipuladas o no autorizadas. Funciona utilizando Notary para firmar y verificar los manifiestos de imágenes.


¿Cómo puedes limitar los recursos (CPU, memoria) que un contenedor Docker puede consumir?

Respuesta:

Los límites de recursos se pueden establecer usando flags de docker run. Para CPU, usa --cpus (por ejemplo, --cpus='1.5') o --cpu-shares. Para memoria, usa --memory (por ejemplo, --memory='2g') y --memory-swap. Estas configuraciones evitan que un solo contenedor monopolice los recursos del host.


Describe la diferencia entre COPY y ADD en un Dockerfile.

Respuesta:

COPY copia archivos o directorios locales del contexto de compilación a la imagen. ADD tiene una funcionalidad similar pero también puede extraer archivos tar del origen y descargar archivos de URLs. Generalmente, se prefiere COPY por claridad y seguridad, a menos que se necesiten específicamente las características adicionales de ADD.


¿Qué es una compilación multi-etapa (multi-stage build) en Docker y cuáles son sus beneficios?

Respuesta:

Una compilación multi-etapa utiliza múltiples instrucciones FROM en un solo Dockerfile, donde cada FROM puede descartar artefactos de etapas anteriores. Esto reduce significativamente el tamaño de la imagen final al copiar solo los artefactos de compilación necesarios (por ejemplo, binarios compilados) a la imagen final más pequeña en tiempo de ejecución, mejorando la seguridad y la velocidad de despliegue.


¿Cómo optimizas el tamaño de la imagen Docker y la velocidad de compilación?

Respuesta:

Optimiza el tamaño de la imagen utilizando compilaciones multi-etapa, eligiendo imágenes base más pequeñas (por ejemplo, Alpine), aprovechando .dockerignore y consolidando comandos RUN. Optimiza la velocidad de compilación ordenando las instrucciones del Dockerfile para maximizar el caché de capas, usando un archivo .dockerignore y asegurando que el contexto de compilación sea mínimo.


Explica los drivers de almacenamiento de Docker y su impacto en el rendimiento.

Respuesta:

Docker utiliza drivers de almacenamiento (por ejemplo, OverlayFS, AUFS, Btrfs) para gestionar cómo se almacenan y combinan las capas. OverlayFS es generalmente recomendado por su rendimiento y simplicidad, especialmente para cargas de trabajo con muchas lecturas. La elección del driver impacta el tiempo de inicio del contenedor, el rendimiento de escritura y el I/O general del disco.


¿Qué es Docker Swarm Mode y cómo se diferencia de Kubernetes?

Respuesta:

Docker Swarm Mode es la herramienta de orquestación nativa de Docker para gestionar un clúster de motores Docker. Es más simple de configurar y usar que Kubernetes, lo que lo hace adecuado para despliegues más pequeños o para aquellos que ya están fuertemente invertidos en el ecosistema Docker. Kubernetes es un orquestador más potente, rico en características y complejo, ampliamente adoptado para despliegues a gran escala y de nivel de producción.


¿Cómo puedes solucionar problemas de un contenedor Docker que se reinicia continuamente?

Respuesta:

Primero, verifica los logs del contenedor usando docker logs <container_id>. Luego, inspecciona el estado del contenedor con docker inspect <container_id> para ver los códigos de salida y las políticas de reinicio. También puedes intentar ejecutar el contenedor interactivamente (docker run -it ...) para observar su comportamiento directamente o adjuntarte a él (docker attach).


Describe los modos de red de Docker y sus casos de uso.

Respuesta:

Docker ofrece varios modos de red: bridge (predeterminado, red aislada para contenedores), host (el contenedor comparte la pila de red del host), none (sin interfaz de red) y overlay (para comunicación multi-host). bridge es común para aplicaciones de un solo host, host para aplicaciones críticas de rendimiento que necesitan acceso directo a puertos, y overlay para servicios distribuidos.


Preguntas Específicas por Rol (Desarrollador, DevOps, Administrador)

Desarrollador: ¿Cómo te aseguras de que tus imágenes Docker sean lo más pequeñas posible?

Respuesta:

Utilizo compilaciones multi-etapa para separar las dependencias de tiempo de compilación de las dependencias en tiempo de ejecución. Además, aprovecho imágenes base más pequeñas como Alpine, consolido comandos RUN y elimino archivos o cachés innecesarios.


Desarrollador: Explica el propósito de un archivo .dockerignore y proporciona un ejemplo de su uso.

Respuesta:

Un archivo .dockerignore especifica archivos y directorios a excluir al construir una imagen Docker, similar a .gitignore. Esto evita que archivos innecesarios se agreguen al contexto de compilación, acelerando las compilaciones y reduciendo el tamaño de la imagen. Ejemplo: *.log o node_modules/.


DevOps: Describe cómo implementarías un pipeline de CI/CD para una aplicación Dockerizada.

Respuesta:

Utilizaría una herramienta de CI/CD (por ejemplo, Jenkins, GitLab CI, GitHub Actions) para automatizar la construcción de la imagen Docker tras un commit de código, ejecutar pruebas, subir la imagen a un registro y luego desplegarla en un entorno de destino (por ejemplo, Kubernetes, Docker Swarm).


DevOps: ¿Cómo manejas los secretos (por ejemplo, claves de API, contraseñas de bases de datos) en un entorno Dockerizado?

Respuesta:

Para desarrollo, podría usar variables de entorno o archivos .env. En producción, prefiero Docker Secrets o Kubernetes Secrets para el almacenamiento e inyección seguros. Vault o herramientas similares de gestión de secretos también se pueden integrar para escenarios más avanzados.


DevOps: ¿Qué estrategias utilizas para las actualizaciones continuas (rolling updates) y reversiones (rollbacks) de contenedores Docker en producción?

Respuesta:

Utilizo herramientas de orquestación como Docker Swarm o Kubernetes, que soportan nativamente las actualizaciones continuas reemplazando gradualmente los contenedores antiguos por los nuevos. Para las reversiones, puedo volver a una etiqueta de imagen anterior o a una configuración de despliegue, aprovechando las capacidades de la plataforma de orquestación.


Administrador: ¿Cómo monitoreas la salud y el rendimiento de los contenedores Docker y del demonio Docker?

Respuesta:

Uso docker stats para comprobaciones rápidas. Para un monitoreo integral, me integro con herramientas como Prometheus y Grafana para recopilar métricas (CPU, memoria, I/O de red) de cgroups y la API de Docker, y configuro alertas.


Administrador: Explica los modos de red de Docker y cuándo usarías cada uno.

Respuesta:

Los modos comunes incluyen bridge (predeterminado, red aislada para contenedores), host (el contenedor comparte la pila de red del host) y none (sin interfaz de red). Bridge es para la mayoría de las aplicaciones, host para aplicaciones críticas de rendimiento que necesitan acceso directo a puertos, y none para casos especializados o depuración.


Administrador: ¿Qué es Docker Swarm y cuándo lo elegirías sobre Kubernetes?

Respuesta:

Docker Swarm es la herramienta de orquestación nativa de Docker para gestionar un clúster de hosts Docker. Elegiría Swarm para despliegues más simples y a menor escala o cuando necesito una configuración rápida con una sobrecarga mínima, ya que es más fácil de aprender y administrar que Kubernetes.


Administrador: ¿Cómo gestionas los datos persistentes para los contenedores Docker?

Respuesta:

Utilizo volúmenes de Docker para el almacenamiento persistente de datos, ya que son gestionados por Docker y son independientes del ciclo de vida del contenedor. También se pueden usar montajes de enlace (bind mounts) para desarrollo o cuando se requiere acceso al sistema de archivos del host.


Administrador: Describe un escenario en el que usarías Docker Compose.

Respuesta:

Utilizo Docker Compose para definir y ejecutar aplicaciones Docker multi-contenedor. Por ejemplo, lo usaría para configurar un entorno de desarrollo local que consista en una aplicación web, una base de datos y un servicio de caché, todo definido en un único archivo docker-compose.yml.


Desafíos Prácticos y Hands-on

Tienes un Dockerfile que construye una imagen, pero el proceso de compilación es muy lento debido a muchas capas. ¿Cómo optimizarías el Dockerfile para reducir el tiempo de compilación y el tamaño de la imagen?

Respuesta:

Para optimizar, reordenaría las instrucciones para colocar las que cambian con frecuencia (como COPY del código de la aplicación) después de las que cambian con menos frecuencia (como FROM, RUN apt-get update). También consolidaría los comandos RUN usando && para reducir el número de capas y eliminar archivos innecesarios (rm -rf /var/lib/apt/lists/*) en el mismo comando RUN.


Describe cómo configurarías una compilación multi-etapa para una aplicación Go para crear una imagen Docker pequeña y lista para producción.

Respuesta:

En la primera etapa, usaría una imagen de compilador Go para compilar la aplicación. En la segunda etapa, usaría una imagen base mínima como scratch o alpine y solo copiaría el binario compilado de la primera etapa. Esto reduce significativamente el tamaño de la imagen final al excluir herramientas de compilación y dependencias.


Necesitas ejecutar un contenedor de base de datos (por ejemplo, PostgreSQL) y un contenedor de aplicación que se conecte a él. ¿Cómo asegurarías que puedan comunicarse y que los datos de la base de datos persistan tras reinicios del contenedor?

Respuesta:

Usaría una red Docker (por ejemplo, docker network create my-app-net) para conectar ambos contenedores. Para la persistencia de datos, usaría un volumen de Docker (docker volume create pg-data) y lo montaría en el directorio de datos del contenedor de la base de datos (-v pg-data:/var/lib/postgresql/data).


Un contenedor Docker no se inicia con un mensaje de error que aparece rápidamente. ¿Cómo depurarías este problema?

Respuesta:

Usaría docker logs <container_id_or_name> para ver la salida del contenedor. Si sale inmediatamente, añadiría un comando tail -f /dev/null o sleep infinity al CMD o ENTRYPOINT en el Dockerfile (o lo sobrescribiría con docker run) para mantener el contenedor en ejecución para inspección, y luego usaría docker exec para acceder a él.


Tienes un archivo docker-compose.yml para una aplicación multi-servicio. ¿Cómo escalarías un servicio específico (por ejemplo, un servidor web) para ejecutar múltiples instancias?

Respuesta:

Usaría el comando docker-compose up --scale web=3, donde web es el nombre del servicio y 3 es el número deseado de instancias. Docker Compose iniciará entonces tres contenedores separados para el servicio 'web', a menudo con balanceo de carga si hay un proxy inverso.


Explica la diferencia entre COPY y ADD en un Dockerfile y cuándo usarías cada uno.

Respuesta:

COPY copia archivos o directorios locales del contexto de compilación a la imagen. ADD tiene características adicionales: puede extraer archivos tar y descargar archivos de URLs. Generalmente, se prefiere COPY por claridad y predictibilidad, usando ADD solo cuando sus características adicionales son específicamente necesarias.


¿Cómo limpiarías los recursos Docker no utilizados (imágenes, contenedores, volúmenes, redes) para liberar espacio en disco?

Respuesta:

Usaría docker system prune. Este comando elimina todos los contenedores detenidos, todas las imágenes colgantes (dangling), toda la caché de compilación colgante y opcionalmente todos los volúmenes (-v) y redes no utilizados. Es una forma completa de recuperar espacio en disco.


Necesitas pasar información sensible (como claves de API) a un contenedor en ejecución sin codificarlas directamente en el Dockerfile ni comprometerlas en el control de versiones. ¿Cómo harías esto de forma segura?

Respuesta:

Para contenedores individuales, usaría variables de entorno a través del flag -e con docker run. Para Docker Compose o Swarm, usaría Docker secrets. Esto permite inyectar datos sensibles en tiempo de ejecución sin incorporarlos en la imagen ni exponerlos en texto plano.


Un contenedor Docker necesita acceder a archivos en la máquina host. ¿Cómo lograrías esto?

Respuesta:

Usaría un montaje de enlace (bind mount). Por ejemplo, docker run -v /host/path:/container/path my-image. Esto monta un directorio del sistema de archivos del host directamente en el contenedor, permitiendo acceso bidireccional a los archivos.


Has realizado cambios en el código de tu aplicación. ¿Cómo actualizas un contenedor Docker en ejecución con estos cambios?

Respuesta:

No puedes actualizar directamente el código de un contenedor en ejecución. Debes reconstruir la imagen Docker con el nuevo código (docker build), luego detener el contenedor antiguo (docker stop), eliminarlo (docker rm) y finalmente iniciar un nuevo contenedor desde la imagen actualizada (docker run). Para entornos orquestados, esto se maneja mediante actualizaciones continuas (rolling updates).


Resumen

Dominar Docker para entrevistas es un testimonio de tu dedicación y comprensión del desarrollo de software moderno. Al prepararte a fondo para las preguntas descritas en este documento, no solo te has equipado para articular tu conocimiento de manera efectiva, sino que también has profundizado tu comprensión práctica de la contenerización. Esta preparación es un paso crítico para demostrar tu valor a empleadores potenciales y asegurar el rol deseado.

Recuerda, el panorama tecnológico está en constante evolución. Continúa explorando nuevas características de Docker, mejores prácticas y tecnologías relacionadas como Kubernetes. Abraza el aprendizaje continuo, contribuye a proyectos y mantén la curiosidad. Tu compromiso con el crecimiento asegurará que sigas siendo un profesional muy solicitado en el dinámico mundo de DevOps y la computación nativa de la nube. ¡Buena suerte en tu camino!