# Introducci贸n a la Contenerizaci贸n 馃惓 Vamos a sumergirnos en el mundo de los contenedores, una tecnolog铆a que ha transformado la forma en que los desarrolladores empaquetan, distribuyen y ejecutan sus aplicaciones. Si bien es un concepto que a menudo se asocia con el backend, entender los fundamentos de los contenedores es crucial para cualquier desarrollador, incluido el frontend. ## 驴Qu茅 es un Contenedor? Un contenedor es una unidad de software empaquetada y estandarizada que puede incluir todo lo necesario para ejecutar una aplicaci贸n: el c贸digo, el entorno de ejecuci贸n, las librer铆as del sistema y las dependencias. Piensen en un contenedor como una caja 馃摝 totalmente aislada que contiene su aplicaci贸n. No importa en qu茅 m谩quina o sistema operativo la pongan, la aplicaci贸n dentro de la caja funcionar谩 exactamente igual porque tiene todo lo que necesita consigo. Esto resuelve el cl谩sico problema de **"funciona en mi m谩quina"**. > **Nota:** A diferencia de las m谩quinas virtuales (VMs), los contenedores son mucho m谩s ligeros y r谩pidos porque comparten el kernel del sistema operativo del host en lugar de virtualizar un sistema operativo completo. ## Docker: El Rey de los Contenedores Docker es la plataforma m谩s popular para crear, gestionar y ejecutar contenedores. Vamos a ver los componentes principales del ecosistema de Docker. ### Arquitectura de un Host con Docker ![Arquitectura de Docker](dockerarchitecture.webp) Un host con Docker tiene dos partes principales: - **Docker Daemon (o Engine):** Es el proceso que se ejecuta en segundo plano y gestiona todas las operaciones de los contenedores. Se encarga de construir im谩genes, ejecutar contenedores y manejar la red y el almacenamiento. - **Docker CLI (Cliente):** Es la herramienta de l铆nea de comandos que usamos para interactuar con el Docker Daemon. Cuando escribes un comando como `docker run`, el cliente se comunica con el daemon para ejecutar la acci贸n. ### Im谩genes vs. Contenedores Es crucial entender la diferencia entre estos dos conceptos: - **Imagen:** Una imagen es una plantilla inmutable que contiene las instrucciones para crear un contenedor. Las im谩genes se construyen a partir de un Dockerfile. - **Contenedor:** Un contenedor es una instancia en ejecuci贸n de una imagen. Se pueden crear m煤ltiples contenedores a partir de una misma imagen. ## Conceptos Clave en Docker ### Persistencia de Datos Por defecto, los contenedores son ef铆meros. Esto significa que cuando se detiene y se elimina un contenedor, todos los datos que estaban dentro de 茅l se pierden. Para que los datos persistan, usamos **vol煤menes**. Un volumen es un mecanismo de almacenamiento que existe fuera del ciclo de vida del contenedor. Es un directorio en el sistema de archivos del host que se "monta" o se enlaza a un directorio dentro del contenedor. De esta manera, aunque el contenedor sea eliminado, los datos en el volumen permanecen. ### Exposici贸n de Puertos Si su aplicaci贸n se ejecuta dentro de un contenedor, 驴c贸mo se conecta un usuario a ella? La respuesta es **exponiendo puertos**. La exposici贸n de puertos crea un enlace entre un puerto del host (tu m谩quina) y un puerto del contenedor. Por ejemplo, si tu aplicaci贸n frontend se ejecuta en el puerto 3000 dentro del contenedor, puedes mapear el puerto 8080 de tu m谩quina al puerto 3000 del contenedor (`-p 8080:3000`). As铆, al acceder a `localhost:8080` desde tu navegador, en realidad est谩s accediendo a la aplicaci贸n dentro del contenedor. ## Comandos B谩sicos de Docker CLI Ahora, vamos a ver los comandos que m谩s usar谩n en su d铆a a d铆a. | Comando | Descripci贸n | Ejemplo de Uso | |---------|-------------|----------------| | `docker pull` | Descarga una imagen de un registro (como Docker Hub). | `docker pull node:18-alpine` | | `docker build` | Construye una imagen a partir de un Dockerfile. | `docker build -t mi-app-frontend .` | | `docker run` | Crea y ejecuta un contenedor a partir de una imagen. | `docker run -d -p 8080:3000 mi-app-frontend` | | `docker ps` | Lista los contenedores en ejecuci贸n. Usa `-a` para ver todos (ejecutando y detenidos). | `docker ps -a` | | `docker stop` | Detiene un contenedor en ejecuci贸n. | `docker stop ` | | `docker start` | Inicia un contenedor que est谩 detenido. | `docker start ` | | `docker rm` | Elimina un contenedor detenido. | `docker rm ` | | `docker rmi` | Elimina una imagen. | `docker rmi ` | | `docker exec` | Ejecuta un comando dentro de un contenedor en ejecuci贸n. | `docker exec -it /bin/bash` | ## Docker Compose: Orquestaci贸n de Aplicaciones Cuando una aplicaci贸n se vuelve m谩s compleja, con un frontend, un backend y una base de datos, ejecutar cada contenedor individualmente se vuelve tedioso. Aqu铆 es donde entra **Docker Compose**. Docker Compose es una herramienta para definir y ejecutar aplicaciones multi-contenedor usando un solo archivo `docker-compose.yml`. ### Ejemplo de docker-compose.yml ```yaml version: '3.8' services: frontend: build: . ports: - "8080:3000" volumes: - ./src:/usr/src/app/src container_name: mi_app_frontend command: npm start backend: image: mi-backend-imagen:1.0 ports: - "5000:5000" ``` #### Explicaci贸n de las propiedades: - **`version`:** Especifica la versi贸n del formato del archivo Compose. - **`services`:** Define los servicios (contenedores) de la aplicaci贸n. - **`frontend` y `backend`:** Son los nombres de los servicios que vamos a crear. - **`build: .`:** Le dice a Docker que construya la imagen para el servicio frontend usando el Dockerfile que est谩 en el directorio actual. - **`ports`:** Mapea los puertos del host a los puertos del contenedor. - **`volumes`:** Monta un volumen. En este caso, el c贸digo fuente local (`./src`) se sincroniza con el c贸digo dentro del contenedor, lo que permite ver los cambios en tiempo real sin tener que reconstruir la imagen. 隆Ideal para desarrollo! - **`container_name`:** Asigna un nombre espec铆fico al contenedor. ### Comandos 脷tiles de Docker Compose | Comando | Descripci贸n | Ejemplo de Uso | |---------|-------------|----------------| | `docker compose up` | Construye, crea y levanta todos los servicios definidos en el archivo docker-compose.yml. | `docker compose up -d` Modo que ejecuta los contenedores en segundo plano.| | `docker compose down` | Detiene y elimina los contenedores, redes y vol煤menes creados por up. | `docker compose down` | | `docker compose ps` | Lista los servicios de la aplicaci贸n. | `docker compose ps` | | `docker compose logs` | Muestra los logs de los servicios. | `docker compose logs frontend` | ## 驴Por qu茅 deber铆amos usar Docker? - **Entorno de desarrollo consistente:** Todos en el equipo trabajan con el mismo entorno, eliminando problemas de dependencias. - **Aislamiento:** Permite probar diferentes versiones de Node.js o de librer铆as sin afectar el sistema global. - **Despliegue simplificado:** El mismo contenedor que se usa para desarrollo se puede usar en producci贸n, lo que reduce las incompatibilidades.