Docker
Es una tecnologia que funge como proveedor. Esta te permite administrar contenedores (variacion de maquinas virtuales - ContainerD).
Docker Propone contenedores muy ligeros que sirven para poder guardar un conjunto de tecnologias, configuracion y todo lo que se necesario para que el funcionamiento de un Software
- Cada contenedor puede heredar de una imagen base que ya tiene instalada todas las dependencias necesarias para que los microservicios corran
Propone el concepto de Imagen de Docker que representa una descripcion para como se debe de instanciar un contenedor a partir de ella (Es como la OOP por Prototitpos).
# Ventajas
- Permite mantener ambientes de produccion y desarrollo desacoplados y funcionales de manera independiente
- Permite mantener un mismo ambiente de desarrollo entre multiples personas cada una en su maquina personal
- Permite mantener la gestion de dependencias y versiones de las tecnologias consistente a traves del proyecto
- Permite mantener multiples instancias de produccion de forma simultanea
# Arquitectura de Contenedores
Escencialmente la arquitectura de los contenedores de Docker se divide en tres capas importantes.
- El sistema operativo nativo de tu maquina
- Soporte para contenedores o virtualizacion
- Docker Engine
Teniendo estos tres elementos es posible lanzar una o varias instancias de distintos contenedores para que se ejecuten en la maquina. Muchos sistemas operativos modernos como W10 o W11 ya traen soporte nativo para contenedores con lo que solo se necesita instalar una plataforma como Docker para empezar a utilizarlos.
# Contenedor vs Maquina Virtual
Hay tres diferencias escenciales que nos ayudan para poder distinguir entre un contenedor y una maquina virtual
- Los contenedores instalan solo una capa muy fina de un S.O. y permiten reutilizar el mismo entre varios de ellos. Por otro lado, cada maquina virtual instala su propio sistema operativo completo y por tanto, es mucho mas pesado
- Los contenedores son extremadamente rapidos, estan optimizados al maximo y son ligeros. Por otro lado, las maquinas virtuales son muy pesadas, requiren de un hardware potente y hacen que la carga a una maquina sea mucha
- Los contenedores son altamente portables, es muy facil transportarlos de maquina a maquina. Por otro lado, la maquinas virtuales no son tan faciles de transportar entre maquinas.
# Imagenes vs Contenedores
Una imagen es una plantilla que contiene una serie de instrucciones que indican las tecnologias, versiones, dependencias y codigo que tiene dicha imagen para lanzar. A partir de esta, se crean uno o varios contenedores que son las instancias que ya pueden ejecutar todo lo contenido dentro de esta imagen.
# Capas de una Imagen
Una Imagen de Docker esta a su vez subdividida por capas. Se puede concebir a cada instruccion de un Dockerfile como una capa. Esto se realiza asi para que se permita mantener un cache de la imagen para que no sea necesario reconstruirla toda si esta sufre una modificacion.
Al sufrir una modificacion, las unicas partes que necesitarian ser reconstruidas serian las de todas aquellas instrucciones subsecuentes a la instruccion que fue inicialmente modificada.
Es importante recordar ademas que, las imagenes con Docker, una vez son construidas, son transformadas a solo lectura.
# Optimizacion de Dockerfile
Al hacer una Dockerfile, podemos hacer que ejecute una serie de comandos antes de llegar al entrypoint. Mediante esta, podemos colocar cosas como la compilacion de la aplicacion y cualquier serie de operaciones que sean necesarias para hacer deploy de la app.
El unico detalle con hacer lo anterior esque por cada vez que se cree la imagen o se modifiquen los archivos, se tendra que descargar las dependencias desde cero.
Esto ocurre porque las instrucciones de un Dockerfile son por capas, siempre que modificas una capa superior todas las posteriores vuelven a ser realizadas.
Para contrarestar esto, podemos indicar de forma explicita las copias de los archivos para que el Dockerfile quede de tal forma que cambios especificos (como cambios al codigo fuente) no afecten a las capas de descarga de dependencias.