Fundamentos de Dockerfile: Definición y creación de aplicaciones en contenedores

watch 7m, 33s
views 2

12:54, 29.05.2026

Contenido del artículo
arrow

  • Introducción al Dockerfile 
  • Instrucciones básicas que se utilizan en Dockerfile 
  • Ejemplo de flujo de trabajo: escribir y aplicar un Dockerfile
  • Pasos para crear tu Dockerfile 
  • Opciones disponibles durante la compilación de Docker 
  • Ejecución y uso de la imagen creada 
  • Prácticas recomendadas para Dockerfile 
  • 1. Evite utilizar la etiqueta `latest` para las imágenes base 
  • 2. Elige imágenes base solo de fuentes fiables 
  • 3. Implemente HEALTHCHECK para supervisar el estado del contenedor 
  • 4. Configure ENTRYPOINT y CMD correctamente 
  • 5. Nunca almacenes datos confidenciales directamente en las imágenes 
  • 6. Añade etiquetas para organizar y realizar un seguimiento de tus imágenes 
  • 7. Ejecute los contenedores utilizando un usuario que no sea root 
  • 8. Utilice `.dockerignore` para acelerar el proceso de compilación 
  • 9. Optimice el tamaño de la imagen siempre que sea posible 
  • 10. Utilice linters y escáneres de vulnerabilidades para la seguridad 
  • Resumen de las principales conclusiones

Docker es una plataforma imprescindible para ejecutar y, lo que es más importante, para crear aplicaciones en contenedores. Mediante los contenedores, es posible agrupar en un único paquete las dependencias, el código fuente y el entorno de ejecución. Esto se puede hacer utilizando Docker instalado en tu ordenador o mediante un clúster de Kubernetes como infraestructura.

Para ejecutar contenedores se necesita una imagen de contenedor. Las imágenes definen el estado inicial de los sistemas de archivos de los contenedores. Esto se puede hacer mediante un Dockerfile, y en este artículo te explicaremos el proceso de creación de aplicaciones en contenedores y compartiremos prácticas recomendadas.

Introducción al Dockerfile 

Los Dockerfiles contienen instrucciones en forma de texto necesarias para construir una imagen de contenedor. Para procesar todas las instrucciones del archivo y compilar la imagen, se debe utilizar el siguiente comando:

docker build

Tras ejecutar este comando, todas las instrucciones se procesan de forma secuencial. Si una línea comienza por #, no se trata de un comando, sino de un comentario o una explicación del comando. Los argumentos en las líneas se pueden separar mediante una barra invertida.

Instrucciones básicas que se utilizan en Dockerfile 

Existen más de 15 instrucciones que se pueden utilizar en Dockerfile para configurar algunos parámetros y añadir contenido.  Aquí tienes una lista de las más populares:

  • FROM suele encontrarse al principio del archivo y es la base para la construcción.
  • COPY se utiliza para añadir carpetas/archivos al sistema de archivos. El proceso de copia se realiza entre la imagen y el host de Docker.
  • ADD funciona de manera similar a la instrucción mencionada anteriormente, pero también admite la descompresión de archivos comprimidos y direcciones URL de archivos. El uso de ADD puede simplificar algunas tareas. Por ejemplo, los archivos comprimidos se descomprimen en el contenedor, en lugar de simplemente copiarse.
  • RUN se utiliza para ejecutar un comando en la imagen. Esto significa que se crea una nueva capa de la imagen con los cambios necesarios. Normalmente, este comando es necesario para configurar e instalar paquetes adicionales.
  • ENV: es necesario para configurar el entorno.  

Ejemplo de flujo de trabajo: escribir y aplicar un Dockerfile

Ahora que ya entiendes algunos comandos básicos, pasemos a un ejemplo real de flujo de trabajo.

Empieza creando un nuevo directorio utilizando el siguiente código y guardándolo:

import { v4 as uuid } from "uuid";
 
console.log("Hello World");
console.log(`Your ID is ${uuid()}`);
A continuación, añade el paquete a los proyectos de la siguiente manera:
$ npm install uuid

El siguiente paso será añadir las siguientes instrucciones y guardarlas en el archivo Dockerfile:

FROM node:16
WORKDIR /app
 
COPY package.json .
COPY package-lock.json .
RUN npm install
 
COPY main.js .
 
ENTRYPOINT ["node"]
CMD ["main.js"]

Intentaremos explicar algunos detalles del código:

  • node:16 – imagen oficial que se utiliza como base.
  • WORKDIR – en esta parte, el directorio cambia a /app.
  • COPY se utiliza para añadir 2 archivos del directorio del host al directorio de trabajo dentro del contenedor.
  • npm install – se utiliza para instalar en el sistema de archivos del contenedor con el fin de cargar las dependencias.
  • COPY main.js: el código fuente se copia al contenedor.

Pasos para crear tu Dockerfile 

En esta etapa, puedes comenzar a crear la imagen a partir del Dockerfile con el siguiente comando:

$ docker build -t demo-image:latest .

Una vez creado el imagen, verás las instrucciones en el terminal.

Opciones disponibles durante la compilación de Docker 

Al utilizar docker build el comando, especificas las rutas a las que haces referencia en el archivo. Las rutas fuera de contexto no serán visibles para la mayoría de las instrucciones.

Docker comprueba automáticamente las instrucciones según el directorio de trabajo, pero se puede especificar otro archivo utilizando -f, como se muestra a continuación:

docker build -f dockerfiles/app.dockerfile -t demo-image:latest -t demo-image:v1.0 .

Ejecución y uso de la imagen creada 

Para ejecutar la imagen creada, utiliza lo siguiente:

docker run demo-image:latest node main.js

Prácticas recomendadas para Dockerfile 

Escribir un Dockerfile se considera una tarea bastante sencilla, pero hay que tener en cuenta algunas recomendaciones para mejorar el rendimiento, la facilidad de uso y el nivel de seguridad.

1. Evite utilizar la etiqueta `latest` para las imágenes base 

En la instrucción FROM es mejor evitar el uso de «latest», ya que esto puede provocar algunos cambios imprevistos. La mayoría de los autores de imágenes utilizan directamente la última versión. Al recompilar la imagen, esto puede provocar de forma inadvertida el uso de otra versión, lo que causará ciertos problemas.

Por lo tanto, es mejor ser más específico e indicar node:16.

2. Elige imágenes base solo de fuentes fiables 

El uso de una fuente fiable para la imagen base es extremadamente importante; de lo contrario, puedes enfrentarte a algunos riesgos de seguridad. Una imagen base no fiable puede contener software malicioso que se ejecute fuera de los contenedores. Por lo tanto, es mejor utilizar imágenes publicadas por usuarios verificados o oficiales.

3. Implemente HEALTHCHECK para supervisar el estado del contenedor 

Es muy importante supervisar el estado del contenedor. Esto se puede hacer mediante orquestadores, como Kubernetes, para que los contenedores problemáticos se puedan reiniciar automáticamente.

HEALTHCHECK debe añadirse al Dockerfile para que el comando se ejecute en el interior y compruebe si todo funciona correctamente:

HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost || exit 1

El estado de los contenedores se puede comprobar mediante el comando ps.

4. Configure ENTRYPOINT y CMD correctamente 

Las instrucciones CMD y ENTRYPOINT son algo similares. CMD proporciona los argumentos por defecto, mientras que ENTRYPOINT inicia el proceso. Los argumentos de CMD se pueden configurar al iniciar los contenedores mediante docker run.

5. Nunca almacenes datos confidenciales directamente en las imágenes 

Por motivos de seguridad de tus datos confidenciales, no se recomienda almacenar claves API o contraseñas en las imágenes. Cualquier usuario con acceso a la imagen podría consultar esta información y utilizarla.

También es preferible utilizar variables de entorno en lugar de valores predeterminados en el Dockerfile. Esto ayudará a minimizar algunos riesgos de seguridad.

6. Añade etiquetas para organizar y realizar un seguimiento de tus imágenes 

Si tu equipo tiene muchas imágenes, es mejor utilizar la instrucción LABEL. Esto significa que puedes añadir información valiosa para cada proyecto. Las etiquetas se establecen basándose en la sintaxis de DNS inverso de la siguiente manera:

LABEL com.sample.team=backend

7. Ejecute los contenedores utilizando un usuario que no sea root 

Según la configuración predeterminada, los contenedores se ejecutan como usuario root. Esto puede suponer ciertos riesgos de seguridad, ya que los hackers podrían acceder al contenedor y ejecutar algunos comandos en el host.

Este problema se puede resolver añadiendo la instrucción USER al archivo Dockerfile. La mejor recomendación en este caso es utilizar usuarios que no sean root para todos los archivos.

USER demo-app
USER 1000
USER demo-app:demo-group

8. Utilice `.dockerignore` para acelerar el proceso de compilación 

Las imágenes suelen compilarse con un directorio de trabajo que puede contener directorios y archivos innecesarios. Para mejorar el rendimiento, es necesario excluir las rutas que no sean necesarias. Esto ayudará a acelerar el proceso cuando Docker copie el contexto de compilación en la fase inicial del proceso de compilación.

Utilice el archivo dockerignore en el directorio para excluir los directorios/archivos innecesarios.

9. Optimice el tamaño de la imagen siempre que sea posible 

Las imágenes pueden llegar a ser extremadamente grandes, lo que afecta directamente al tiempo de compilación. Para optimizar el tamaño de la imagen, se recomienda utilizar solo los paquetes necesarios y excluir todo lo demás. También es mejor utilizar una imagen base compacta, si es posible. Por ejemplo, Alpine Linux en lugar de Ubuntu.

10. Utilice linters y escáneres de vulnerabilidades para la seguridad 

Los archivos Dockerfile pueden contener errores que pueden provocar problemas graves o un comportamiento inesperado. Para comprobar posibles problemas, se pueden utilizar linters como Hadolint.

Para ejecutarlo, utiliza este comando:

$ docker run --rm -i hadolint/hadolint < Dockerfile

También se recomienda utilizar escáneres como Trivy, que ayudan a detectar paquetes obsoletos. Intenta utilizarlo antes del despliegue para minimizar algunos riesgos.

Resumen de las principales conclusiones

Docker es una tecnología extremadamente popular que influye directamente en la entrega de software gracias al uso de contenedores que funcionan a la perfección en diversos entornos. Para utilizar Docker correctamente, es necesario escribir un archivo Dockerfile que contenga todas las instrucciones necesarias. Estas instrucciones se definen en la especificación de imágenes OCI y crean las imágenes necesarias para un entorno de ejecución de contenedores compatible con OCI.

Compartir

¿Te ha resultado útil este artículo?

Ofertas populares de VPS

-15%

CPU
CPU
6 Xeon Cores
RAM
RAM
8 GB
Space
Space
100 GB SSD
Bandwidth
Bandwidth
80 Mbps
DDoS Protected SSD-wKVM 8192 Windows

101 /mes

/mes

Facturado cada 12 meses

-4.7%

CPU
CPU
3 Xeon Cores
RAM
RAM
1 GB
Space
Space
40 GB HDD
Bandwidth
Bandwidth
300 Gb
wKVM-HDD HK 1024 Windows

10.35 /mes

/mes

Facturado cada 12 meses

-10%

CPU
CPU
6 Epyc Cores
RAM
RAM
16 GB
Space
Space
150 GB NVMe
Bandwidth
Bandwidth
Unlimited
KVM-NVMe 16384 Linux

50.49 /mes

/mes

Facturado cada 12 meses

-10%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
150 GB SSD
Bandwidth
Bandwidth
Unlimited
KVM-SSD 16384 Linux

49.99 /mes

/mes

Facturado cada 12 meses

-21.5%

CPU
CPU
2 Xeon Cores
RAM
RAM
2 GB
Space
Space
75 GB SSD
Bandwidth
Bandwidth
300 GB
wKVM-SSD 2048 HK Windows

26 /mes

/mes

Facturado cada 12 meses

-15.4%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
150 GB SSD
Bandwidth
Bandwidth
100 Mbps
DDoS Protected SSD-wKVM 16384 Windows

130 /mes

/mes

Facturado cada 12 meses

-10%

CPU
CPU
4 Xeon Cores
RAM
RAM
4 GB
Space
Space
100 GB SSD
Bandwidth
Bandwidth
Unlimited
wKVM-SSD 4096 Windows

18.65 /mes

/mes

Facturado cada 12 meses

-20.5%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
150 GB SSD
Bandwidth
Bandwidth
10 TB
KVM-SSD 16384 Metered Linux

95 /mes

/mes

Facturado cada 12 meses

-8.9%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
400 GB HDD
Bandwidth
Bandwidth
Unlimited
wKVM-HDD 16384 Windows

56 /mes

/mes

Facturado cada 12 meses

-24.4%

CPU
CPU
2 Xeon Cores
RAM
RAM
1 GB
Space
Space
20 GB SSD
Bandwidth
Bandwidth
300 GB
KVM-SSD 1024 HK Linux

13 /mes

/mes

Facturado cada 12 meses

Otros artículos sobre este tema

cookie

¿Acepta las cookies y la política de privacidad?

Utilizamos cookies para asegurar que damos la mejor experiencia en nuestro sitio web. Si continúa sin cambiar la configuración, asumiremos que acepta recibir todas las cookies del sitio web HostZealot.