Introducción
Un Dockerfile es un archivo de texto que contiene una serie de instrucciones que Docker utiliza para construir una imagen. Cada instrucción en un Dockerfile crea una capa en la imagen, lo que permite que Docker reutilice capas anteriores para optimizar el proceso de construcción.
Estructura de un Dockerfile
Un Dockerfile se compone de varias instrucciones que se ejecutan en secuencia. A continuación, se presentan algunas de las instrucciones más comunes:
- FROM: Especifica la imagen base a partir de la cual se construirá la nueva imagen.
- RUN: Ejecuta comandos en la imagen.
- COPY: Copia archivos o directorios desde el sistema de archivos del host al sistema de archivos de la imagen.
- ADD: Similar a COPY, pero también puede descomprimir archivos y descargar archivos desde URLs.
- CMD: Especifica el comando que se ejecutará cuando se inicie un contenedor a partir de la imagen.
- ENTRYPOINT: Configura un contenedor para que se ejecute como un ejecutable.
- WORKDIR: Establece el directorio de trabajo para las instrucciones RUN, CMD, ENTRYPOINT, COPY y ADD.
- ENV: Establece variables de entorno.
- EXPOSE: Informa a Docker que el contenedor escucha en puertos de red especificados en tiempo de ejecución.
Ejemplo de Dockerfile
A continuación, se muestra un ejemplo de un Dockerfile simple para una aplicación Node.js:
# Usar una imagen base oficial de Node.js FROM node:14 # Establecer el directorio de trabajo en el contenedor WORKDIR /app # Copiar el archivo package.json y package-lock.json COPY package*.json ./ # Instalar las dependencias del proyecto RUN npm install # Copiar el resto del código de la aplicación COPY . . # Exponer el puerto en el que la aplicación escuchará EXPOSE 3000 # Comando para ejecutar la aplicación CMD ["node", "app.js"]
Explicación del Dockerfile
- FROM node:14: Utiliza la imagen oficial de Node.js versión 14 como base.
- WORKDIR /app: Establece el directorio de trabajo en
/app
. - COPY package.json ./*: Copia los archivos
package.json
ypackage-lock.json
al directorio de trabajo. - RUN npm install: Ejecuta
npm install
para instalar las dependencias del proyecto. - COPY . .: Copia el resto del código de la aplicación al directorio de trabajo.
- EXPOSE 3000: Informa a Docker que el contenedor escuchará en el puerto 3000.
- CMD ["node", "app.js"]: Especifica el comando para ejecutar la aplicación cuando se inicie el contenedor.
Ejercicio Práctico
Ejercicio 1: Crear un Dockerfile para una Aplicación Python
Crea un Dockerfile para una aplicación Python simple que utiliza Flask. La aplicación debe mostrar "Hello, World!" cuando se accede a ella en el puerto 5000.
Pasos:
-
Crea un archivo
app.py
con el siguiente contenido:from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
-
Crea un archivo
requirements.txt
con el siguiente contenido:Flask==2.0.1
-
Crea un Dockerfile con las siguientes instrucciones:
# Usar una imagen base oficial de Python FROM python:3.9 # Establecer el directorio de trabajo en el contenedor WORKDIR /app # Copiar el archivo requirements.txt COPY requirements.txt ./ # Instalar las dependencias del proyecto RUN pip install --no-cache-dir -r requirements.txt # Copiar el resto del código de la aplicación COPY . . # Exponer el puerto en el que la aplicación escuchará EXPOSE 5000 # Comando para ejecutar la aplicación CMD ["python", "app.py"]
Solución
El Dockerfile completo para la aplicación Python sería:
# Usar una imagen base oficial de Python FROM python:3.9 # Establecer el directorio de trabajo en el contenedor WORKDIR /app # Copiar el archivo requirements.txt COPY requirements.txt ./ # Instalar las dependencias del proyecto RUN pip install --no-cache-dir -r requirements.txt # Copiar el resto del código de la aplicación COPY . . # Exponer el puerto en el que la aplicación escuchará EXPOSE 5000 # Comando para ejecutar la aplicación CMD ["python", "app.py"]
Conclusión
En esta sección, hemos aprendido los conceptos básicos de Dockerfile y cómo utilizarlo para construir imágenes Docker. Hemos cubierto las instrucciones más comunes y hemos visto un ejemplo práctico de cómo crear un Dockerfile para una aplicación Node.js. Además, hemos realizado un ejercicio práctico para crear un Dockerfile para una aplicación Python utilizando Flask. Con estos conocimientos, estás preparado para construir tus propias imágenes Docker personalizadas. En el próximo módulo, profundizaremos en la gestión de imágenes Docker.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga