9.1 Arquitectura de Microservicios
Docker se ha vuelto una herramienta indispensable para el desarrollo moderno. Ayuda a crear, ejecutar y desplegar aplicaciones en contenedores aislados, lo que las hace convenientes, estables y fáciles de manejar. En esta lección, veremos ejemplos donde Docker simplifica significativamente la vida de los desarrolladores y administradores.
Problema
El desarrollo de aplicaciones monolíticas a menudo causa dificultades con el mantenimiento y la escalabilidad. Cualquier cambio en una parte puede afectar otras, lo que complica las actualizaciones y las pruebas.
Solución con Docker
Docker permite implementar una arquitectura de microservicios, empaquetando cada servicio en un contenedor separado. Esto asegura la independencia y el aislamiento de los microservicios.
Ejemplo
Supongamos que tienes una aplicación con tres microservicios: usuarios, pedidos y pagos. Con Docker, puedes crear tres contenedores:
docker run -d --name users-service users-image
docker run -d --name orders-service orders-image
docker run -d --name payment-service payment-image
9.2 Integración y Entrega Continua (CI/CD)
Problema
El desarrollo, las pruebas y la implementación a menudo toman mucho tiempo, especialmente si los entornos son diferentes entre sí.
Solución con Docker
Docker ayuda a crear un entorno uniforme para todas las etapas del desarrollo. Esto garantiza que la aplicación funcione de la misma manera en todos lados, desde el desarrollo hasta la producción.
Ejemplo
Configurar CI/CD con Docker permite automatizar la construcción, las pruebas y la implementación:
Construcción de la imagen:
docker build -t my-app .
Ejecutar pruebas:
docker run my-app ./run-tests.sh
Implementación:
docker push my-app:latest
ssh user@production-server "docker pull my-app:latest && docker run -d my-app"
9.3 Portabilidad y consistencia
Problema
A menudo una aplicación funciona en una máquina, pero se niega a arrancar en otra debido a diferencias en la configuración o versiones de las dependencias.
Solución con Docker
Docker permite empaquetar una aplicación con todas sus dependencias en un contenedor, que garantiza que funcione en cualquier entorno.
Ejemplo
Con un Dockerfile se pueden describir las dependencias y los comandos para ejecutar la aplicación:
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["npm", "start"]
Ahora la aplicación funcionará de manera estable tanto en la máquina local, como en el servidor o en la nube.
9.4 Garantizar la seguridad
Problema
La implementación de aplicaciones puede ser vulnerable, especialmente si se utilizan bibliotecas y herramientas de terceros.
Solución con Docker
Docker proporciona aislamiento de contenedores, lo que reduce los riesgos. Los contenedores funcionan de manera independiente, limitando el impacto en el sistema.
Ejemplo
Usa parámetros para limitar recursos y mejorar la seguridad:
docker run -d --name secure-app --memory="512m" --cpus="1" --security-opt=no-new-privileges my-secure-app
9.5 Pruebas y automatización
Problema
Probar en diferentes configuraciones lleva tiempo y puede afectar el entorno principal.
Solución con Docker
Docker permite crear entornos de prueba aislados sin afectar el sistema principal.
Ejemplo
Ejemplo de ejecución de una base de datos y una aplicación en un entorno de prueba:
docker run -d --name test-db -e POSTGRES_PASSWORD=mysecretpassword postgres
docker run -d --name test-app --link test-db:db my-app
9.6 Computación en la nube y escalabilidad
El problema
Escalar aplicaciones en la nube puede ser complicado y caro.
La solución con Docker
Docker simplifica la escalabilidad gracias a su integración con plataformas en la nube como AWS, Azure y Google Cloud.
Ejemplo
Usando Docker y Kubernetes, es fácil configurar la escalabilidad. Aquí tienes un ejemplo de archivo yaml. Tal vez al principio no sea tan claro, pero con el tiempo lo entenderemos todo.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mi-app
spec:
replicas: 3
selector:
matchLabels:
app: mi-app
template:
metadata:
labels:
app: mi-app
spec:
containers:
- name: mi-app
image: mi-app:latest
ports:
- containerPort: 80
GO TO FULL VERSION