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.