¿Para qué nos sirve Docker?

4 octubre
Gastón Iriarte, Sr. Java Developer en DataArt
¿Para qué nos sirve Docker?
Parte 2 de 3: Docker

¡Hola a todos nuevamente:)!

En la edición anterior vimos una introducción a spring boot y llegamos a crear una aplicación REST para realizar un ABM de Ítems en una base de datos Mongo DB.

El objetivo de este artículo es detallar brevemente qué es Docker, para qué se utiliza y comprender su ciclo de vida como así también, el concepto de Docker Container y Docker Compose.

¿Qué es Docker?

Docker es una herramienta de virtualización que a diferencia de las máquinas virtuales suele utilizarse para levantar máquinas independientes con sistemas operativos ligeros y en muy poco tiempo.

Otradiferencia con lasmáquinasvirtualesradica en queloscontenedores de Docker no instalan el sistemaoperativocompleto, sinoquecomparten el núcleoyalgunasotrasbibliotecas core con el sistemaanfitrión.

Ventajas y Desventajas

Ventajas:

  • Consistencia de versiones: Dado que las mismas imágenes que se prueban en desarrollo son las que terminan desplegándose en producción, es muy difícil que puedan darse problemas referidos a control de versiones, códigos inesperados, etc.
  • Se reduce considerablemente el tiempo de despliegue y actualización de las aplicaciones.
  • Los contenedores pueden desplegarse fácilmente en entornos de integración continua.
  • Es ideal para cuando se pretende obtener un entorno distribuido y clusterizado.

Desventajas:

  • Docker fue inicialmente diseñado para usarse en entornos Linux. En lo sucesivo surgieron clientes para Windows y MacOS, pero su naturaleza aún sigue siendo basada en LXC (Linux Containers).
  • La curva de aprendizaje puede ser algo complicada y exigente en un principio, pero a la larga es un tiempo que se termina amortizando con el ahorro en tiempos de re-trabajo y puesta a punto por cada despliegue en los diferentes entornos.

Instalación

Si bien Docker respeta los principios y comandos básicos de Linux, puede ser utilizado en varios sistemas operativos. A continuación, los detalles para instalarlo en cada uno de ellos:

1. Instalación en Linux (Debian)

NOTA: tanto “apt-transport-https” como “dirmngr” deben estar instalados previamente, si no lo están es necesario correr “apt-get install apt-transport-https dirmngr”.

2. Instalación en Windows

Descargar docker for windows community edition:

https://store.docker.com/editions/community/docker-ce-desktop-windows

Doble click sobre docker for windows installer.exe y ejecutarlo.

3. Instalación en MacOS

Descargar docker for Mac community edition:

https://store.docker.com/editions/community/docker-ce-desktop-mac

Doble click en docker.dmg para instalar

Funcionamiento general

Para entender los estados del ciclo de vida de un contenedor en docker primero necesitamos conocer algunos conceptos principales:

1. Imagen

  • Una imagen representa la captura de un estado particular de un contenedor.
  • Dentro de una imagen debe especificarse todo lo que debe componer al contenedor en estado de ejecución. Pueden incluirse tantas aplicaciones como se desee.
  • Las imágenes manejan herencia, podemos partir de una imagen padre y heredarla para heredar así también todos sus componentes.
  • Existe un repositorio de imágenes que es público, denominado Docker Hub. En él se pueden descargar imágenes preconfiguradas con diferentes componentes (bases de datos, índices, servidores de aplicaciones, etc).

2. Contenedor

  • Un contenedor es el estado en ejecución de una imagen.
  • A partir de una imagen pueden ejecutarse uno o varios contenedores, los mismos pueden agregarse o quitarse dinámicamente.
  • Se pueden realizar cambios sobre un contenedor determinado y guardar los cambios realizando un “commit” en el repositorio de Docker. Al realizar un commit de un estado particular de un contenedor, el repositorio de docker asignará un nuevo número de versión y creará una nueva imagen con estos cambios.

3. DockerFile

  • Archivo de texto que contiene todos los comandos necesarios que se correrán durante la creación y ejecución del contenedor
  • Utilizando docker build se creará una imagen partiendo de un determinado dockerfile.

4. Docker Registry

  • El Docker Registry se utiliza como repositorio de imágenes.
  • Se puede crear un docker registry propietario de cualquier proyecto o bien se puede utilizar alguno público
  • Ejemplos de Docker Registry públicos son Docker Hub (gratuito) y Docker Trusted Registry (con costo)

Uniendo todos estos conceptos…

Algunos comandos básicos del Dockerfile

Los siguientes son algunos de los comandos básicos que pueden incluirse en el DockerFile. Veremos algunos ejemplos de ellos más adelante en el siguiente artículo, cuando mostremos un ejemplo de funcionamiento.

  • FROM: inicializa un nuevo build stage y toma una imagen base desde la cual heredar la actual.
  • RUN: Ejecuta una instrucción cualquiera desde línea de comando. A partir del resultado se generará un commit que será pusheado al repositorio como una nueva imagen.
  • CMD: Solo puede existir un CMD por cada DockerFile. Su principal propósito es proveer el comportamiento default de un contenedor en ejecución. En otras palabras, es el resultado final del contenedor con el comando que finalmente se desea correr. La diferencia con RUN es que CMD no ejecuta ningún commit (no interviene en el proceso de build del contenedor).
  • LABEL: Sirve para agregar metadata (variables) a la imagen. Se definen de una forma similar a las entradas de un properties file.
  • EXPOSE: Expone un puerto hacia el exterior del contenedor en ejecución.
  • ADD: Copia archivos o carpetas desde una fuente origen (en local o remota) hacia algún sitio determinado dentro del filesystem de la imagen.
  • COPY: Su propósito es similar al ADD, pero se entiende que el uso de COPY es exclusivo a recursos que provienen desde la máquina local (host) dejando el uso de ADD para cuando se quieran descargar recursos externos desde una URL.

Ciclo de vida de un contenedor

Haciendo foco particularmente en el contenedor, podemos mencionar que los diferentes estados que este puede manejar son “Created”, “Running”, “Stopped”, “Paused”, “Killed”.

Visto gráficamente estos son los estados con las transiciones correspondientes a cada comando que se puede ejecutar sobre un contenedor.

¡Esto es todo por hoy amigos! Nos vemos en la próxima edición donde veremos cómo implementar la aplicación Spring Boot desarrollada en la primera parte dentro de un entorno de contenedores Docker (Docker Containers).