Desde su liberación en 2013, el proyecto ha ido creciendo y se ha consolidado como uno de los más importantes en GitHub con el mayor número de estrellas y de forks.
Empresas como Microsoft, IBM, RedHat, HP, entre otras, no tardaron en ver la potencia y valor de Docker y por ello, participan activamente en su desarrollo y crean soluciones propias partiendo de Docker.
¿qué es Docker?
Es un proyecto open source utilizado principalmente para el despliegue de aplicaciones en espacios virtualizados. Estos espacios son también conocidos como contenedores.
Es una tecnología muy extendida en la industria del desarrollo de software, siendo una práctica muy frecuente en los equipos de desarrollo. Estos usan Docker para poder desplegar fácil y rápidamente las aplicaciones que crean.
¿qué es un contendor?
Es un espacio virtual (hay diferencias importantes con las máquinas virtuales) en dónde instalamos todo el software necesario para que podamos ejecutar las aplicaciones que vamos desarrollando.
Podemos tener un contenedor con una configuración muy específica. Por ejemplo, podríamos crear un contenedor que incluya Apache, PHP y MySQL con versiones muy concretas y lo podemos desplegar facilmente en otros sistemas en los que necesitemos que se encuentre en ejecución esta aplicación (estas plataformas sólo necesitan correr un servicio de Docker).
El objetivo de los contenedores es incluir todo lo necesario para que una aplicación se pueda ejecutar en cualquier plataforma sin tener que cambiar nada.
¿qué es una imagen?
Un contenedor sólo es posible crearlo a partir de una imagen.
Una imagen, a grandes rasgos, es una plantilla que nos permite crear contenedores. Incluye el diseño y la configuración necesaria para poder crear contenedores concretos.
De forma general, una imagen define el software que vamos a instalar en el contenedor y que versiones tienen que tener. Es decir, las imágenes siguen un modelo y sintaxis estándar.
A modo de ejemplo, podríamos hacer un símil en el mundo del desarrollo diciendo que "una imagen sería una clase y un contenedor el objeto propiamente dicho".
Estos dos elementos son imprescindibles para poder utilizar Docker.
Caraceterísticas importantes de Docker
- las imágenes y los contenedores se gestionan de una forma centralizada por medio de un servicio que se encuentra en ejecución en el sistema operativo. Este servicio es conocido como "dockerd".
En sistemas basados en linux (en las distribuciones más recientes) este servicio se encuentra gestionado, como muchos otros, por systemd.
Lo que normalmente hacemos es utilizar el cliente de Docker (comando docker) para poder conectarnos con este servicio y poder gestionar imágenes y contenedores.
Este comando se encarga de conectarse al servicio de docker y realizar todas las operaciones de administración sobre este servicio como son la gestión de imágenes y contenedores, configuraciones de red, etc.
- existen multitud de imágenes que tienen configuraciones estándar.
Es bastante habitual encontrarnos con equipos de desarrollo que van a necesitar el mismo stack tecnológico (Apache, PHP, MySQL por ejemplo). Para ello existe un repositorio centralizado conocido como Docker Hub (https://hub.docker.com/) en donde se encuentran cientos de imágenes registradas que podemos descargar y posteriormente utilizar para crear nuestros contenedores partiendo de esas imágenes.
- los contenedores admiten múltiples configuraciones, incluyendo la asignación de contenedores a distintos segmentos de red. Esto nos permite, entre otras cosas, crear contenedores que se van a ver entre ellos partiendo de un contexto de red común.
- en docker también podemos crear clusters de contenedores, crear volúmenes y otras muchas funcionalidades que facilitan la actividad de un DevOps.
Diferencias Contenedores vs Máquinas Virtuales
Las máquinas virtuales han sido la forma estándar y tradicional de desplegar múltiples aplicaciones con diferentes infraestructuras en una misma máquina o sistema.
Las máquinas virtuales se basan en un Hypervisor que es un software que permite la instalación de otros sistemas operativos (invitados) sobre el sistema anfitrión.
Las máquinas virtuales tienen una desventaja importante, cada sistema invitado es completamente independiente del sistema anfitrión, tiene su propia gestión de recursos, procesos, tareas, etc. Esto dificulta la gestión de las aplicaciones que instalamos en estos sistemas invitados.
En cambio docker, lo que propone es no instalar un sistema operativo invitado sino aprovechar las características que ya se encuentran disponibles en el sistema anfitrión. Esto es posible gracias al uso de un motor de Docker (Docker Engine).
Docker Engine es un servicio como cualquier otro que se encuentra en el sistema operativo anfitrión pero tiene la ventaja de que se pueden desplegar sobre este servicio diferentes contenedores y cada uno de estos contenedores va a ser completamente independiente de los otros, compartiendo la misma base (librerías, aplicaciones, etc) del sistema operativo.
Es mucho más liviano trabajar con imágenes y contenedores que trabajar con un sistema operativo completo, que es lo que hacemos con las máquinas virtuales con un hypervisor como por ejemplo VirtualBox o VMWare.