jueves, 25 de junio de 2015

Primera aproximación a Docker

Introducción




Esta entrada del Blog voy a dedicarla a una tecnología que emergió en Marzo de 2013, Docker. Desde aquí sólo quiero proponer una primera aproximación a la tecnología y explicar un poco con mis palabras sus fundamentos y proporcionar una visión general, así como una serie de enlaces a recursos. Dichos recursos nos servirán para poco a poco conocer y profundizar más en la tecnología.
La implementación y gestión de la infraestructura de red y cuestiones relacionadas con la seguridad las dejaré para futuras entradas.
¡Así que vamos al turrón!


¿Docker?¿Qué es Docker?

Docker es un proyecto open source que permite empaquetar en contenedores virtuales sistemas funcionales que “corren” sobre el kernel del sistema anfitrión, facilitando el despliegue de aplicaciones.
Docker se instala sobre el sistema anfitrión introduciendo una capa de abstracción, y aunque es multiplataforma y se puede instalar en Gnu/Linux, MS-Windows y Mac OS X los sistemas que puede “dockerizar” son únicamente sistemas Gnu/Linux.
No es un sistema de virtualización completo como el que proporciona KVM, es una especie de virtualización a nivel de sistema operativo en la que los contenedores interactúan con los recursos del sistema anfitrión.
Las instancias de los contenedores se ejecutan como procesos aislados proporcionando a dichos procesos independencia a nivel de:

  • Sistema de ficheros
  • Usuarios
  • Recursos como CPU, RAM, etc
  • Librerías
Los recursos destinados a dichas instancias pueden limitarse, por todo ello Docker proporciona un gran nivel de rendimiento y aprovechamiento de recursos.
Hay que aclarar que aunque Docker se ejecuta directamente sobre el kernel del sistema anfitrión e interactúe directamente con él, puede levantar instancias con sabores de Gnu/ Linux diferentes al del sistema Gnu/ Linux anfitrión. No olvidemos que Docker también corre sobre sistemas con Mac OS X y MS Windows.




En la imagen anterior podemos observar las diferencias entre las arquitecturas propuestas por una máquina virtual con virtualización completa y Docker. Mientras que la vm tiene que virtualizar todo un so completo, con todas las dependencias para cada una de las vm que aloja el sistema anfitrión, Docker sólo “virtualiza” lo estrictamente necesario para poder desplegar el sistema dockerizado. Todo lo que los contenedores puedan tomar/ compartir del kernel es compartido. 


Conceptos básicos para entender Docker

Para entender Docker es necesario tener claro algunos conceptos como:

  • Contenedor: es un “artefacto” que se ve como un subconjunto de directorios dentro del árbol de directorios del sistema que encapsula un sistema operativo junto con todos los recursos, librerías y servicios para que una aplicación pueda ejecutarse.
  • Imágenes: son plantillas de contenedores, a partir de las cuales se crearán contenedores.
  • Repositorio: almacén de imágenes. Algunos son públicos y otros privados, los hay gratuitos y los hay “de pago” donde se ofrecen imágenes con multitud de servicios.


¿Cómo funciona Docker?

Docker está conformado por Docker Engine y Docker Hub. Docker Engine o simplemente Docker es el encargado de la gestión/ administración de las instancias de los contenedores. Será el encargado de la creación, eliminación, iniciar y detener los contenedores. Docker Engine se despliega sobre el sistema operativo anfitrión.

Por otro lado, Docker Hub es un recurso centralizado para trabajar con Docker y sus componentes. Algunos de sus servicios ofrecidos son:
  • Almacenamiento de imágenes
  • Autenticación de usuarios

Como ya se ha hecho mención anteriormente Docker lo que hace es empaquetar en un contenedor una aplicación junto con todas las librerías, dependencias, etc que necesita para desplegar compartiendo el kernel del sistema anfitrión con otros contenedores si los hubiera. Dichos contendores corren como procesos aislados en el sistema anfitrión.
Para conseguir el aislamiento entre contenedores Docker se basa en LXC (Linux Container). LXC es un sistema de virtualización ligero a nivel de sistema operativo (como lo es también OpenVZ) que permite la creación de múltiples instancias/ contenedores, cada uno de ellos aislados, invisibles, impermeables e inaccesibles para los demás contenedores. A su vez LXC hace uso de algunas características del kernel de Gnu/ Linux de ahí que exija para correr al menos la versión 3.10, a saber:

  • Cgroups: es una característica del kernel de Gnu/ Linux que limita, registra e independiza el uso de recursos (CPU, memoria, red, etc) de un conjunto de procesos.
  •  Namespaces: es un mecanismo de seguridad que aísla los contenedores para que éstos no puedan ver y afectar a otros contenedores.


¿Qué aporta Docker?

Algunos de los beneficios que proporciona Docker son:

  • Portabilidad: podemos desplegar el contenedor en cualquier sistema que soporte Docker.
  • Sistema liviano: ya que no virtualiza un sistema completo sino sólo lo indispensable según las funcionalidades que queramos encapsular en el contenedor.
  • Multiplataforma: puede instalarse en Gnu/ Linux, Mac OS X y MS Windows
  • Escalabilidad: podemos desplegar más contenedores que permitan satisfacer las necesidades de los servicios que se ofrecen.
  • Facilidad de despliegue de contenedores, permitiendo crear diferentes entornos aislados (pruebas de código, software, actualizaciones, etc).
  •  Fiabilidad
  • Rendimiento y aprovechamiento de recursos: dada la baja penalización en rendimiento que suponen los contenedores.

Espero al menos haberme acercado al objetivo de proporcionar una visión general de Docker, de qué hace, cómo lo hace y en qué se basa para hacerlo.
¿Qué os parece? Ni que decir tiene que podemos comentar este tema y así completar el material expuesto.
Nos leemos en la próxima entrada, ahora os dejo una serie de enlaces a recursos.









https://www.youtube.com/watch?v=e6B_Y_tGFDE

 
 


Radar COVID

Tras largo tiempo sin publicar una entrada en el Blog, me he animado a escribir acerca de una App que podría llegar a ser muy útil en el con...