domingo, 6 de septiembre de 2020

Qué es Docker? Simple y brevemente explicado.

 Que es Docker? Simple y brevemente explicado

Docker en Inglés significa estibador, que es el típico trabajador portuario que carga y descarga mercancías de los barcos que atracan en puertos, distribuyendo los convenientemente los pesos según sea el caso. Actualmente todo viene o va en containers (contenedores), cada uno totalmente aislado de los demás y con cnontenidos diferentes o pueden ser iguales, pero no se mezclan.

El concepto de la traducción, no nos aclara nada, y en muchos blogs y webs nadie explica exactamente que es Docker, de forma sencilla, y la razón es que no tratan a Docker como un sistema de virtualización, cuando efectivamente, aunque no es un una maquina virtual (VM ) tal como se conoce,  si es una variante muy similar en el sentido que se consigue el efecto deseado de correr aisladamente programas o procesos, a mucho menor coste de recursos y tiempo en todos los sentidos, en comparación con las (VM) tradicionales.

Docker es un Sistema Gestionador de Contenedores basado en el paradigma de la virtualización a nivel de Sistema Operativo en el que el kernel de Linux permite la coexistencia de múltiples instancias de espacio (Contenedores) de usuario totalmente independientes y aisladas.

Es complejo de entender? Pues sí, ya que es muy difícil de expresar en palabras el concepto. Veamos si lo aclaro mejor con lo siguiente

Para usar Docker, si tiene que instalar el mismo en el PC en donde ser utilizará con cualquiera de los tres sistema operativos, MacOS , Windows 10 o Linux. Este creará un pequeño equipo virtual, con las funciones mínimas básicas de Linux para conectarse con el hardware disponible en el equipo que anfitrión físico. A partir de aquí, vendrán los llamados namespaces (nombres de espacio) y control groups que son característicos de Linux, para crear los llamados contenedores, que serán procesos e hilos de procesos, que se ejecutaran por parte Docker.

Podríamos decir que en un PC físico el Docker dividiera en pequeños pc mas pequeños para hacer tarjetas o placas Arduino,(si no sabes que es Arduino pulsa en el enlace) que son esas pequeñas placas base (motherboards) que tienen el hardware mínimo básico, y en cada uno le asignará una aplicación o servicio.

Claro, en la realidad, todo esto a nivel de software y precisamente Docker hace precisamente eso. Optimiza al máximo posible en hardware del equipo en donde se encuentra instalado para distribuirlo en tre los contenedores de tenga en su Docker Host, que viene siendo ese PC capaz de hacer esa división, sin que físicamente sea real.

Estos espacios donde corren los contenedores, son la virtualización cada uno de equipos pseudo-reales adaptados para la aplicación que corra en ese contenedor, Es decir, la aplicación o servicio que aporta cada uno de esos contenedores, tiene todo lo  básico que necesita para que funcione correctamente y por lo tanto la aplicación cree que se esta ejecutando un PC real completo con todo lo necesario para su correcto funcionamiento, que incluye el sistema operativo específico que necesita y todos las aplicaciones, bibliotecas y dependencias que necesita para su correcto funcionamiento.
 
Resumiendo, Docker administra la gestión de mini equipos virtuales (Contenedores) basados en el kernel dedicados exclusivamente aplicaciones o servicios específicos que corren aisladamente en un equipo PC anfitrión, y que permite la gestión de estos por parte del usuario.
 
Hay que aclarar que Docker es capaz de correr un sistema de administración financiera completo, pero que esto impactaría negativamente en el funcionamiento del contenedor y efectividad, porque rompe precisamente el aislamiento de partes que deberían ser independientes.

El funcionamiento final correcto de Docker es correr contenedores definidos por el usuario, dentro de los cuales habrá implementado aplicaciones y servicios, con total independencia entre ellos, en el equipo PC real anfitrión (host)  que los contenga.

Usando Docker hay evidentes y totalmente ventajosas diferencias sobre sistemas de virtualización como VMware, Virtual Box, Hyper-V Server de Microsot, Citrix, etc..
 

Analicemos la forma de virtualización tradicional y los problemas que los desarrolladores de aplicaciones se suelen tener.

Cuando un desarrollador necesita un entorno en virtualizado tradicional (VM), lo necesita con un sistema operativo X (Linux,Windows,Mac) y la versión donde haya probado ya esa aplicación, así mismo debe instalar y configurar tanto la aplicación en si misma como todas las bibliotecas y dependencias y que estas tengan la versiones ya probadas en la aplicación. En fin todo lo necesario que necesite, para reproducir el entorno en el cual desarrollo la aplicación 

El uso de tipo de virtualización tradicional, para ejecutar aplicaciones tiene varios problemas:

• Poner en marcha una máquina virtual completamente nueva e instalar un sistema operativo para ejecutar una única aplicación.

• Configurar e instalar todos los programas, bibliotecas y dependencias para el funcionamiento de la aplicación manualmente cada vez que desee instalar la aplicación en otros anfitriones.

• Tienen una gran sobrecarga sobre su potencia del equipo donde se instalan, ya que emulan un equipo completo, memoria, número de nucleos de CPU, etc.

• Aunque son portables a través de diferentes hipervisores VMware, VirutalBox, etc.) y están completamente aislados de su máquina host, tienen un gran tamaño de archivo en términos de portabilidad y del disco del host.

• Es común que suceda que "Mi equipo funciona perfectamente pero no en este otro no!".

Docker nos ayuda a resolver estos problemas de virtualización. Veamos con una descripción general de la forma de virtualización de Docker y veamos los diferentes componentes de Docker y cómo funcionan.

Como se adelantó al principio, Docker es un Sistema, o sea una aplicación, cuya función es gestionar contenedores desde tu creación y configurar, a su puesta en marcha, detención, modificación o actualización, volver a poner en marcha, detenerlos y si es necesario eliminarlos.

Ahora se va a entender mejor esto, y si Docker es un tipo de virtualización pero mas simplificada de cara a instalarlo en el anfitrión y correr nuestras aplicaciones finales, sin tener que usar una Maquina Virtual.

Docker es un programa que debemos instalar en el equipo anfitrión y consta de 5 partes principales:

• Imagen de Docker y Dockerfile

• Docker Registry y Docker Hub

• Docker Daemon

• Cliente Docker

• Host de Docker


Representación de la parte operativa de Docker
 
Realmente lo que ejecuta Docker es lo representado en la imagen superior, una aplicación, donde sus diferente partes realizan una función. 
 
Al instalar Docker en un equipo anfitrión o host, un programa demonio Docker Daemon se pone a la escucha para atender las petciones del cliente Docker y transmite las órdenes al Docker Host para las diferentes tareas que el cliente le indique.
 
Y aquí es cuando empezamos a preguntarnos y como hago yo para poner mi aplicación a funcionar con Docker, que es lo que debemos hacer? 
 
La respuesta es empezar generando un proyecto indique como debe ser el contenedor que deseamos crear, y ese proyecto no es otra cosa que un un plano o indicaciones que serán escritas en un archivo Dockerfile el cual sirve de guía a Docker para crear una imagen de lo que quiere el desarrollador o usuario, en un contenedor.
 
Es decir, obtener del DockerFile, el equipo con un sistema operativo x con x versión, las bibliotecas que necesite, dependencias, etc para que su aplicación se ejecute perfectamente. Este pseudo-equipo es en realidad el contenedor final.
 
Para ser mas claro, lo que hace DockerFile es indicar paso a paso lo que tendría que hacer el usuario para instalar una maquina virtual tradicional, indicándole uno por uno cada comandos y sus parámetros, para cada unos de los programas y aplicaciones necesarias.
 
Un ejemplo de un archivo Dockerfile
 
FROM ubuntu:20.04 # Sistema Operativo 

ADD . /app # se añade un directorio app

RUN apt-get update # actualiza versiones ya instaladas
RUN apt-get upgrade -y # actualizar a versiones mas nuevas
  
RUN apt-get install -y nodejs # instalar node js
RUN cd /app && npm install  # entra en app e instala npm

CMD npm start # ejecuta npm
 
Como vemos, este contenido simplemente tiene una secuencia instalación de aplicaciones y comandos que deseamos instalar en nuestro futuro contenedor
 
Aquí diríamos, huy!, esto se esta complicando mucho, pero no!. A nuestro rescate tenemos lo que es Docker Registry y Docker Hub, que es una especie de github donde ya podemos encontrar parte del trabajo hecho, sobre todo en la parte de los sistemas operativos y bases de datos, que nos ahorran mucho tiempo para generar la imagen o imágenes que necesitamos para nuestro uso particular.

Esta parte anterior es lo más difícil  de entender y llevar a cabo. Una vez dominemos este proceso, veremos que en realidad Docker tiene poco o nada que ver con el.

Es simplemente un proceso previo imprescindible para generar contenedores y podremos distribuir nuestras aplicaciones como copias exactas y funcionando perfectamente donde quiera que se ejecuten. aunque hay que dejar claro que siempre debe estar Docker instalado en ese equipo. 


El resto es conocer los comandos para construir la imagen, para obtener el contenedor, luego ejecutarlo, detenerlo, actualizarlo o modificarlo, volver a ejecutarlo y hasta eliminarlo.

Esto parece muy complicado, sobre todo para novatos, pero realmente es muy fácil y sencillo, pero laborioso en un principio, pero a la larga los beneficios son palpables. 

Hasta aquí la parte prevía, para darse una idea de que es Docker y para que se usa. Iré colocando enlaces para ir tratando de ir paso a paso entrando en este interesante mundo virtual Docker.

Como siempre si detectas algún error u omisión, o hacer una observación importante, por favor deja un comentario, para corregir, cambiar los conceptos que sean necesarios. Muchas Gracias por visitar mi blog.

No hay comentarios:

Publicar un comentario

Tu comentario puede ser muy útil, asi que no dudes en dejar el tuyo.
Si es relacionado con algún problema, error. etc. trata de ser muy explicito, y detallar el problema y las circunstancias en las que se produjeron. Si lanza algún error trata de copiarlo y pegarlo junto con una descripción del problema, ya que a veces los errores del sistema no son en realidad la causa del problema.

Vistas de página en total