{"id":133,"date":"2018-04-03T19:51:44","date_gmt":"2018-04-04T00:51:44","guid":{"rendered":"http:\/\/blogs.gentoo.org\/chrisadr\/?p=133"},"modified":"2019-11-01T03:35:27","modified_gmt":"2019-11-01T08:35:27","slug":"docker-y-la-magia-de-los-containers","status":"publish","type":"post","link":"https:\/\/blogs.gentoo.org\/chrisadr\/2018\/04\/03\/docker-y-la-magia-de-los-containers\/","title":{"rendered":"Docker y la magia de los containers"},"content":{"rendered":"<p>Hola con todos :) mucho tiempo desde mi \u00falitmo post, debo admitir, pero tras poder solucionar unas cuantas situaciones personales y externas, al fin estoy en condiciones de poder escribir nuevamente. Y el primer tema que quiero compartir con ustedes es esta tecnolog\u00eda, que aunque ya bastante tiempo lleva en entornos de producci\u00f3n a nivel mundial, es algo que he descubierto \u00faltimamente.<\/p>\n<h3>\u00bfQu\u00e9 es Docker?<\/h3>\n<p>Para ponerlo de forma sencilla, Docker es la siguiente generaci\u00f3n de virtualizaci\u00f3n. Esto quiere decir que en su uso, aplicamos las bases de lo que podr\u00eda considerarse una virtualizaci\u00f3n ultra ligera. Y esta ligereza radica en su implementaci\u00f3n a nivel de kernel.<\/p>\n<h3>Docker y el kernel<\/h3>\n<p>Antiguamente la virtualizaci\u00f3n se realizaba a nivel de hardware, esto quiere decir que ten\u00edamos sistemas operativos corriendo un kernel especialmente dise\u00f1ado para generar distintas instancias de m\u00e1quinas virtuales directamente conectadas con el hardware. Estas soluciones son bastante eficientes y seguras, y permiten una conexi\u00f3n directa cuando hablamos en t\u00e9rminos f\u00edsicos. Con el tiempo se pas\u00f3 a un modelo de virtualizaci\u00f3n a nivel de software, donde ten\u00edamos un equipo denominado\u00a0<em>host<\/em> en el cual se generaba un proceso que produc\u00eda instancias de m\u00e1quinas virtuales de tipo\u00a0<em>guest<\/em>.<\/p>\n<p>Este es un modelo muy utilizado en equipos personales, al menos yo lo he utilizado durante mucho tiempo y siempre hab\u00eda tenido un tipo de m\u00e1quina virtual para poder realizar cada trabajo de programaci\u00f3n.<\/p>\n<p>Con el paso del tiempo el kernel fue desarrollando nuevas tecnolog\u00edas que aceleraron el proceso de virtualizaci\u00f3n, pero tambi\u00e9n tecnolog\u00edas alternas que abrieron nuevas puertas.<\/p>\n<h4>El overheat<\/h4>\n<p>Crear m\u00e1quinas virtuales no es un proceso sencillo a nivel de recursos, puesto que en las abstracciones necesarias, los equipos tanto\u00a0<em>host<\/em> como\u00a0<em>guest<\/em> generan todo un \u00e1rbol de procesos, muchos de los cuales son completamente innecesarios en distintos escenarios, y es este el motivo por el cual en un sistema no siempre puedas tener una gran cantidad de m\u00e1quinas virtuales, por darles un ejemplo&#8230; en mi laptop yo he llegado a ejecutar 4 m\u00e1quinas virtuales\u00a0<em>guest<\/em> en paralelo, pero mi procesador i7 no daba para m\u00e1s, puesto que en todas el trabajo era bastante lento.<\/p>\n<p>Cuando habl\u00e1bamos de estas nuevas tecnolog\u00edas, existieron dos que abrieron paso a la era de los containers:\u00a0<em>cgroups (control groups)<\/em> y\u00a0<em>namespaces<\/em>.<\/p>\n<h4>Control groups, namespaces y containers<\/h4>\n<p>Los cgroups son una caracter\u00edstica del kernel que permite controlar la cantidad de recursos que un proceso ocupa, esto quiere decir que puedo indicar si un proceso tiene un tope de RAM, o de capacidad de entrada y salida, entre otras cosas.<\/p>\n<p>Los namespaces proporcionan contextos de ejecuci\u00f3n tanto para usuario como para grupos, en palabras sencillas quiere decir que distintos grupos de procesos pueden contar con un tipo espec\u00edfico de\u00a0<strong>privilegios<\/strong> que no necesariamente aplican para el resto del sistema.<\/p>\n<p>Los containers aplican estas dos tecnolog\u00edas de la siguiente manera: antes, la virtualizaci\u00f3n generaba un kernel base, y sobre este se colocaban capas de kernels abstractos o puentes entre\u00a0<em>host\u00a0<\/em>y\u00a0<em>guest<\/em>. Ahora el mismo kernel puede manejar todos los procesos, asignando un espacio y una capacidad m\u00ednima o m\u00e1xima. Esto permite que en lugar de la gran cantidad de proceso que una m\u00e1quina virtual ejecuta, solo se generen 2 o 3 servicios en un espacio aislado.<\/p>\n<h3>Im\u00e1genes y containers<\/h3>\n<p>Las im\u00e1genes de Docker son estructuras superpuestas de filesystems que permiten trabajar en la parte superior. Existen imagenes &#8220;<em>base<\/em>&#8221; sobre las cuales se van agregando configuraciones y archivos para generar entornos funcionales. Una vez que un entorno funcional se ejecuta, docker genera un\u00a0<strong>container<\/strong> con el proceso que deseemos correr.\u00a0 Esto nos brinda un ambiente aislado donde solo se ejecutan uno o unos cuantos procesos. Esto nos brinda la posibilidad de lanzar cientos o incluso miles de containers dentro del mismo\u00a0<em>host<\/em>. Pero como s\u00e9 que mejor es mostrar que explicar, vamos a ver un ejemplo bastante sencillo :)<\/p>\n<h3>Docker y Jenkins<\/h3>\n<p>Una vez tengamos el demonio de docker corriendo, vamos a utilizar una de sus principales caracter\u00edsticas, buscar im\u00e1genes :) Docker nos brinda un servicio parecido al de Github, en donde podemos descargar im\u00e1genes ya dise\u00f1adas por otros, en mi caso voy a buscar Jenkins, y como podr\u00e1n ver, tengo varios resultados. Cuando un nombre no tiene una separaci\u00f3n con \/ se le considera una im\u00e1gen base. Por lo que vamos a descargar la imagen de jenkins con<\/p>\n<p><code>docker pull jenkins<\/code><\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-136\" src=\"http:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-37-20-300x166.png\" alt=\"\" width=\"300\" height=\"166\" srcset=\"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-37-20-300x166.png 300w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-37-20.png 678w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Una vez descargado vamos a ejecutar el siguiente comando:<\/p>\n<p><code>docker run -P --name myjenkins jenkins<\/code><\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-137\" src=\"http:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-41-01-300x184.png\" alt=\"\" width=\"300\" height=\"184\" srcset=\"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-41-01-300x184.png 300w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-41-01.png 535w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Esto generar\u00e1 una lista de logs que son el proceso de jenkins que se est\u00e1 ejecutando :) ya tenemos un jenkins funcionando, pero necesitamos conocer el puerto en donde est\u00e1 trabajando, para eso utilizamos el siguiente comando:<\/p>\n<p><code>docker port myjenkins<\/code><\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-138\" src=\"http:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-42-30-300x169.png\" alt=\"\" width=\"300\" height=\"169\" srcset=\"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-42-30-300x169.png 300w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-42-30.png 373w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Como pueden ver, tenemos dos puertos activos, y el conocido 8080 nos redirige a 327669, vamos a abrir ese puerto en nuestro navegador :)<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-139\" src=\"http:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-44-08-300x228.png\" alt=\"\" width=\"300\" height=\"228\" srcset=\"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-44-08-300x228.png 300w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-44-08-768x583.png 768w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-44-08.png 974w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u00a1Ya casi tenemos todo listo! Ahora nos habla sobre una clave generada, pues sencillo :) en nuestra terminal de logs debe aparecer una clave que podamos usar:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-140\" src=\"http:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-45-28-300x175.png\" alt=\"\" width=\"300\" height=\"175\" srcset=\"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-45-28-300x175.png 300w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-45-28.png 619w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Y eso es todo, ahora tenemos jenkins trabajando en nuestro sistema, pero en su propio\u00a0<strong>container<\/strong>.<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-141\" src=\"http:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-46-38-300x242.png\" alt=\"\" width=\"300\" height=\"242\" srcset=\"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-46-38-300x242.png 300w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-46-38-768x619.png 768w, https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/Captura-de-pantalla-de-2018-04-03-19-46-38.png 838w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Lo genial de todo esto es que \u00a1tan solo han sido 3 comandos! Y 3 bastante sencillos vale la pena mencionar. Ahora bien, este es solo el principio, pero qu\u00e9 tal si les digera que Docker puede generar redes internas, ambientes de prueba, funcionar como cluster, y muchas otras cosas m\u00e1s&#8230; pues ahora entienden por qu\u00e9 ten\u00eda ganas de compartir este tema con ustedes :)<\/p>\n<p>Pero son muchos los puntos y un post no alcanza para poder contarlo todo, as\u00ed que tal vez con un poco de tiempo podramos seguir este tema si lo han encontrado interesante :) Un saludo y gracias por su visita. Ahh y lo olvidaba, para detener el container y volverlo a encender en otro momento pueden usar:<\/p>\n<p><code>docker stop\/start\/restart myjenkins<\/code><\/p>\n<p>Sencillo ;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hola con todos :) mucho tiempo desde mi \u00falitmo post, debo admitir, pero tras poder solucionar unas cuantas situaciones personales y externas, al fin estoy en condiciones de poder escribir nuevamente. Y el primer tema que quiero compartir con ustedes es esta tecnolog\u00eda, que aunque ya bastante tiempo lleva en entornos de producci\u00f3n a nivel &hellip; <a href=\"https:\/\/blogs.gentoo.org\/chrisadr\/2018\/04\/03\/docker-y-la-magia-de-los-containers\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Docker y la magia de los containers<\/span><\/a><\/p>\n","protected":false},"author":169,"featured_media":142,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[29,30,28],"jetpack_featured_media_url":"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/04\/dockericon.png","_links":{"self":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/133"}],"collection":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/comments?post=133"}],"version-history":[{"count":1,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/133\/revisions"}],"predecessor-version":[{"id":143,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/133\/revisions\/143"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media\/142"}],"wp:attachment":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media?parent=133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/categories?post=133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/tags?post=133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}