Docker para el Abuelo (Parte 1 - Intro).
(Docker desde Cero para Principiantes)
Objetivo:
El objetivo de este curso es básicamente ayudar al SysAdmin de la vieja escuela a introducirse al mundo de los contenedores Docker, por lo tanto se trataran todos los temas desde cero y paso a paso, con ejemplos de complejidad muy baja, si ya estas trabajando con contenedores Docker quizas te aburras con este curso, si venis mas del palo SysAdmin de los fierros y de la virtualización tradicional, y te gustaría saber de que hablan cuando hablan de Docker Containers, este curso es ideal para vos.
Pre-requisito
Tener instalado Debian Stretch:La totalidad de este minicurso de Docker va a ser realizada sobre GNU/Linux Debian Stretch (versión 9 de Debian).
Quien ó qué es Docker?
Wikipedia dice: “Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de virtualización de aplicaciones en múltiples sistemas operativos.”
Definición muy técnica quizas, pero planteandolo de manera mas simple, podríamos decir que Docker es una herramienta que permite a cualquier persona sea informatica (sysadmin, devs etc) o no (el tío, la tía o el abuelo que guste de programar y Googlear mucho), realizar fácilmente la implementación de sus aplicaciones dentro de una especie de caja negra (llamada contenedor) para ejecutarse sobre el sistema operativo host (Linux, IOS, Windows), sería algo así como una Virtualización Extra-Liviana.
This is the POSTA !!!
El beneficio clave de Docker es que permite a sus usuarios “empaquetar” una aplicación con todas sus dependencias (si… espectacular!!!) en una unidad estandarizada para el desarrollo de software, esto también se traduce en portabilidad, es decir, puedo tomar esta caja (mi container Docker) y llevarla a cualquier otra máquina, levantarla y correrla sin que nos arroje ningún tipo de error por problemas de dependencias (te falta instalar algún paquete) o incluso por problemas de arquitectura de SO (Linux, IOS, Win). A diferencia de una máquina virtual, los contenedores son sumamente livianos y no tienen una gran sobrecarga, gracias a esto, permite un uso más eficiente de los recursos del sistema.
Maquinas Virtuales VS Contenedores
Maquinas Virtuales: Bare Metal (mucho mas pesado que el Power Metal ;] )
En el mundo de la virtualización tradicional (Bare Metal) para realizar la implementación de nuestras aplicaciones, contamos con un equipo host (el dueño de casa), que tiene hardware propio, dentro del cual tenemos instalado un sistema operativo, dentro del cual tenemos instalado un hypervisor. Una vez en este punto, debemos crear una máquina virtual (invitado en la casa), asignar recursos “virtuales” que lógicamente son descontados de los recursos del host, instalarle un SO propio (junto con tooodoosss los directorios involucrados para que un SO viva, los usemos o no) y recién en este punto comenzar a instalar y configurar nuestro entorno para que la aplicación pueda existir y cumplir su función Lo explicado en el párrafo anterior sólo puede significar una cosa MUCHOS RECURSOS DESPERDICIADOS!!!!! imaginense en una pequeña o mediana empresa por ejemplo 14 aplicaciones que tengan un peso de 700 MB cada una, eso nos da un total de 9,8 GB o si vamos a un ejemplo un poco más real, 14 aplicaciones para las cuales se levantan 14 VM’s y cada VM tiene por ejemplo 10 GB de disco (en caso de servers linux) 4GB de RAM y 2 núcleos de procesador, tendríamos un total de 56 GB de RAM, 140 GB de disco y 28 núcleos de procesador que deberíamos usar de nuestro Host. Son muchos recursos innecesariamente desperdiciados
Contenedores Docker
Con Docker, no es necesario tener todo un SO completo para virtualizar cosas, ya que el Engine de Docker aprovecha el Sistema Operativo sobre el cual se ejecuta, nuestras virtualizaciones van a compartir el Kernel del sistema operativo anfitrión o Host, incluso hasta pueden compartir parte de sus librerías Otra cosa muy copada que tiene Docker, es su sistema de archivos, el storage driver por default de Docker es AUFS, pero mucho mejor lo es Overlay2 ya que es más sencillo y más rápido, la implementación de uno u otro dependerá de tu kernel Linux pero no nos vamos a poner muy técnicos con este tema. Solo nos interesa saber que es un filesystem basado en “capas” (layers), pongamoslo como un ejemplo: supongamos que tenemos varios contenedores docker corriendo con una instancia de nginx en cada uno, el espacio en disco del host será ocupado por una sola instalación de nginx, y el Engine de Docker ocupará referencias a cada capa de cada contenedor para poder trabajar, algo muy groso que se traduce en optimización de manejo de recursos.
Podemos ver mucho mejor todo lo antes mencionado en la siguiente imagen:
Para mencionar algunas otras ventajas de usar contenedores Docker:
-
En su mayoría los containers son livianos (por lo general pesan unos cuantos MBs) y arrancan en pocos milisegundos.
-
Una vez que tenemos dockerizada una aplicación, aplicar otras tecnologías modernas como K8s, CI/CD, Microservicios etc. es mucho más sencillo.
-
Gracias a Docker llega a su fín la frase “En mi maquina funciona!!”
-
Tenemos disponibles muchas imágenes gratuitas en la registry pública (que veremos más adelante) y muchas otras imágenes licenciadas en otra registry exclusiva para empresas (que también veremos más adelante en este minicurso).
-
Docker solo funciona de manera nativa en ambientes UNIX, sin embargo, gracias a herramientas como boot2docker, se puede trabajar con Docker en Windows y en MacOS, y también es oportuno mencionar que existen imágenes docker “licenciadas” para implementar productos de software privativo, por ejemplo imágenes de Oracle, Windows Server, SQL server etc. para acceder a estas imágenes hay que pagar alguno de los planes Enterprise de Docker, pero puedo decir que con las imágenes gratuitas alcanza para hacer cosas interesantes, y por supuesto también vamos a aprender a hacer nuestras propias imágenes docker y subirla a nuestro propio repositorio de imágenes.
MobyDock
Como todo proyecto OpenSource, Docker tiene su mascota, es una ballena azul que no tenía nombre hasta que en el año 2013 la comunidad Docker la bautizó MobyDock, fin de la historia jajaj, les dejo el rankeo de la votación
Muuuuy por Arriba la ARQUITECTURA Docker
Vamos a ver un poco la arquitectura de Docker y su modo de trabajar, solo a modo informativo, ya que vas a aprender mucho mejor de Docker usandolo que mirando un diagrama de arquitectura jajaja. Bien, Docker es un conjunto de herramientas, pero cuando la gente dice “usé docker para esto o aquello” por lo general se refieren al “Docker Daemon” o a “Docker CLI”, observen la siguiente imagen:
- Docker Daemon: es un server que estas corriendo en tu SO Host desde el momento en que instalas Docker.
- Docker REST API: Docker Daemon expone una REST API (no importa si no sabes que es una REST API), para que otras herramientas de Docker puedan comunicarse con Docker Daemon a través de esta REST API.
- Docker CLI: es una tool basada en línea de comandos, que nos permite comunicarnos con Docker Daemon a través de la REST API y ejecutar instrucciones basadas en scripting o comandos directos al Docker Daemon.
Eso es todo lo que necesitas saber por ahora, no te preocupes por lo que son: containers, images, data volumes, networks, porque lo veremos más en detalle en este minicurso más adelante. Al ver el gráfico anterior podemos también ver que Docker se basa en una típica arquitectura cliente-servidor, el Daemon es el Server y Docker CLI es solo UNO de MUCHOS clientes posibles. La siguiente imagen muestra algunos flujos, de cómo el cliente “Docker CLI” se comunica con el Server “Docker Daemon” no me quiero poner muy teórico, así que solo les voy a dejar la imagen, y pasamos a algo un poco más práctico, no se preocupen por los conceptos que falten, los vamos a a ver a todos.
Bueno, a los Bifes!!
Vamos a instalar Docker en nuestra maquina Debian, siguiendo el siguiente enlace: instalar Docker
Hello DockerWorld !!
Haciendo honor al eterno ejemplo informatico, vamos a hacer nuestro Hola Mundo! con Docker, abrimos la terminal y ejecutamos lo siguiente:
$ docker run hello-world
Que pasó??, vamos a analizarlo paso a paso:
Parafraseando lo que pasó:
1. Docker CLI (el cliente) pregunta al Docker Daemon (Server) “che loco…. tenes alguna imagen de docker llamada hello-world?? y si la tenes en la última versión mejor ehh”.
2. Docker Daemon al no encontrar ninguna imagen llamada hello-world, en una especie de “catalogo de imagenes locales o imágenes conocidas”, hace un pull (una descarga) de dicha imagen de un repositorio remoto de imágenes o registry llamado Docker Hub, el cual además tiene la última versión de la imagen (indicado con el tag latest) vemos también que al terminar este proceso, aparecen en pantalla una serie de números y letras que en mi caso termina en 525, esto es un layer de docker o mejor dicho una especie de puntero que apunta (valga la redundancia) a la capa donde se encuentra la imagen descargada hello-world.
3. El Docker Daemon usa la imagen descargada para crear un contenedor, el cual en su interior tiene algo muy simple, mostrar un mensaje “Hello from Docker!” y todo el resto de info que muestra por pantalla, todo esto Docker Daemon lo envía al cliente Docker CLI y este último lo muestra en nuestra terminal.
Si lo ejecutan nuevamente al comando (docker run hello-world) van a notar que todo esto se ejecuta mucho mas rapido, ya que nuestro docker daemon ya cuenta con la imagen hello-world y solo tiene que crear un nuevo container.
También vemos que el mensaje nos hace una especie de desafío, sobre levantar un contenedor a partir de una imagen docker de Ubuntu y ejecutar la instrucción bash dentro del mismo, algo que no vamos a hacer nosotros jajaja, simplemente porque ubuntu es una distribución de GNU/Linux muy pesada y con demasiadas capas adicionales que no son del todo necesarias (y también porque no me cae bien esa distro jeje) en lugar de eso, vamos a levantar un contenedor a partir de una imagen de GNU/Linux llamada Alpine (una distro muy ligera) y además una vez que tengamos levantado dicho contenedor, vamos a levantar la shell sh dentro del mismo, con el siguiente comando:
$ docker run -it alpine sh
Con esto, acabamos de crear un contenedor a partir de una imagen ligera de GNU/Linux y además nos metimos dentro del contenedor, ahora podemos comenzar a jugar con los comandos de linux que queramos, si tiramos un simple ls podemos ver que el contenedor es un SO completo y totalmente funcional (pueden salir de su contenedor con el comando exit)
Hasta acá la primer parte de este mini-curso de Docker para principiantes, en este punto:
- Tenes un conocimiento básico de la arquitectura de Docker y de como trabaja.
- Instalaste Docker CE y Docker Compose
- Descargaste 2 imágenes docker de una registry, y las ejecutaste.
- Ejecutaste comandos dentro de un contenedor Alpine.
En los siguientes posts vamos a ver más en profundidad algunos conceptos sobre:
- Imágenes
- Contenedores
- Registry
Y un apartado llamado “Docker en la Vida Real” con los siguientes temas:
- Data Volumes
- Networks
- Docker-Compose
- Docker-Swarm
Siempre manteniendo el formato para principiantes, ya que cursos avanzados hay de sobra.