curso
10 ideas de proyectos Docker: De principiante a avanzado
La experiencia práctica es esencial para dominar Docker. Docker es una herramienta básica en el desarrollo moderno de software y ciencia de datos, que te permite construir, desplegar y gestionar aplicaciones en contenedores.
En este artículo, proporciono ejemplos de proyectos Docker para principiantes, intermedios y avanzados, centrados en compilaciones multietapa, optimización de imágenes Docker y aplicación de Docker en la ciencia de datos. Estos proyectos están diseñados para profundizar en tus conocimientos sobre Docker y mejorar tus habilidades prácticas.
Introducción a los proyectos Docker
Antes de lanzarte a los proyectos, asegúrate de que tienes Docker instalado en tu máquina. Dependiendo de tu sistema operativo (Windows, macOS, Linux), puedes descargar Docker desde el sitio web oficial de Docker.
También necesitarás conocimientos básicos de:
- Dockerfiles (para definir lo que hay dentro de tus contenedores)
- Docker Compose (para aplicaciones multicontenedor)
- Comandos básicos de la CLI como
docker build
,docker run
,docker-compose up
, etc.
Si necesitas refrescar tus conocimientos sobre los conceptos anteriores, consulta los cursos Introducción a Docker o Conceptos de Containerización y Virtualización.
¡Empecemos!
Proyectos Docker para principiantes
Al empezar con Docker, es importante elegir proyectos que se ajusten a tu nivel de habilidad y que, al mismo tiempo, te desafíen a aprender nuevos conceptos. Aquí tienes algunas ideas de proyectos para empezar:
Proyecto 1: Configurar un servidor web sencillo
En este proyecto, crearás un contenedor Docker que ejecute un servidor web básico utilizando Nginx. Nginx es uno de los servidores web de código abierto más populares para el proxy inverso, el equilibrio de carga y mucho más. Al final de este proyecto, habrás aprendido a crear y ejecutar contenedores con Docker y a exponer puertos para que se pueda acceder a la aplicación desde tu máquina local.
Nivel de dificultad: Beginner
Tecnologías utilizadas: Docker, Nginx
Instrucciones paso a paso
- Instala Docker: Asegúrate de que Docker está instalado en tu sistema.
- Crea el directorio del proyecto: Crea una nueva carpeta y un archivo
index.html
dentro de ella que será servido por Nginx. - Escribe el archivo Dockerfile: Un Dockerfile es un script que define el entorno del contenedor. Indica a Docker qué imagen base debe utilizar, qué archivos debe incluir y qué puertos debe exponer:
FROM nginx:alpine
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
- Construye la imagen Docker: Navega hasta la carpeta de tu proyecto y construye la imagen utilizando:
docker build -t my-nginx-app .
- Ejecuta el contenedor: Inicia el contenedor y asigna el puerto 80 del contenedor al puerto 8080 de tu máquina:
docker run -d -p 8080:80 my-nginx-app
- Accede al servidor web: Abre tu navegador y navega hasta http://localhost:8080 para ver la página que has creado.
Proyecto 2: Dockerizar un script Python
Este proyecto consiste en contenerizar un sencillo script de Python que procesa datos de un archivo CSV utilizando la biblioteca pandas. El objetivo es aprender a gestionar dependencias y ejecutar scripts Python dentro de contenedores Docker, haciendo que el script sea portable y ejecutable en cualquier entorno.
Nivel de dificultad: Beginner
Tecnologías utilizadas: Docker, Python, pandas
Instrucciones paso a paso
- Escribe el script de Python: Crea un script llamado
process_data.py
que lea y procese un archivo CSV. Aquí tienes un script de ejemplo:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.describe())
- Crea un archivo
requirements.txt
: Este archivo enumera las bibliotecas Python que necesita el script. En este caso, sólo necesitamospandas
:
pandas
- Escribe el archivo Dockerfile: Este archivo definirá el entorno para el script Python:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "process_data.py"]
- Construye la imagen Docker:
docker build -t python-script .
- Ejecuta el contenedor:
docker run -v $(pwd)/data:/app/data python-script
Proyecto 3: Construir una aplicación multicontenedor sencilla
Este proyecto te ayudará a familiarizarte con Docker Compose construyendo una aplicación multicontenedor. Crearás una aplicación web sencilla utilizando Flask como frontend y MySQL como base de datos backend. Docker Compose te permite gestionar varios contenedores que trabajan juntos.
Nivel de dificultad: Beginner
Tecnologías utilizadas: Docker, Docker Compose, Flask, MySQL
Instrucciones paso a paso
- Escribe la aplicación Flask: Crea una sencilla aplicación Flask que se conecte a una base de datos MySQL y muestre un mensaje. He aquí un ejemplo:
from flask import Flask
import mysql.connector
app = Flask(__name__)
def get_db_connection():
connection = mysql.connector.connect(
host="db",
user="root",
password="example",
database="test_db"
)
return connection
@app.route('/')
def hello_world():
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute("SELECT 'Hello, Docker!'")
result = cursor.fetchone()
connection.close()
return str(result[0])
if __name__ == "__main__":
app.run(host='0.0.0.0')
- Crea el archivo
docker-compose.yml
: Docker Compose define y ejecuta aplicaciones Docker multicontenedor. En este archivo, definirás la aplicación Flask y los servicios de la base de datos MySQL:
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
environment:
FLASK_ENV: development
volumes:
- .:/app
volumes:
db_data:
- Escribe el Dockerfile para Flask: Esto creará la imagen Docker para la aplicación Flask:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
- Construye y ejecuta los contenedores: Utiliza Docker Compose para que aparezca toda la aplicación:
docker-compose up --build
- Accede a la aplicación Flask: Ve a http://localhost:5000 en tu navegador.
Conviértete en Ingeniero de Datos
Proyectos Docker de nivel intermedio
Los siguientes proyectos son para quienes tienen un sólido conocimiento de los fundamentos de Docker. En ellos se introducirán conceptos más complejos, como las construcciones multietapa y las técnicas de optimización.
Proyecto 4: Creación en varias fases de una aplicación Node.js
Las compilaciones multietapa ayudan a reducir el tamaño de las imágenes Docker al separar los entornos de compilación y ejecución. En este proyecto, vas a contenerizar una aplicación Node.js utilizando compilaciones multietapa.
Nivel de dificultad: Intermediate
Tecnologías utilizadas: Docker, Node.js, Nginx
Instrucciones paso a paso
- Crea una aplicación Node.js sencilla: Escribe un servidor Node.js básico que devuelva un mensaje sencillo. He aquí un ejemplo:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello from Node.js'));
app.listen(3000, () => console.log('Server running on port 3000'));
- Escribe el archivo Dockerfile con construcción multietapa: La primera etapa construye la aplicación, y la segunda la ejecuta con una imagen base más ligera.
# Stage 1: Build
FROM node:14 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Add the following line if there's a build step for the app
# RUN npm run build
# Stage 2: Run
FROM node:14-slim
WORKDIR /app
COPY --from=build-stage /app .
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]
- Construye la imagen:
docker build -t node-multi-stage .
- Ejecuta el contenedor:
docker run -p 3000:3000 node-multi-stage
Proyecto 5: Dockerizar un modelo de aprendizaje automático con TensorFlow
Este proyecto consistirá en contenerizar un modelo de aprendizaje automático utilizando TensorFlow. El objetivo es crear un entorno portátil en el que puedas ejecutar modelos TensorFlow en varios sistemas sin preocuparte de la configuración subyacente.
Nivel de dificultad: Intermediate
Tecnologías utilizadas: Docker, TensorFlow, Python
Instrucciones paso a paso
- Instala TensorFlow en un script de Python: Crea un script Python
model.py
que cargue y ejecute un modelo TensorFlow preentrenado:
import tensorflow as tf
model = tf.keras.applications.MobileNetV2(weights='imagenet')
print("Model loaded successfully")
- Escribe el archivo Dockerfile: Define el entorno para TensorFlow dentro de Docker:
FROM tensorflow/tensorflow:latest
WORKDIR /app
COPY . .
CMD ["python", "model.py"]
- Construye la imagen:
docker build -t tensorflow-model .
- Ejecuta el contenedor:
docker run tensorflow-model
Proyecto 6: Crear un entorno de ciencia de datos con Jupyter y Docker
Este proyecto se centra en crear un entorno reproducible de ciencia de datos utilizando Docker y cuadernos Jupyter. El entorno incluirá bibliotecas populares de Python como pandas, NumPy y scikit-learn.
Nivel de dificultad: Intermediate
Tecnologías utilizadas: Docker, Jupyter, Python, scikit-learn
Instrucciones paso a paso
- Crea el archivo
docker-compose.yml
: Define el servicio Jupyter Notebook y las bibliotecas necesarias. He aquí un ejemplo:
version: '3'
services:
jupyter:
image: jupyter/scipy-notebook
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/joelwembo/work
- Inicia el Cuaderno Jupyter: Utiliza Docker Compose para iniciar Jupyter Notebook.
docker-compose up
- Accede al Cuaderno Jupyter: Abre tu navegador y ve a http://localhost:8888.
Proyectos Docker de nivel avanzado
Estos proyectos de nivel avanzado se centrarán en aplicaciones del mundo real y conceptos avanzados de Docker, como canalizaciones de aprendizaje profundo y canalizaciones de datos automatizadas.
Proyecto 7: Reducir el tamaño de una imagen Docker para una aplicación Python
En este proyecto, optimizarás una imagen Docker para una aplicación Python utilizando imágenes base mínimas como Alpine Linux e implementando compilaciones multietapa para mantener el tamaño de la imagen lo más pequeño posible.
Nivel de dificultad: Avanzado
Tecnologías utilizadas: Docker, Python, Alpine Linux
Instrucciones paso a paso
- Escribe el script de Python: Crea un script que analice datos utilizando pandas. Aquí tienes un script de ejemplo:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
- Optimiza el archivo Dockerfile: Utiliza compilaciones multietapa y Alpine Linux para crear una imagen ligera.
# Stage 1: Build stage
FROM python:3.9-alpine as build-stage
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY script.py .
# Stage 2: Run stage
FROM python:3.9-alpine
WORKDIR /app
COPY --from=build-stage /app/script.py .
CMD ["python", "script.py"]
- Construye la imagen:
docker build -t optimized-python-app .
Proyecto 8: Dockerizar un pipeline de aprendizaje profundo con PyTorch
Este proyecto consiste en contenerizar una canalización de aprendizaje profundo utilizando PyTorch. El objetivo es optimizar el Dockerfile en cuanto a rendimiento y tamaño, facilitando la ejecución de modelos de aprendizaje profundo en distintos entornos.
Nivel de dificultad: Avanzado
Tecnologías utilizadas: Docker, PyTorch, Python
Instrucciones paso a paso
- Instala PyTorch en un script de Python: Crea un script que cargue un modelo PyTorch preentrenado y realice la inferencia. He aquí un ejemplo:
import torch
model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
print("Model loaded successfully")
- Escribe el archivo Dockerfile: Define el entorno para PyTorch:
FROM pytorch/pytorch:1.9.0-cuda11.1-cudnn8-runtime
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY model.py .
CMD ["python", "model.py"]
- Construye la imagen:
docker build -t pytorch-model .
- Ejecuta el contenedor:
docker run pytorch-model
Proyecto 9: Automatización de canalizaciones de datos con Apache Airflow y Docker
En este proyecto, configurarás y pondrás en contenedores un entorno Apache Airflow para automatizar canalizaciones de datos. Apache Airflow es una popular herramienta para orquestar flujos de trabajo complejos muy utilizada en ingeniería de datos.
Nivel de dificultad: Avanzado
Tecnologías utilizadas: Docker, Apache Airflow, Python, PostgreSQL
Instrucciones paso a paso
- Crea el archivo
docker-compose.yml
: Define los servicios Airflow y la base de datos PostgreSQL:
version: '3'
services:
postgres:
image: postgres:latest
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
webserver:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
ports:
- "8080:8080"
volumes:
- ./dags:/opt/airflow/dags
command: ["webserver"]
scheduler:
image: apache/airflow:latest
environment:
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CORE__EXECUTOR: LocalExecutor
depends_on:
- postgres
- webserver
volumes:
- ./dags:/opt/airflow/dags
command: ["scheduler"]
volumes:
postgres_data:
- Inicia el entorno Flujo de aire: Utiliza Docker Compose para activar el entorno Airflow:
docker-compose up
- Accede a la interfaz de usuario de Airflow: Abre tu navegador y ve a http://localhost:8080.
Proyecto 10: Desplegar una API de ciencia de datos con FastAPI y Docker
Construye y despliega una API de ciencia de datos utilizando FastAPI. Containerizarás la API utilizando Docker y te centrarás en optimizarla para entornos de producción.
Nivel de dificultad: Avanzado
Tecnologías utilizadas: Docker, FastAPI, Python, scikit-learn
Instrucciones paso a paso
- Escribe la aplicación FastAPI: Crea una API sencilla que utilice un modelo de aprendizaje automático para las predicciones. He aquí un ejemplo:
from fastapi import FastAPI
import pickle
app = FastAPI()
with open("model.pkl", "rb") as f:
model = pickle.load(f)
@app.post("/predict/")
def predict(data: list):
return {"prediction": model.predict(data)}
- Escribe el archivo Dockerfile: Crea un Dockerfile que defina el entorno para FastAPI:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
- Construye la imagen:
docker build -t fastapi-app .
- Ejecuta el contenedor:
docker run -p 8000:8000 fastapi-app
Consejos para trabajar en proyectos Docker
Mientras trabajas en estos proyectos, ten en cuenta los siguientes consejos:
- Empieza poco a poco: Empieza con proyectos poco exigentes, y luego pasa a tareas más complejas. Crear confianza con tareas más sencillas es fundamental.
- Documenta tus progresos: Lleva un registro detallado de tus proyectos para realizar un seguimiento de tu aprendizaje y utilizarlo como referencia para futuros esfuerzos.
- Únete a las comunidades Docker: Participa en foros en línea y reuniones locales para compartir tus experiencias, hacer preguntas y aprender de los demás.
- Experimenta y personaliza: No tengas miedo de modificar los proyectos, probar distintos enfoques y explorar nuevas funciones de Docker.
- Sigue aprendiendo: Sigue ampliando tus conocimientos sobre Docker explorando temas y herramientas avanzados como Kubernetes, Docker Swarm o la arquitectura de microservicios.
Conclusión
Dominar Docker implica algo más que aprender comandos y configuraciones. Se trata de comprender cómo encaja Docker en el desarrollo de aplicaciones modernas, en los flujos de trabajo de la ciencia de datos y en la gestión de infraestructuras.
Los proyectos que he compartido en esta guía proporcionan algunas ideas para desarrollar las habilidades básicas y la experiencia práctica necesarias para sobresalir finalmente en escenarios del mundo real.
Llegados a este punto, te sugiero que solidifiques tus conocimientos siguiendo estos cursos:
Conviértete en Ingeniero de Datos
Preguntas frecuentes
¿Cuáles son las mejores prácticas para escribir archivos Docker eficientes?
Las mejores prácticas para escribir archivos Docker eficientes incluyen minimizar el número de capas combinando comandos, utilizar compilaciones multietapa para reducir el tamaño de la imagen, seleccionar imágenes base ligeras, almacenar en caché las dependencias y evitar incluir archivos innecesarios en la imagen final.
¿Qué es una compilación multietapa en Docker?
Una compilación en varias fases es un método para optimizar las imágenes Docker separando los entornos de compilación y de ejecución. Así se obtienen imágenes más pequeñas y seguras.
¿Cómo puedes reducir el tamaño de una imagen Docker?
Utiliza imágenes base mínimas, gestiona eficazmente las dependencias y emplea compilaciones multietapa para reducir el tamaño de la imagen y mejorar el rendimiento.
¿Cómo puedo solucionar errores comunes al crear imágenes Docker?
Los errores más comunes al construir imágenes Docker incluyen problemas de permisos, sintaxis incorrecta del archivo Dockerfile y fallos en la instalación de dependencias. Para solucionar el problema, comprueba los registros de compilación de Docker, asegúrate de que estás utilizando la imagen base correcta y confirma que las rutas o los permisos de los archivos están configurados correctamente. Herramientas como docker build --no-cache
pueden ayudar a identificar problemas de caché.
¿Puedo utilizar Docker con Kubernetes para estos proyectos?
Sí, una vez que te sientas cómodo con Docker, Kubernetes puede ser el siguiente paso. Kubernetes ayuda a gestionar aplicaciones en contenedores a escala. Puedes desplegar tus proyectos Docker en un clúster Kubernetes para gestionar múltiples instancias, manejar el escalado y automatizar los despliegues.
¿Cuáles son las mejores prácticas para gestionar volúmenes Docker y datos persistentes?
Cuando trabajes con volúmenes Docker, es importante utilizar volúmenes con nombre para garantizar la persistencia de los datos en los reinicios de los contenedores. Haz copias de seguridad periódicas de tus volúmenes y vigila cualquier cuello de botella en el rendimiento debido a la E/S del disco. Evita almacenar datos sensibles en contenedores directamente; utiliza en su lugar soluciones de almacenamiento seguras o bases de datos externas.
¿Para qué sirve la directiva ENTRYPOINT en un archivo Dockerfile?
La directiva ENTRYPOINT
de un Dockerfile especifica el comando que se ejecutará siempre que se inicie un contenedor. Permite tratar el contenedor como un ejecutable, al que se le pueden pasar argumentos durante el tiempo de ejecución, lo que aumenta la flexibilidad.
¿Cuál es la diferencia entre CMD y ENTRYPOINT en un archivo Docker?
Tanto CMD
como ENTRYPOINT
especifican los comandos que se ejecutarán cuando se inicie un contenedor. Sin embargo, CMD
proporciona argumentos por defecto que se pueden anular, mientras que ENTRYPOINT
define el comando que siempre se ejecuta. ENTRYPOINT
es útil para crear contenedores que actúan como ejecutables, mientras que CMD
es más flexible para especificar comandos por defecto.
¡Aprende más sobre Docker con estos cursos!
curso
Intermediate Docker
programa
Containerization and Virtualization
blog
Los 13 mejores proyectos de AWS: De principiante a profesional
blog
20 proyectos de análisis de datos para todos los niveles

blog