¡Bienvenidx al nivel final del curso sobre Docker!
En este nivel vamos a juntar todo el conocimiento y las habilidades que ya obtuviste.
En las lecciones pueden aparecer lenguajes de programación o tecnologías que no conoces. Tendrás que configurar puertos o agregar nombres a métodos, todo esto basado en código ya preparado, donde el 99% del trabajo ya está hecho.
No te preocupes si algo te parece desconocido. Esto está hecho a propósito para mejorar tu habilidad de "esto no lo sé, pero puedo aprenderlo rápidamente".
1.1 Planteamiento del problema
Vamos a crear una pequeña aplicación multicontenedor y desglosar paso a paso todo el proceso de desarrollo: desde el planteamiento del problema hasta la demostración del producto final.
Objetivo: crear una aplicación multicontenedor para la gestión de tareas, que permita a los usuarios crear, editar, eliminar tareas y asignarlas a otros usuarios. La aplicación estará compuesta por tres componentes principales: un frontend en ReactJS, un backend en Python (Flask) y una base de datos PostgreSQL.
Tareas principales:
- Definir los requisitos funcionales para cada componente de la aplicación.
- Escoger las tecnologías y herramientas a utilizar.
- Preparar el entorno de desarrollo.
1.2 Definición de requerimientos funcionales
Requerimientos funcionales para la aplicación de gestión de tareas:
- Registro y autorización de usuarios:
- El usuario puede registrarse en el sistema.
- El usuario puede autorizarse en el sistema.
- Gestión de tareas:
- El usuario puede crear tareas.
- El usuario puede editar tareas.
- El usuario puede eliminar tareas.
- El usuario puede ver la lista de tareas.
- El usuario puede asignar tareas a otros usuarios.
- Visualización y filtrado de tareas:
- El usuario puede filtrar tareas por estado (completadas/no completadas).
- El usuario puede ver tareas asignadas a otros usuarios.
1.3 Definición de las tecnologías y herramientas utilizadas
Para la implementación de esta aplicación se utilizarán las siguientes tecnologías y herramientas:
- Frontend:
- ReactJS: librería para crear interfaces de usuario.
- Axios: librería para realizar solicitudes HTTP.
- Backend:
- Python: lenguaje de programación para crear la parte del servidor.
- Flask: framework web para crear REST API.
- SQLAlchemy: ORM para interactuar con la base de datos.
- Base de datos:
- PostgreSQL: base de datos relacional para almacenar información sobre usuarios y tareas.
- Contenerización y orquestación:
- Docker: plataforma para la contenerización de aplicaciones.
- Docker Compose: herramienta para gestionar aplicaciones con múltiples contenedores.
1.4 Preparación del entorno de desarrollo
Para completar el proyecto con éxito, es necesario configurar el entorno de desarrollo y asegurarse de que todas las herramientas necesarias estén instaladas.
Pasos para preparar el entorno:
- Instalar Docker:
- Si aún no lo has hecho, vuelve a la lección 4 del nivel uno o sigue las instrucciones en el sitio oficial de Docker.
- Instalar Docker Compose:
- Si Docker Compose aún no está instalado, consulta la lección 2 del nivel 4 o sigue las instrucciones en el sitio oficial de Docker Compose.
- Crear la estructura del proyecto:
- Crea un directorio para el proyecto y subdirectorios principales para cada servicio:
mkdir task_management_app
cd task_management_app
mkdir frontend backend database
- Inicialización del proyecto:
- Dentro del directorio frontend inicializa un nuevo proyecto ReactJS:
cd frontend
npx create-react-app .
cd ..
• Dentro del directorio backend crea la estructura para la aplicación Python/Flask:
cd backend
mkdir app
touch app/__init__.py
touch app/models.py
touch app/routes.py
touch run.py
touch requirements.txt
cd ..
• Dentro del directorio database crea un Dockerfile para PostgreSQL (si es necesario):
cd database
touch Dockerfile
cd ..
1.5 Ejemplo de contenido de archivos:
Archivo backend/app/__init__.py
:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://taskuser:taskpassword@database:5432/taskdb'
db = SQLAlchemy(app)
from app import routes
Archivo backend/app/models.py
:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
tasks = db.relationship('Task', backref='owner', lazy=True)
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120), nullable=False)
description = db.Column(db.Text, nullable=True)
owner_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
Archivo backend/app/routes.py
:
from app import app
@app.route('/')
def index():
return "¡Hola, App de Gestión de Tareas!"
Archivo backend/run.py
:
from app import app
if __name__ == '__main__':
app.run(host='0.0.0.0')
Archivo backend/requirements.txt
:
Flask
Flask-SQLAlchemy
psycopg2-binary
GO TO FULL VERSION