Entendiendo Docker. Conceptos básicos: Imágenes, Contenedores, Links…

Al igual que el post anterior, éste está pensado para principiantes, para adentrarse en el mundo de Docker sin tener experiencia previa en este tema. El objetivo es tomar una base, entender ciertos conceptos, para luego ya aprender a usar los comandos de Docker y llevarlos a la práctica.
 ——-
La semana pasada vimos en líneas generales qué es Docker, qué significa el concepto de contenedor y para qué se utiliza Docker, junto con los beneficios que aporta (¿Qué es Docker? ¿Para qué se utiliza? Explicado de forma sencilla)
Hoy profundizaremos un poco más en el tema, y veremos cuáles son los elementos básicos de Docker, ya que cada uno de esos elementos aporta una serie de beneficios con respecto al uso de otras herramientas.
Los dos elementos más básicos de Docker son las imágenes y los contenedores.

Images

Una imagen es una especie de plantilla, una captura del estado de un contenedor. Ya comenté que un contenedor no es una máquina virtual, pero para que te hagas una idea, podríamos decir que una imagen de un contenedor es como un snapshot de una máquina virtual, pero mucho mucho más ligero.
Por ejemplo una imagen podría contener un sistema operativo Ubuntu con un servidor Apache y tu aplicación web instalada.
Las imágenes se utilizan para crear contenedores, y nunca cambian.
Hay muchas imágenes públicas con elementos básicos como Java, Ubuntu, Apache…etc, que se pueden descargar y utilizar. Normalmente cuando creas imágenes, partimos de una imagen padre a la que le vamos añadiendo cosas (p.e: una imagen padre con Ubuntu y Apache, que hemos modificado para instalar nuestra aplicación).
Un registro (local o remoto) en Docker contiene imágenes. Aquí tienes el registro público de Docker de donde puedes obtener la mayoría de las imágenes base que puedes necesitar.
Las imágenes se identifican por un ID, y un par nombre-versión, por ejemplo: ubuntu:latest, django:1.6, etc.

DockerFile

Es un archivo de configuración que se utiliza para crear imágenes. En dicho archivo indicamos qué es lo que queremos que tenga la imagen, y los distintos comandos para instalar las herramientas. Esto sería un ejemplo de DockerFile para tener una imagen de Ubuntu con Git instalado:
DockerFile_git
Sacado de https://github.com/harbur/docker-workshop/
Y aquí podemos ver un ejemplo de lo que te decía antes, de que normalmente creamos imágenes modificando otras imágenes padre. En este DockerFile, le estamos indicando a Docker que tome la imagen ubuntu:14.04 y sobre ella crearemos la nuestra, instalando git por consola.
Ejecutando el comando docker build sobre ese DockerFile, se nos creará la imagen correspondiente, lista para crear un contenedor.

Containers

Son instancias en ejecución de una imagen. Son los que ejecutan cosas, los que ejecutarán nuestra aplicación. El concepto de contenedor es como si restauráramos una máquina virtual a partir de un snapshot.
A partir de una única imagen, podemos ejecutar varios contenedores.
Docker_container_vs_images
Como podrás deducir a partir de la imagen anterior, esto es una buena manera de tener copias de tu aplicación ejecutándose en varios contenedores, para luego, a través de balanceadores de carga, distribuir los accesos a tu aplicación, y ofrecer servicios con más garantías y con menos carga de peticiones en cada contenedor.
Como las imágenes no cambian, si creas un contenedor a partir de una imagen, y mientras que se está ejecutando el contenedor cambias algo o instalas alguna herramienta, al parar dicho contenedor y después volver a ejecutar otra vez la misma imagen, esos cambios no se verán reflejados.
Docker va trackeando los cambios en los contenedores como si fuera una herramienta de control de versiones, por lo que si realmente deseas esos cambios, haciendo un commit del contenedor puedes crear otra imagen que contenga dichos cambios.
Por lo tanto otro beneficio de Docker, es el versionado de los contenedores. Si algo va mal en nuestra aplicación, podremos volver de forma sencilla a una versión anterior del contenedor, a una versión anterior del entorno.

Volumes

No es una buena práctica guardar los datos persistentes dentro de un contenedor de Docker. Para eso están los volúmenes, fuera de los contenedores. Así podremos crear y borrar contenedores sin preocuparnos por que se borren los datos.
Además los volúmenes se utilizan para compartir datos entre contenedores.

Links

Sirven para enlazar contenedores entre sí, que están dentro de una misma máquina, sin exponer a los contenedores cuáles son los datos de la máquina que los contiene.

Para saber más de Docker…

Esta serie de dos post ha sido una pequeña introducción al mundo de Docker, y a los usos que se le puede dar a la herramienta. Es sorprendente como cada día sale gente que ha encontrado distintos usos para Docker, combinándolo con otras herramientas.
A mi me parece una muy buena herramienta a tener en cuenta a la hora de montar entornos, facilitar despliegues y rollbacks y crear procesos de integración continua, a todos los niveles: para desarrolladores, testers y sistemas.
Si quieres seguir aprendiendo más sobre esta herramienta, te recomendaría que pasases a leer la documentación oficial, y entraras ya a aprender los distintos comandos de Docker, creación de imágenes, ejecución de contenedores, etc.
Así que te dejo unos links útiles para empezar:
Arquitectura de Docker (documentación oficial):
https://docs.docker.com/introduction/understanding-docker/
DockerFiles:
https://docs.docker.com/reference/builder/
En general, toda la documentación oficial de Docker:
https://docs.docker.com
Tutoriales online:
https://hub-beta-stage.docker.com/enterprise/trial/
https://docs.docker.com/articles/basics/
http://www.alexecollins.com/first-steps-with-docker/
https://coreos.com/os/docs/latest/getting-started-with-docker.html
http://blog.flux7.com/blogs/docker/docker-tutorial-series-part-1-an-introduction
Utilizar Docker en producción necesita otra serie de consideraciones, desde cómo gestionar los balanceadores de carga, la alta disponibilidad, el sistema operativo de las máquinas de producción que contendrá los contenedores, etc., pero puede hacerse. En el meetup de Docker Barcelona de hace unas semanas, explicaron casos de éxito con Docker en producción.

jgarzas

Ph.D. en informática, Postdoctorado en la Carnegie Mellon (EE.UU) e Ingeniero en Informática.

Primera vez que me tocó hacer una gestión Ágil en una empresa... año 2001. Desde entonces he trabajado en, o para, más de 90. Y he formado a más de 2000 alumnos.

También soy profe de la Universidad Rey Juan Carlos.

12 comentarios en “Entendiendo Docker. Conceptos básicos: Imágenes, Contenedores, Links…”

  1. Hola Ana, lo primero gracias por realizar post tan sencillos y fáciles de entender.
    Básicamente quería preguntarte si más adelante mencionarás las diferencias existentes entre Docker y otros tipos de tecnologías similares como Vagrant o Puppet. Se que mencionaste la semana pasada que lo harías en el presente post pero al no ver las comparaciones no se si lo has querido separar para próximos post o simplemente no has visto útil mencionarlas.
    Un saludo.

    1. Ana M. del Carmen García Oterino

      Hola!
      Muchas gracias Salva. Al final lo respondí en un comentario el otro día, pero no te preocupes, tienes razón, mencioné que iba a comentarlo en próximos posts.
      El post de la semana que viene (este viernes no, la siguiente) tratará de eso 🙂
      Gracias!

  2. Hola Ana, lo primero felicitarte por los dos post que has hecho de Docker tan amenos y explicativos.
    La semana pasada leí que ibas a escribir algo sobre la comparación de DOcker con otros tipos de plataformas como Vagrant, ¿Sigues teniendo esa idea? Creo que sería muy interesante comentar las diferencias y similitudes entre herramientas que a priori a un no experto, como yo, podemos ver tan parecidas.
    Muchas gracias.
    Un saludo.

  3. hola, Ana M. del Carmen García Oterino, Gracias por tu valiosa informacion, muy buena, le escribe Marcos, me gustaria saber lo siguiente.
    Deseo probar DOCKER, cuales son los requisto en un servidor para la instalacion,
    2- puede brindar informacion desde si instalacion configuracion y puesto en produccion..
    Saludos y muchas gracias
    Marconis

  4. Muchísimas gracias por estos posts, por una información tan clara y tan bien explicada para los que somos un poco novatos en estos temas

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *