¿Qué es Docker?
Creo que podemos decir que Docker fue un antes y un después en el mundo del desarrollo de aplicaciones y su despliegue. Hasta que apareció Docker, se utilizaban sistemas de virtualización completa para aplicar "modularidad" y para desplegar aplicaciones "independientes" dentro de una misma máquina. Ahora, con Docker, el despliegue de aplicaciones aisladas dentro de una misma máquina es mucho más simple y se ha extendido.
Desde que Docker apareció, en 2014, cada vez se utiliza más tanto desde el punto de vista del desarrollo de aplicaciones como de la administración de sistemas. Por decirlo de alguna manera, con Docker podemos empaquetar aplicaciones y distribuirlas fácilmente para que nosotros mismos u otros desarrolladores o administradores de sistemas puedan desplegarlas en sus plataformas Docker. Los contenedores Docker contienen todos los servicios necesarios para que la aplicación funcione, e incluso versiones concretas; pero, a diferencia de las máquinas virtuales, no se virtualiza el hardware ni el sistema operativo. Por eso, varios contenedores Docker pueden funcionar sobre el mismo sistema operativo o sobre la misma máquina sin problema. A lo largo de este artículo vamos a ir paso a paso explicando algunas partes de Docker y de cómo funciona, así como de dónde sacar los contenedores de Docker para ejecutar en nuestro sistema. [elementor-template id="80835"]Contenedores Docker vs. Máquinas virtuales
Realmente, no necesitamos palabras para explicar cuáles son las diferencias de funcionamiento entre un contenedor de Docker y una máquina virtual. Esta foto que tenemos en la web oficial de Docker lo explica todo: Te lo resumo en varias afirmaciones:- Todos los contenedores Docker que funcionan sobre una máquina comparten sistema operativo y kernel. De esta forma se ahorran recursos y, aun así, los servicios o aplicaciones en contenedores están aislados.
- Cada contenedor de Docker tiene los servicios necesarios para que la aplicación funcione, ya que se empaqueta la aplicación junto con los servicios y parte de la configuración hecha.
- El hecho de utilizar un sistema operativo común hace que el consumo de recursos sea mucho más bajo, por lo que una misma máquina puede alojar muchos más contenedores de Docker que máquinas virtuales con los mismos recursos.
¿Qué ventajas tiene el uso de Docker?
Independientemente del tema de los recursos utilizados que he comentado, al tratar las diferencias entre Docker y una máquina virtual, Docker tiene más ventajas. Una de las más significativas es que un desarrollador puede garantizar que su código funciona al desplegar ese "código" en una imagen Docker, ya que no tiene que preocuparse de la mayoría de variables del entorno. Para esto, la imagen de Docker contiene todo lo necesario con las versiones específicas para que ese "código" funcione correctamente. Aunque es cierto que puede darse el caso de que haya varios servicios "duplicados" funcionando en la misma máquina al juntarse varios contenedores Docker que contengan los mismos servicios en distintas versiones, siempre es mejor esto que duplicar todo el stack para cada máquina virtual. Al añadir Docker Compose a la ecuación (lo vamos a explicar un poco más abajo), añadimos una herramienta de gestión que nos permite manejar stacks de varios contenedores Docker de una forma muy simple, automatizada y "en conjunto". No obstante, son necesarios conocimientos algo avanzados para poder crear el archivo de configuración necesario.Docker Engine: ¿Qué es?
Se trata de la parte que nos permite construir y crear contenedores. También se encarga de todo lo que tiene que ver con la ejecución de contenedores de Docker. Docker Engine es lo que vamos a instalar sobre el servidor o sistema operativo que hará de "host" para el sistema Docker. El Docker Engine tiene un daemon que se encarga de mantener los contenedores funcionando, y esto incluye los volúmenes y las conexiones de red de cada contenedor. Por otro lado, tenemos dos formas de interactuar con Docker Engine:- Nos ofrece un REST API a la que podemos conectar un panel como Portainer con el fin de gestionar los contenedores de una forma más "visual" y mucho más simple para usuarios que no estén acostumbrados a la línea de comandos.
- También nos ofrece una interfaz en línea de comandos para poder administrar los contenedores directamente desde el SSH del servidor donde tenemos funcionando Docker Engine.
Docker Hub: ¿Qué es?
Aunque cualquiera puede crear imágenes de Docker para utilizarlas posteriormente como contenedores Docker, la verdad es que podemos obtener estas imágenes creadas por otros profesionales desde un repositorio llamado Docker Hub. Podemos ver todo lo que hay en Docker Hub desde su sitio web oficial: https://hub.docker.com/ En Docker Hub podemos encontrar múltiples imágenes empaquetadas por distintos profesionales con distintas configuraciones, aunque normalmente el desarrollador oficial de una aplicación tiene su propia imagen de Docker subida a este repositorio. Aunque aquí estamos hablando de empaquetar aplicaciones en contenedores de Docker, realmente podemos meter dentro cualquier cosa que se pueda ejecutar en Docker: aplicaciones, sistemas operativos completos o cualquier aplicación web o multiplataforma que pueda funcionar sobre ese sistema operativo. Por otro lado, en Docker Hub tenemos dos tipos de imágenes de Docker: las oficiales y las comunitarias. Las oficiales son muchas menos, pero normalmente tenemos la garantía de que van a funcionar correctamente con una configuración estándar. En las comunitarias la cosa es más variable, al ser subidas directamente por miembros de la comunidad. Desde Portainer (que vamos a ver lo que es más adelante) o desde la línea de comandos podemos utilizar "pull" para descargar cualquier imagen de Docker desde el repositorio y, automáticamente, crear un contenedor que será ejecutado en Docker. Esto es un resumen muy simple de lo que se puede hacer con Docker Hub, pero es suficiente para la mayoría de usuarios que no van a hacer un uso intensivo de Docker. Desde el punto de vista del desarrollador que quiere crear una imagen de Docker comunitaria para que otros usuarios puedan utilizarla, se pueden hacer muchas cosas más, como la automatización de builds y el escaneo de vulnerabilidades en las imágenes subidas.Portainer para Docker: ¿Qué es?
Nos ha quedado claro que existe un motor llamado Docker que puede ejecutar contenedores, ¿pero cómo se gestionan? Pues, como decía en el último párrafo del bloque anterior, podemos usar la interfaz de comandos del servidor o utilizar una interfaz gráfica llamada Portainer. Portainer se instala como un Docker más, pero tiene acceso al motor Docker y permite gestionar el resto de contenedores de Docker que tenemos funcionando en el mismo servidor. Lo bueno de Portainer es que muestra gráficamente el consumo de cualquier contenedor. También permite descargar imágenes, ejecutar contenedores, apagarlos y configurarlos. Como ya he comentado, la mayoría de los profesionales que usan Docker utilizan directamente la línea de comandos para la gestión del motor Docker. He de decir también que Portainer no es el único panel de control para Docker, pero sí que es el más conocido y el que puede más o menos ser considerado "oficial". Aunque no es el más fácil de utilizar, sí que es el que nos permite hacer más cosas.Docker Compose: ¿Qué es?
A mí la herramienta Docker Compose siempre se me ha atragantado bastante debido al archivo de configuración previo que hay que crear para usarla con contenedores Docker, aunque la considero indispensable. Te voy a poner un ejemplo práctico para que entiendas para qué se utiliza que a mí me sirvió bastante:- Yo necesitaba arrancar un contenedor Docker con NextCloud para hacer sincronización de archivos, pero la mayoría de contenedores de NextCloud y OwnCloud no traen MySQL o MariaDB, sino que vienen "preparados" para usar SQLite (que baja bastante el rendimiento cuando trabajas con muchos archivos y muchas sincronizaciones).
- Mi idea desde un principio era tener el contenedor Docker de NextCloud y otro contenedor Docker con MariaDB, pero aquí ya entramos en el tema de "aplicación multicontenedor". Podría darse el caso de que me falle solo uno de los contenedores y que la aplicación no funcione.
- Con Docker Compose creamos un "pack" para que estos dos contenedores de Docker funcionen "juntos". Además, tienen que comunicarse entre sí y los volúmenes de ambos contenedores deben ser persistentes, algo que nos permite Docker Compose.