Tabla de Contenidos
El porqué de los contenedores
Contenido perteneciente al curso Docker avanzado.
¿Qué es una aplicación web?
En la ingeniería de software se denomina aplicación web a aquellas herramientas que los usuarios pueden utilizar accediendo a un servidor web a través de internet o de una intranet mediante un navegador.
En otras palabras, es un programa que se codifica en un lenguaje interpretable por los navegadores web en la que se confía la ejecución al navegador.
La elaboración de una aplicación es un proceso de ingeniería dividido en fases
Cada fase involucra diferentes roles con necesidades de conocimiento dispares pero complementarios
Las fases pueden ejecutarse de forma secuencial una única vez (metodología en Cascada)
O pueden ejecutarse N veces de forma repetitiva (metodología en espiral)
- Requisitos
- Diseño
- Codificación
- Pruebas
- Despliegue
- Mantenimiento
En las fases de Requisitos y Diseño se marcan las necesidades tecnológicas del proyecto y como se van a suplir:
- Se define la tecnología escogida para el desarrollo
- Se definen los requisitos no funcionales que darán lugar al diseño de la infraestructura de despliegue
Con gran diferencia, las fases de Codificación y Pruebas son las fases que más tiempo y recursos requieren en el total del proyecto
La fase de Despliegue comúnmente es la fase en la que se pone el software a funcionar en los entornos de producción
En la actualidad es muy común tener diferentes entornos previos al de producción para la realización de pruebas de integración o calidad
La fase de Mantenimiento es una fase posterior al desarrollo principal donde se abordan y solucionan posibles incidencias no detectadas en la fase de pruebas
Múltiples tecnologías para el desarrollo
- Capa Navegador
- HTML
- CSS
- JavaScript
- Capa servidor
- PHP
- Java
- JavaScript en lado servidor (SSJS)
- Perl
- Ruby
- Python
- Node.js
- C# y Visual Basic con sus tecnologías de ASP/ASP.NET
- Capa persistencia
- Bases de datos SQL (MySQL, PostgreSQL, Oracle, …)
- Bases de datos NOSQL (Cassandra, MongoDB, Redis, CouchDB, …)
Múltiples tecnologías para el despliegue
- Apache HTTP Server
- NGINX
- Apache Tomcat
- GlassFish
- Oracle WebLogic Server
- Microsoft IIS
Desplegando una aplicación web
A la hora de diseñar el despliegue de nuestra aplicación solemos manejar tres opciones:
- Servidor dedicado
- Virtualización
- Contenerización
Servidor dedicado
Hace años era la opción predeterminada
Si todas las aplicaciones comparten arquitectura y tecnologías es más fácil de configurar y mantener
Todas las aplicaciones coexisten en la misma máquina (SO):
- Puede suponer un problema de seguridad si no se manejan los permisos de forma adecuada
- Una aplicación puede consumir todos los recursos disponibles
- Un fallo crítico en una aplicación puede suponer la caída del resto de aplicaciones
El despliegue en un nuevo entorno implica un gran trabajo de configuración
La escalabilidad, cuando es posible, es complicada y costosa
Virtualización
Cada aplicación o conjunto de aplicaciones se despliega dentro de una maquina virtual (MV)
En el mismo servidor (host) pueden coexistir múltiples MV con tecnologías diferentes
El uso de recursos del host puede limitarse por MV
Un fallo crítico dentro de una MV no afecta a otras (isolación)
Mover la MV a otro servidor (con el mismo sistema de virtualización) es relativamente sencillo
La escalabilidad es más sencilla:
- Duplicar una MV es mucho más fácil que duplicar un servidor
- Se puede parar una instancia y relanzarla con más asignación de recursos
Contenerización
Existen varias opciones para la contenerización, pero sin duda la más extendida es Docker
El objetivo principal es el mismo, el aislamiento entre aplicaciones y generar un entorno replicable.
En este caso en lugar de albergar un SO completo lo que se busca es compartir directamente los recursos del SO Host
El Docker Engine es el encargado de lanzar y gestionar los contenedores buscando el uso optimo de los recursos del host
Docker funciona a partir de imágenes que se pueden reutilizar entre varias aplicaciones
Docker aisla directamente aplicaciones, no sistemas operativos.
¿Qué es Docker
Docker es un motor de código abierto que automatiza la implementación de aplicaciones en contenedores
Fue escrito por el equipo de Docker, Inc (anteriormente dotCloud Inc, uno de los primeros jugadores en el mercado de la Plataforma como Servicio (PAAS)), y publicado bajo la licencia Apache 2.0
Está diseñado para proporcionar un entorno ligero y rápido en el que ejecutar su código, así como un flujo de trabajo eficiente para llevar ese código de su computadora portátil a su entorno de prueba y luego a la producción
Puede comenzar con Docker en un host mínimo que no ejecute nada más que un kernel de Linux compatible y un binario de Docker
Porqué usar Docker
Olvídate del SO y de las configuraciones manuales
- Con las máquinas físicas o virtuales hay que instalar el SO, todo el software y dependencias que se necesita para que nuestra aplicación funcione de forma manual.
- Con Docker todo eso se puede especificar en el Dockerfile y cada vez que se arranque el contenedor se garantiza su correcta configuración y dsiponiblidad
- Una actualización o cambio de dependencias solo impacta en editar el Dockerfile, parar y volver a desplegar el contenedor
Adiós al "en mi máquina funciona"
- El contenedor de Docker proporciona consistencia. Lo que va dentro es siempre lo mismo independientemente de donde se despliegue
Mucho más ligero y escalable que una MV
- Uso más eficiente de los recursos del host
- Transformar fácilmente un único contenedor en una granja mediante Docker Composer
- Más potencia aun con Kubernetes
- Permite monitorizarlos, asegurarlos, ejecutarlos periódicamente, y muchas cosas más, para crear entornos empresariales con la complejidad que necesites.
Tan seguros como un MV
- Disponen de una versión reducida del espacio de usuario del sistema operativo
- Un contenedor no puede acceder a otros contenedores ni al sistema operativo subyacente (a excepción de los volúmenes de almacenamiento a los que les des permiso)
Control de versiones de la infraestructura
- Dado que toda la configuración de la infraestructura se hace en ficheros de texto plano, este fichero puede ir al Sistema de control de versiones junto con el propio código de la aplicación
Concebido para trabajar en la nube
- Los contenedores se pensaron con la nube en la mente
- En la actualidad los principales actores Cloud ofrecen completísimas opciones de despliegue de contenedores en sus infraestructuras
- Amazon Web Services
- Microsoft Azure
- Google Compute Engine
- Todos ellos soportan Kubernetes para permitir despliegues más complejos de multiples contenedores orquestados para trabajar y escalar de forma independiente
