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.
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.