{"id":14331,"date":"2019-09-13T18:00:03","date_gmt":"2019-09-13T16:00:03","guid":{"rendered":"https:\/\/www.atareao.es\/?post_type=tutorial&#038;p=14331"},"modified":"2021-10-02T19:20:04","modified_gmt":"2021-10-02T17:20:04","slug":"docker","status":"publish","type":"tutorial","link":"https:\/\/atareao.es\/tutorial\/docker\/","title":{"rendered":"Tutorial de Docker"},"content":{"rendered":"\n<p>El objeto de este primer cap\u00edtulo del tutorial de Docker, es por un lado explicarte que son los contenedores. Y por otro lado, y creo que mas importante, porque necesitas conocer, usar y sacar provecho a la tecnolog\u00eda de contenedores. Sin embargo, es necesario unas primeras pinceladas sobre los contenedores Linux antes de que yo sea capaz de explicarte porque esa tecnolog\u00eda es imprescindible para ti, y que tarde o temprano te cambiar\u00e1 la forma en la que te relacionas con las aplicaciones.<\/p>\n\n\n\n<p>En alguna ocasi\u00f3n he escrito alg\u00fan art\u00edculo que toca de forma tangencial los contenedores, por ejemplo, en el tutorial de <a href=\"https:\/\/atareao.es\/tutorial\/scripts-en-bash\/\">scripts en Bash<\/a>. En el primer cap\u00edtulo del tutorial, te indico una soluci\u00f3n para comenzar a crear tus primeros scripts, sin miedo a <em>romper<\/em> el sistema.<\/p>\n\n\n\n<p>Igualmente, en el episodio 37 del podcast, tambi\u00e9n te coment\u00e9 como pod\u00edas empezar a relacionarte con <a href=\"https:\/\/atareao.es\/podcast\/empezando-con-el-terminal-sin-miedos\/\">el terminal sin miedos<\/a> utilizando precisamente la tecnolog\u00eda de contenedores, en particular <strong>Docker<\/strong>.<\/p>\n\n\n\n<p>Sin embargo, hasta el momento, no le hab\u00eda dedicado ni el tiempo ni la atenci\u00f3n que esta tecnolog\u00eda se merece. Pero, con este tutorial, estoy dispuesto a cambiarlo de forma radical, y poner <strong>Docker<\/strong> en el lugar que se merece dentro de <strong>atareao.es<\/strong>.<\/p>\n\n\n\n<p>Es evidente, que esta tecnolog\u00eda es <strong>fundamental<\/strong> para administradores de sistemas y desarrolladores. Pero, si no perteneces a estos grupos, incluso si utilizas Linux por afici\u00f3n, realmente <strong>merece la pena<\/strong> que aprendas esta tecnolog\u00eda. Solo tienes que ver la cantidad de contenedores disponibles para utilizar en la Raspberry, y sobre todo lo que <strong>facilita<\/strong> instalar aplicaciones para sacar provecho a este peque\u00f1o dispositivo.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a class=\"highslide\" href=\"https:\/\/atareao.es\/wp-content\/uploads\/2019\/09\/contenedores.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/atareao.es\/wp-content\/uploads\/2019\/09\/contenedores-1024x683.jpg\" alt=\"Contenedores y Docker\" class=\"wp-image-14332\" srcset=\"https:\/\/atareao.es\/wp-content\/uploads\/2019\/09\/contenedores-1024x683.jpg 1024w, https:\/\/atareao.es\/wp-content\/uploads\/2019\/09\/contenedores-300x200.jpg 300w, https:\/\/atareao.es\/wp-content\/uploads\/2019\/09\/contenedores-768x512.jpg 768w, https:\/\/atareao.es\/wp-content\/uploads\/2019\/09\/contenedores.jpg 1200w\" sizes=\"auto, (max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw\" \/><\/a><\/figure>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\" id=\"docker\">Docker<\/h2>\n\n\n\n<p>Como te he comentado en la introducci\u00f3n, antes de comentarte las ventajas de trabajar con contenedores, y porque esta es una soluci\u00f3n que debes implantar en tu d\u00eda a d\u00eda, es mejor que te explique que es esto de los contenedores.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"conceptos-b\u00e1sicos\">Conceptos b\u00e1sicos<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"im\u00e1genes\">Im\u00e1genes<\/h4>\n\n\n\n<p>Una <strong>imagen<\/strong> es un <em>paquete<\/em>, en el que se encuentra una aplicaci\u00f3n o servicio y <strong>todo lo necesario<\/strong> (c\u00f3digo, ejecutables, librer\u00edas, configuraci\u00f3n, etc) para que esta aplicaci\u00f3n pueda funcionar.<\/p>\n\n\n\n<p>Pero, \u00bfporque te hablo de <strong>im\u00e1genes<\/strong> si hasta el momento solo te ha hablado de <strong>contenedores<\/strong>?<strong>\u00bfque tiene que ver las im\u00e1genes con los contenedores?<\/strong>. Un contenedor no es mas que una imagen en funcionamiento.<\/p>\n\n\n\n<p>Es el mismo concepto de un ejecutable. La <strong>imagen es el ejecutable<\/strong>, y el <strong>contenedor<\/strong> es cada una de las <strong>instancias<\/strong> o procesos que hay en funcionamiento. Si has lanzado el ejecutable tres veces, por ejemplo, tendr\u00e1s tres instancias del ejecutable. Lo mismo, para contenedores, puedes tener tres contenedores corriendo de la misma imagen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"contenedores\">Contenedores<\/h4>\n\n\n\n<p>Como te explicaba en el punto anterior, <strong>el contenedor no es mas que una instancia de esa imagen que tiene todo lo necesario para nuestra aplicaci\u00f3n<\/strong>. Pero, el contenedor tiene una caracter\u00edstica realmente interesante. El contenedor <strong>utiliza y comparte<\/strong> el sistema operativo de la m\u00e1quina en la que se est\u00e1 ejecutando, con otras aplicaciones y por supuesto, con otros contenedores.<\/p>\n\n\n\n<p>Esto es precisamente lo que lo diferencia de una m\u00e1quina virtual. Las m\u00e1quinas virtuales levantan un sistema operativo completo, mientras que los contenedores tienen lo m\u00ednimo imprescindible para el funcionamiento de la aplicaci\u00f3n o servicio.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"im\u00e1genes-y-contenedores\">Im\u00e1genes y contenedores<\/h4>\n\n\n\n<p>Por intentar aclarar mas la diferencia entre <em>imagen<\/em> y <em>contenedor<\/em>, quiero ponerte un paralelismo. El archivo ejecutable de una aplicaci\u00f3n cualquiera que tengas instalada en tu equipo se corresponde con la imagen, como te he comentado anteriormente. Por otro lado, <strong>hay aplicaciones que permiten tener en funcionamiento <\/strong><em><strong>varias instancias<\/strong><\/em><strong>.<\/strong> Cada una de estas instancias se corresponde con un contenedor.<\/p>\n\n\n\n<p>La diferencia, en este paralelismo, radica en que mientras que cuando terminas la ejecuci\u00f3n de una instancia de la aplicaci\u00f3n esta desaparece, <strong>al detener un contenedor este queda en tu equipo<\/strong> \u00bfporque? La raz\u00f3n para que el contenedor quede en tu equipo, es porque, por un lado puedes iniciar el contenedor de nuevo, y en segundo lugar, porque es posible que en el interior de ese contenedor tengas archivos que te sean de utilidad. Si al terminar la ejecuci\u00f3n del contenedor, se borrara de forma autom\u00e1tica, seguro que en mas de una ocasi\u00f3n, te llevar\u00edas un disgusto.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"docker-1\">Docker<\/h4>\n\n\n\n<p>En esto de los contenedores, adem\u00e1s de Docker, tienes otras alternativas como LXC (LinuX Containers), de la cual deriva <strong>Docker<\/strong> o LXD, por ejemplo. \u00bfPorque Docker? Docker es mas como un gestor de paquetes tipo <em>Snap<\/em>, <em>Flatpack<\/em> o <em>AppImage<\/em>, mientras que LXC es mas como una m\u00e1quina virtual mas ligera, en el sentido de que comparte el sistema operativo con la m\u00e1quina en la que corre. Esto es a grandes rasgos.<\/p>\n\n\n\n<p>La raz\u00f3n de este tutorial sobre Docker, es precisamente la <strong>facilidad<\/strong> que te aporta esta tecnolog\u00eda para <strong>poner en funcionamiento una aplicaci\u00f3n en una m\u00e1quina, asegur\u00e1ndote de que va a funcionar<\/strong>. Y va a funcionar porque todas las dependencias que necesita esa aplicaci\u00f3n van incluidas en el contenedor. Esto te permite <strong>llevar<\/strong> una aplicaci\u00f3n de una m\u00e1quina a otra con garant\u00edas.<\/p>\n\n\n\n<p>Algunas de las razones para adoptar <strong>Docker<\/strong> son las siguientes,<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Flexible<\/strong>, cualquier aplicaci\u00f3n hasta las mas complejas se pueden poner en contenedores.<\/li><li><strong>Ligero<\/strong>. Los contenedores <strong>Docker<\/strong> frente a otras soluciones son ligeros, en tanto en cuanto, comparte el n\u00facleo de la m\u00e1quina en la que est\u00e1n funcionando.<\/li><li><strong>Intercambiable<\/strong>. Es posible desplegar actualizaciones al vuelo.<\/li><li><strong>Portable<\/strong>. Puedes construir una imagen localmente y ejecutarla en cualquier lugar.<\/li><li><strong>Escalable<\/strong>. Es posible poner en funcionamiento tantas r\u00e9plicas como necesites.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"instalando\">Instalando<\/h3>\n\n\n\n<p>Existen dos versiones de <strong>Docker<\/strong>. En particular me centrar\u00e9 en la versi\u00f3n <em>Community<\/em>, Dentro de esta versi\u00f3n puedes encontrar tres canales de actualizaci\u00f3n, como en casi cualquier aplicaci\u00f3n que se precie,<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Stable<\/strong>. Proporciona las \u00faltimas versiones.<\/li><li><strong>Test<\/strong>. Versiones listas para probar.<\/li><li><strong>Nightly<\/strong>. En este canal encontrar\u00e1s las actualizaciones correspondientes a la siguiente versi\u00f3n.<\/li><\/ul>\n\n\n\n<p>Salvo casos excepcionales, lo l\u00f3gico es que utilices el canal <strong>Stable<\/strong>.<\/p>\n\n\n\n<p>Respecto a las plataformas soportadas. Para servidor, lo puedes encontrar en <strong>Ubuntu<\/strong> en cualquier arquitectura x86_64 (or amd64), armhf, arm64, s390x (IBM Z), y ppc64le. En el momento de escribir este primer cap\u00edtulo del tutorial estaba disponible para las versiones siguientes,<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Disco 19.04<\/li><li>Cosmic 18.10<\/li><li>Bionic 18.04 (LTS)<\/li><li>Xenial 16.04 (LTS)<\/li><\/ul>\n\n\n\n<p>Aunque <strong>Docker est\u00e1 disponible en los repositorios de Ubuntu,<\/strong> lo mas recomendable es que te instales el <strong>repositorio de Docker<\/strong>, de forma que <strong>siempre tendr\u00e1s la \u00faltima versi\u00f3n estable actualizada<\/strong>. Pero, lo mejor es que no te tienes que preocupar de nada, porque los chicos de Docker, ya se han preocupado de hacer un script que te lo pone muy f\u00e1cil. Simplemente ejecuta las siguientes l\u00edneas en un terminal<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ curl -fsSL https:\/\/get.docker.com -o get-docker.sh\n$ sudo sh get-docker.sh<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"post-instalaci\u00f3n\">Post instalaci\u00f3n<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"permisos\">Permisos<\/h4>\n\n\n\n<p>Una vez ya tienes instalado <strong>docker<\/strong> conviene realizar algunos pasos adicionales para tu propia comodidad. Lo primero es que para evitar tener que ejecutar <em>docker<\/em> con derechos de administrador, tienes que a\u00f1adir a tu usuario al grupo <em>docker<\/em>. Para ello, simplemente ejecuta la siguiente instrucci\u00f3n,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker $USER<\/code><\/pre>\n\n\n\n<p>Si no tienes muy claro esto de los grupos, te recomiendo el art\u00edculo sobre <a href=\"https:\/\/atareao.es\/como\/gestion-de-usuarios-y-grupos-en-linux\/\">gesti\u00f3n de usuarios y grupos en Linux<\/a> y el art\u00edculo sobre <a href=\"https:\/\/atareao.es\/tutorial\/terminal\/propietarios-y-permisos\/\">propietarios y permisos<\/a> del tutorial sobre <a href=\"https:\/\/atareao.es\/tutorial\/terminal\/propietarios-y-permisos\/\">el terminal<\/a>.<\/p>\n\n\n\n<p>Una vez realizado esto, tienes dos opciones, o bien sales y vuelves a entrar en la sesi\u00f3n, o bien, ejecutas estas instrucciones,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MIGRUPO=$(id -gn)\nnewgrp docker\nnewgrp $MIGRUPO<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"comprobaciones\">Comprobaciones<\/h4>\n\n\n\n<p>Ahora, ya est\u00e1s en disposici\u00f3n de ver la versi\u00f3n de <strong>docker<\/strong> que has instalado. Para ello, ejecuta la siguiente instrucci\u00f3n,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker -v\nDocker version 18.09.5, build e8ff056<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"lanzando-el-primer-contenedor\">Lanzando tu primer contenedor<\/h4>\n\n\n\n<p>Ahora es necesario,<strong> iniciar tu primer contenedor y ver que todo funciona de manera correcta<\/strong>. No te preocupes ahora mismo por las instrucciones. Simplemente quieres saber si Docker est\u00e1 instalado correctamente. Ya ver\u00e1s con detalle las instrucciones y el funcionamiento de Docker. Para comprobar que todo funciona correctamente, vas a arrancar tu primer contenedor. Tan solo tienes que ejecutar la siguiente instrucci\u00f3n,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker run hello-world\nUnable to find image 'hello-world:latest' locally\nlatest: Pulling from library\/hello-world\n1b930d010525: Pull complete \nDigest: sha256:451ce787d12369c5df2a32c85e5a03d52cbcef6eb3586dd03075f3034f10adcd\nStatus: Downloaded newer image for hello-world:latest\n\nHello from Docker!<\/code><\/pre>\n\n\n\n<p>En pocas palabras, lo que hace esta instrucci\u00f3n es ejecutar un contenedor que te va a mostrar <code>Hello from Docker<\/code>. Lo primero que hace es comprobar si tienes la imagen <code>hello-world<\/code> localmente en tu equipo. Una vez comprobada que no la tienes, la descargar\u00e1 del repositorio de im\u00e1genes, y la ejecutar\u00e1.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"lanzando-un-contenedor-en-detalle\">Lanzando un contenedor en detalle<\/h5>\n\n\n\n<p>\u00bfQue es lo que sucede cuando ejecutas <code>docker run hello-world<\/code>?. En el apartado anterior te he resumido la operaci\u00f3n en cuatro palabras. Sin embargo, tal y como te describe el inicio de <code>hello-world<\/code>, <em>por detr\u00e1s<\/em>, se hacen algunas cosas mas.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>El cliente de docker conecta con el demonio que est\u00e1 corriendo en segundo plano.<\/li><li>El demonio, descarga la imagen <code>hello-world<\/code> de <code>Docker Hub<\/code>.<\/li><li>De nuevo, el demonio entra en acci\u00f3n y crea un nuevo contenedor de esa imagen reci\u00e9n descargada, y se se ejecuta el proceso, lo que genera la salida que has visto anteriormente.<\/li><li>Por \u00faltimo, el demonio redirige la salida al cliente de Docker que la env\u00eda al terminal.<\/li><\/ol>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"en-el-interior-de-un-contenedor\">En el interior de un contenedor<\/h4>\n\n\n\n<p>Si quieres, todav\u00eda puedes dar un paso mas. Puedes puedes <em>meterte en el interior de un contenedor<\/em>, y echar un vistazo. De esta manera puedes saber como es un contenedor por dentro. Ver\u00e1s que no hay nada extra\u00f1o, que todo es mas o menos igual.<\/p>\n\n\n\n<p>Para meterte en el interior de un contenedor ejecuta la siguiente instrucci\u00f3n,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -it ubuntu bash<\/code><\/pre>\n\n\n\n<p>No te preocupes, que en los siguientes cap\u00edtulos del tutorial ya ver\u00e1s que es todo esto.<\/p>\n\n\n\n<p>Ya me contar\u00e1s lo que encuentras dentro de ese contenedor\u2026<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Tutorial de Docker. Introducci\u00f3n. Sobre el porque tienes que aprender a utilizar Docker ya!\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/TJ0wsNxxhqQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>M\u00e1s informaci\u00f3n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/docs.docker.com\/get-started\/\">Docker<\/a><\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Imagen de <a href=\"https:\/\/pixabay.com\/es\/users\/Pexels-2286921\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1845350\">Pexels<\/a> en <a href=\"https:\/\/pixabay.com\/es\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1845350\">Pixabay<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El objeto de este primer cap\u00edtulo del tutorial de Docker, es por un lado explicarte que son los contenedores. Y por otro lado, y creo&#8230;<\/p>\n","protected":false},"author":3,"featured_media":14332,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"tutorial_category":[],"tutorial_tag":[],"difficulty":[],"class_list":["post-14331","tutorial","type-tutorial","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/tutorial\/14331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/tutorial"}],"about":[{"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/types\/tutorial"}],"author":[{"embeddable":true,"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/comments?post=14331"}],"version-history":[{"count":0,"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/tutorial\/14331\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/media\/14332"}],"wp:attachment":[{"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/media?parent=14331"}],"wp:term":[{"taxonomy":"tutorial_category","embeddable":true,"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/tutorial_category?post=14331"},{"taxonomy":"tutorial_tag","embeddable":true,"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/tutorial_tag?post=14331"},{"taxonomy":"difficulty","embeddable":true,"href":"https:\/\/atareao.es\/wp-json\/wp\/v2\/difficulty?post=14331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}