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:

  1. FROM: Especifica la imagen base a partir de la cual se construirá la nueva imagen.
  2. RUN: Ejecuta comandos en la imagen.
  3. COPY: Copia archivos o directorios desde el sistema de archivos del host al sistema de archivos de la imagen.
  4. ADD: Similar a COPY, pero también puede descomprimir archivos y descargar archivos desde URLs.
  5. CMD: Especifica el comando que se ejecutará cuando se inicie un contenedor a partir de la imagen.
  6. ENTRYPOINT: Configura un contenedor para que se ejecute como un ejecutable.
  7. WORKDIR: Establece el directorio de trabajo para las instrucciones RUN, CMD, ENTRYPOINT, COPY y ADD.
  8. ENV: Establece variables de entorno.
  9. 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

  1. FROM node:14: Utiliza la imagen oficial de Node.js versión 14 como base.
  2. WORKDIR /app: Establece el directorio de trabajo en /app.
  3. COPY package.json ./*: Copia los archivos package.json y package-lock.json al directorio de trabajo.
  4. RUN npm install: Ejecuta npm install para instalar las dependencias del proyecto.
  5. COPY . .: Copia el resto del código de la aplicación al directorio de trabajo.
  6. EXPOSE 3000: Informa a Docker que el contenedor escuchará en el puerto 3000.
  7. 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:

  1. 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)
    
  2. Crea un archivo requirements.txt con el siguiente contenido:

    Flask==2.0.1
    
  3. 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.

© Copyright 2024. Todos los derechos reservados