El verdadero poder de Docker se libera cuando dejas de usar solo imágenes preexistentes y empiezas a crear las tuyas. Esto te permite empaquetar tus propias aplicaciones y dependencias. La herramienta para esto es el Dockerfile.
Un Dockerfile es un script que contiene una serie de instrucciones para ensamblar una imagen. Se lee de arriba hacia abajo, y cada instrucción crea una nueva capa en la imagen.
Para este ejemplo, necesitarás una carpeta que contenga tres archivos. Si usas Windows, el proceso es el siguiente:
C:\proyectos\mi-app-flask. Toda la operación se realizará dentro de esta carpeta.app.py: El código de tu aplicación.requirements.txt: Las dependencias de Python.Dockerfile: Las instrucciones de Docker.Dockerfile! Es muy importante que el archivo se llame exactamente Dockerfile, sin ninguna extensión como .txt. Si usas el Bloc de notas, al guardar, asegúrate de cambiar el "Tipo" a "Todos los archivos (*.*)" para evitar que Windows le añada una extensión automáticamente.A continuación, este es el contenido que debes poner en cada archivo.
Vamos a crear una imagen para una aplicación web simple con Python y Flask. Primero, la aplicación (app.py):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "¡Hola, mundo desde un contenedor Docker!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Y sus dependencias (requirements.txt):
Flask>=2.3
Ahora, el Dockerfile que empaqueta esta aplicación:
# 1. Especificar la imagen base
FROM python:3.9-slim
# 2. Establecer el directorio de trabajo
WORKDIR /app
# 3. Copiar e instalar dependencias
COPY requirements.txt .
RUN pip install -r requirements.txt
# 4. Copiar el código de la aplicación
COPY . .
# 5. Exponer el puerto que usa la aplicación
EXPOSE 5000
# 6. Definir el comando para ejecutar la aplicación
CMD ["flask", "run", "--host=0.0.0.0"]
COPY <origen> <destino>.Con los tres archivos (`app.py`, `requirements.txt`, `Dockerfile`) en el mismo directorio, ejecuta el siguiente comando:
docker build -t mi-app-flask:1.0 .
-t mi-app-flask:1.0: Etiqueta (tag) la imagen con un nombre y una versión. Es una práctica fundamental..: El punto final indica el contexto de la construcción (build context), es decir, el directorio que contiene el Dockerfile y los archivos de la aplicación.Verás cómo Docker ejecuta cada instrucción del Dockerfile, creando una capa para cada una.
Una vez construida, la ejecutamos como cualquier otra imagen:
docker run -d -p 5000:5000 --name mi-app mi-app-flask:1.0
Si ahora vas a http://localhost:5000 en tu navegador, verás el mensaje de la aplicación Flask. ¡Tu aplicación ahora está contenedorizada!
Cambiemos de nuevo el ejemplo para usar FastAPI, un framework web moderno y de alto rendimiento para crear APIs con Python. El objetivo será crear un endpoint / que devuelva un objeto JSON.
Una vez más, modifica el contenido de tus archivos de proyecto.
1. Modifica app.py:
Este es el código para una API mínima con FastAPI.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hola mundo"}
2. Modifica requirements.txt:
FastAPI necesita un servidor ASGI como Uvicorn para ejecutarse.
fastapi==0.85.0
uvicorn[standard]==0.18.3
3. Modifica tu Dockerfile:
El Dockerfile debe ser adaptado para instalar las nuevas dependencias y para usar uvicorn para lanzar la aplicación.
# 1. Imagen base
FROM python:3.9-slim
# 2. Directorio de trabajo
WORKDIR /app
# 3. Instalar dependencias
COPY requirements.txt .
RUN pip install -r requirements.txt
# 4. Copiar aplicación
COPY app.py .
# 5. Exponer el puerto por defecto de Uvicorn
EXPOSE 8000
# 6. Comando para iniciar el servidor con Uvicorn
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
Construimos la imagen con una etiqueta específica para FastAPI.
# Construir la imagen de la API
docker build -t mi-app-fastapi:1.0 .
Al ejecutar, mapeamos un puerto de nuestra máquina (p. ej. 8000) al puerto del contenedor (8000).
# Ejecutar el contenedor mapeando el puerto 8000 al 8000
docker run --rm -p 8000:8000 mi-app-fastapi:1.0
Si ahora visitas http://localhost:8000 en tu navegador, verás la respuesta JSON: {"message":"Hola mundo"}.
RUN apt-get update && apt-get install -y curl