Contenedores Docker for dummies.

Iniciado por Cl0udswX, Mayo 26, 2016, 08:30:08 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 26, 2016, 08:30:08 PM Ultima modificación: Mayo 26, 2016, 11:49:51 PM por EPSILON
Introducción

Saludos queridos underc0ders, primero aclarar que lo "dummy" esta en el sentido cariñoso de la palabra, ya que yo no soy ningún experto en la materia, simplemente me ha tocado unos trainings en el área y que mejor forma de reforzar lo aprendiendo que enseñando. En esta ocacion quiero presentarles un post que considero necesario, ya que en muchos ambientes se suele hablar de contenedores, de Docker, se suelen usar conceptos como "desplegar aplicaciones" ó "entrega de aplicaciones en un entorno funcional" y muchas veces creo que no todo el mundo sabe y conoce del tema en realidad, asi que por eso decidi escribir sobre el tema en mi estilo sencillo y "funcional".

¿Que es un contenedor Linux?


Para definirlo de forma sencilla digamos que es un espacio donde se empaquetan las aplicaciones junto con todo lo que necesitan para funcionar de forma correcta, sin necesidad de instalar mas cosas (dependencias, librerias, plugins, etc..)

Supongamos que Juan Luis Guerra (pudo haber sido cualquier otro, pero como soy dominicano...) hace conciertos de ciudad en ciudad, y en cada ciudad los técnicos deben instalar las luces, el sonido y los instrumentos musicales, en algunos casos deben solicitar cosas extras para poder funcionar de forma correcta, esto es asi en la vida real, y la logística resulta un poco compleja.

Ahora supongamos que de alguna forma los técnicos logran empaquetar las luces, el sonido y los instrumentos musicales en un contenedor gigante, en el que solamente se debe pinchar un botón para que todo se despliegue sin mas complicaciones, no seria esto mas sencillo?

Pues básicamente esto es lo que hace un contenedor, virtualizar una aplicación a nivel del sistema operativo.

Ventajas de los contenedores:

Potabilidad
Es posible desplegar la misma aplicación en diferentes entornos de sistemas Linux de forma rápida y precisa

Viajar ligero.
Por razones que explicare mas adelante, se daran cuenta que un contenedor es mucho mas ligero que una VM, tanto en el aspecto del procesamiento, como del almacenamiento.

Autosuficiencia.
Podemos desplegar aplicaciones libres del tedio de tener que instalar cualquier dependencia, librería ó plugin necesario para el buen funcionamiento de la misma.

Supongamos que elijo 10 sistemas al azar entre todos los underc0ders, para instalar linset. Me descargo el tarball, descomprimo, compilo, doy permisos y ejecuto... Lo mas seguro es que consiga algo como esto:


Y en cada sistema me faltarían distintas cosas, quizás podría crearme un script para que después de analizar las herramientas faltantes las instale por si mismo, pero hay cosas que no serán iguales de un sistema a otro (repositorios, manejador de paquetes, conexiones, etc...) con lo cual no creo que llegue a instalar linset en mas de 4 equipos.

Ahora imaginen que previamente empaqueto linset con todas las herramientas que necesita para funcionar en un contenedor, y que posterior a eso me voy a cada equipo con el contenedor, desplegando asi de forma sencilla y eficaz esta aplicación. Seria mas sencillo no?

¿Que es Docker?


Vamos a wikipedia:

Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software.

Con lo cual podriamos deducir que docker es el software con el que se gestionan los contenedores, es el motor que actua entre las aplicaciones y el sistema operativo.

Las principales partes de Docker son:

1.- El demonio Docker: Usado para manejar los contenedores en el sistema host.
2.- La CLI (Command Line Interface) de Docker: Aqui es donde nos comunicamos con los demonios Docker que manejan los contenedores
3.- Indice de imagenes Docker: Es un repositorio publico ó privado para imagenes docker


Los principales componentes de Docker son:

1.- Contenedores Docker:

Realmente esto no es mas que un directorio donde se empaqueta todo lo necesario para desplegar una aplicación en cualquier otro sistema que sea necesario. El único requerimiento necesario para desplegar un contenedores es tener instalado en el sistema anfitrion el software que gestiona dichos contenedores, en este caso Docker.

La magica oculta detras de esta increible tecnologia se consigue gracias a los LXC (Linux Containers).


Según wikipedia:

LXC (Linux Containers) es una tecnología de virtualización en el nivel de sistema operativo (SO) para Linux.


Dicho de otra forma podríamos decir que es un conjunto de características que aprovechan directamente el kernel de un sistema operativo y eso le permite manejar aplicaciones asi como los recursos que consumen dentro de un único entorno virtualizado. (Trato de simplificarlo, creanme...)

Características de un contenedor:

Que permiten?

- Potabilidad
-Aislamiento de procesos
-Evitan modificaciones externas
-Administración directa en el consumo de los recursos

Que NO permiten?

-Interferir a otros procesos
-Infierno de dependencias (cuando un paquete de software depende una libreria ó de otro paquete que no funciona con la version que estamos instalando)
-No son vulnerables de ataques a nivel de aplicación.
-No pueden abusar en el consumo de los recursos del sistema.

2.- Los docker_images:

Esto es la base sobre la que se construye un contenedor, es un sistema de archivos sazonados con los parametros correctos para que una aplicacion pueda funcionar dentro de dicho contenedor, podriamos imaginarlo como un sistema base linux, construido de una forma en la que ya no es posible actualizarlo ni modificarlo.

3.- Y los Dockerfiles: Son scripts que automatizan el proceso de construir, mantener y manejar una Docker_image.


Ok filosoforaptor, tranquilo, a continuacion explicare en que se diferencian.

Diferencias entre un contenedor y una maquina virtual?

Digamos que tienen dos diferencias basicas muy marcadas:

1.- Los contenedores ocupan menos espacio en disco.
2.- Funcionan mas rapido que una maquina virtual.

La razon?

Vamos a mirar con detenimiento esta imagen:


Como podemos ver en la imagen, el funcionamiento de la app1, app2 y app3 se apoya en sus propios binarios y librerias, lo que a su vez necesita correr sobre algun sistema operativo, de esa forma cuando virtualizamos un sistema operativo es necesario que algo haga de "falsificador" y le haga creer al sistema operativo que esta corriendo sobre un hardware real, y es ahi cuando necesitamos el hypervisor para que cumpla con su funcion. Asi tenemos una app y sus binarios+librerias corriendo sobre un SO, que a su vez corre sobre el hypervisor.

Todo lo anterior se traduce en mas recursos consumidos (almacenamiento y procesamiento) con lo cual para desplegar una aplicacion deberiamos migrar todo el sistema operativo.

En la otra esquina esta el esquema de los contenedores, y como podemos ver se elimina la necesidad de tener un SO funcionando sobre un hypervisor, mas bien tenemos que las aplicaciones se basan en sus binarios y librerias y estas sobre el motor de Docker, y ya..!!!

So Simple..!!


¿Como instalar Docker?

Hare la instalacion tomando como distro de referencia a Debian, ya que es la que tengo en mi portatil.

Primero agregamos la llave para el repositorio:

Código: php
sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


Luego  abrimos el /etc/apt/sources.list.d/docker.list con nuestro editor favorito, en mi caso "nano" (de no existir el archivo entonces sera creado)

Código: php
sudo nano /etc/apt/sources.list.d/docker.list


Y dentro del fichero agregar las lineas de acuerdo a la version que corresponda:

Debian Wheezy
deb No tienes permitido ver los links. Registrarse o Entrar a mi cuenta debian-wheezy main

Debian Jessie
deb No tienes permitido ver los links. Registrarse o Entrar a mi cuenta debian-jessie main

Debian Stretch/Sid
deb No tienes permitido ver los links. Registrarse o Entrar a mi cuenta debian-stretch main


Ahora damos un update a la lista de paquetes:

Código: php
sudo apt-get update


Cabe aclarar que para poder usar los repositorios de Docker es necesario que APT trabaje con https y certificados CA, de conseguir algun error al hacer un update seria necesario instalar:

Código: php
apt-get install apt-transport-https ca-certificates

Si todo va bien ya solo tendriamos que hacer un:

[code]sudo apt-get install docker-engine

Y conseguiriamos una pantalla como esta:

[center][img width=481 height=400]http://fotos.subefotos.com/1370bf73703de455693d26105d1df3e2o.png[/img]

Bueno seria una pantalla parecida, ya que dudo que alguno de ustedes tenga a Rust Cohle (True detective) como fondo en su terminal  ;D

Y al aceptar iniciaría todo el proceso de instalación de la tecnología docker, luego de instalado iniciamos el demonio:

[code]sudo service docker start


Verificamos la instalacion con un amistoso:

Código: php
sudo docker run hello-world


y conseguiriamos algo asi:



Y con eso mi trabajo estaria listo por ahora, quizas mas adelante les preparare algo mas ambicioso, pero vayan masticando algo y practicando por su cuenta un poco.

Les dejo algunos enlaces de interés referentes a los contenedores.

Documentos Docker
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Entrenamiento oficial
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
El talento se parece al tirador que da en un blanco que los demás no pueden alcanzar; el genio se parece al tirador que da en un blanco que los demás no pueden ver.


Mayo 29, 2016, 09:49:46 PM #1 Ultima modificación: Mayo 29, 2016, 09:53:50 PM por Gabriela
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta Gracias   :) por este el aporte personal!

La verdad que tu post lleva algunos días, pero no fue sino hasta hoy domingo que pude detenerme a leerlo con tranquilidad, por eso mi comentario tardío.

Sobre el tema en sí, tenía alguna escasa información que vi en algún portal de noticias, pero no este despliegue didáctico-formativo que nos has dejado (tal como nos tienes acostumbrad@s).

Por otra parte, me gustaría preguntarte algo: suelo utilizar las máquinas virtuales -como entorno controlado- para practicar, mirar, examinar, jugar, con el apasionante mundo del malware, siguiendo incluso alguna guía de análisis para aprender.

Ahora, ¿los contenedores, podrían operar como ambiente controlado para analizar malware?
Ahí queda, para cuando puedas...

Nuevamente gracias,  por compartir tu experiencia de enseñanza/aprendizaje con esa frescura y ese buen hacer  :) que tienes para redactar/comunicar ideas  y conocimientos. 

:-* :-* :-*

Gabriela

PD: Por cierto, este post se va al blog !!!
Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

Bro, si tuviese un sombrero, me lo sacaría. Admiro mucho la facilidad que tienes para explicar tan claras las cosas.
Este era un tema del cual no tenia conocimiento y gracias a tu paper me ha quedado claro.

Mil gracias por el aporte! A ver cuando se viene el siguiente!!!

Saludos!
ANTRAX


@Gabriela saludos brujita del alma, mmmm  la verdad es que los contenedores al no funcionar sobre un sistema operativo  como tal son muy fuertes contra el malware, sumando a ello que tiene políticas muy estrictas en cuanto a que no permite modificaciones después de desplegado el contendemos con lo cual es un poco incómodo, pero veré si se puede desplegar REMnux con todas sus herramientas u desde ahí ir tirando.

Me podré a ello por ti...

@ANTRAX  ya viene el segundo por ahí, así que cuenta con ello bro...

Un abrazo a todos familia...!!!


Enviado desde mi iPhone utilizando Tapatalk
El talento se parece al tirador que da en un blanco que los demás no pueden alcanzar; el genio se parece al tirador que da en un blanco que los demás no pueden ver.


@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que bueno! en cuanto termine mis cosas de clase probare a trastear con esto!

Entonces por ejemplo los software "portables" que hay se puede clasificar como pequeños dockers? igual es una duda un poco tonta jajajaja

Saludos.

CitarEntonces por ejemplo los software "portables" que hay se puede clasificar como pequeños dockers? igual es una duda un poco tonta jajajaja

Umm podria decirse que funcionan de una forma un poco parecida, pero con muchas menos caracteristicas.
El talento se parece al tirador que da en un blanco que los demás no pueden alcanzar; el genio se parece al tirador que da en un blanco que los demás no pueden ver.