{"id":1043,"date":"2014-06-11T13:21:28","date_gmt":"2014-06-11T19:21:28","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1043"},"modified":"2014-06-11T16:12:32","modified_gmt":"2014-06-11T22:12:32","slug":"docker-aislamiento-de-aplicaciones","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1043","title":{"rendered":"Docker \u2013 Aislamiento de aplicaciones"},"content":{"rendered":"<p>Docker es un programa muy similar a chroot en cuanto a su funci\u00f3n pero mucho m\u00e1s complicado en su ejecuci\u00f3n.  Docker permite aislar programas en entornos emulados, puede emular un Ubuntu, centos, y pr\u00e1cticamente cualquier distro de GNU\/Linux y posiblemente otros.<\/p>\n<p>Docker puede crear ambientes cerrados para ejecutar aplicaciones aisladas del resto del sistema e incluso servicios, a estos entornos aislados les llama contenedores, los contenedores nacen de las im\u00e1genes de las distros en docker.<\/p>\n<p>Con un contenedor es posible crear una imagen y mover la imagen a otros servidores que soporten docker, esto es muy \u00fatil si se quiere desarrollar una aplicaci\u00f3n y no se quiere pagar por todo un servidor, solo rentas el proceso que docker va a ejecutar, este servicio es com\u00fan en algunos datacenter como la nube de Microsoft <\/p>\n<p>A continuaci\u00f3n lo m\u00e1s b\u00e1sico de docker, con esto podr\u00e1s ya hacer cosas interesantes con el pero no es todo, tendr\u00e1s que documentarte el sitio de docker por todas las dem\u00e1s opciones que no mencione<\/p>\n<p><strong>Usando Docker<\/strong> y <strong>Obteniendo im\u00e1genes<\/strong><\/p>\n<p>Cuando reci\u00e9n lo instalas no tienes ninguna imagen de ninguna distro puedes ejecutar<\/p>\n<p>docker pull centos<br \/>\ndocker pull ubuntu <\/p>\n<p>Para descargar im\u00e1genes de ubuntu o centos, hay muchas mas pero esas 2 distros de Linux son las m\u00e1s usadas, tambi\u00e9n podr\u00edas obtener debianes y mucho mas<\/p>\n<p><strong>Listando las im\u00e1genes instaladas<\/strong><\/p>\n<p>docker images<\/p>\n<p>obtendr\u00e1s algo como esto:<br \/>\nREPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE<br \/>\ncentos              centos6             0c752394b855        44 hours ago        124.1 MB<br \/>\ncentos              latest                 0c752394b855        44 hours ago        124.1 MB<br \/>\nubuntu              12.10               e314931015bd        6 days ago          172.1 MB<\/p>\n<p>El TAG es una modificaci\u00f3n a la imagen y tambi\u00e9n ser usado como un aviso de versi\u00f3n, por ejemplo la \u00faltima l\u00ednea indica que es un Ubuntu y su tag que es 12.10 aunque esto es meramente informativo ah\u00ed podr\u00eda decir, soytupapa o cualquier otra cosa<\/p>\n<p><strong>Usando contenedores<\/strong><\/p>\n<p>Una vez que tienes una imagen puedes ejecutar un proceso en el contenedor<br \/>\ndocker run repositorio:tag commando<\/p>\n<p>para ejecutar un ls \u2013l dentro de un contenedor basado en el entorno de centos version 6 de acuerdo a nuestro listado de imagenes<\/p>\n<p>docker run centos:6 ls  -l<\/p>\n<p>y obtendr\u00edas un listado del directorio del contenedor<\/p>\n<p><strong>Vida y muerte de un contenedor<\/strong><\/p>\n<p>Solo puedes ejecutar un solo comando que por lo tanto ser\u00e1 un solo proceso dentro del contenedor , el contenedor estar\u00e1 vivo mientras el proceso este vivo, cuando el proceso termine el contenedor morir\u00e1 con el si vuelves a ejecutar docker run centos:6 ls \u2013l volver\u00edas a ver otra vez el directorio pero de otro contenedor, cada que ejecutas un docker run se ejecuta el proceso creando un contenedor nuevo, sin embargo el contenedor no se borra, tiene identificadores \u00fanicos puedes verlo con el comando docker ps \u2013a<\/p>\n<p>docker ps -a<\/p>\n<p>obtendr\u00e1s algo como esto<\/p>\n<p>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES<br \/>\nd6a441fdca59        centos:6.          ls -l               10 minutes ago      Exited (0) 10 minutes ago<\/p>\n<p>el ID del conectedor es d6a441fdca59 aunque el proceso ya termino, el contenedor se queda con el resultado final de la ejecusion, puedes volver a revivirlo reejecutando el contenedor con <\/p>\n<p>docker start o docker restart<\/p>\n<p>docker start d6a441fdca59   <\/p>\n<p>sin embargo lo \u00fanico que har\u00e1 ser\u00e1 volver a ejecutar el ls \u2013l y volver\u00e1 a quedar inerte, puedes borrar el contenedor con docker rm d6a441fdca59 <\/p>\n<p>Si requieres hacer algo mas complicado que solo ejecutar un proceso tienes que pensar en como hacerlo, sabes que solo puedes ejecutar un solo proceso y solo uno, entonces bien podr\u00edas ejecutar un Shell asignarle una terminal y ver sus input\/output<\/p>\n<p>docker run \u2013t \u2013i centos:6 bash<\/p>\n<p>Esto permite mantenerse dentro del contenedor indefinidamente, en un sistema GNU\/Linux tradicional el proceso 1 es siempre INIT y todos son hijos de init, su muere init se muere todo el sistema por que todos son hijos de init, aqu\u00ed bash es el proceso 1 por lo tanto y como es un Shell puedes lanzar mas procesos, instalar cosas, compilar cosas y ejecutar cosas, pero cuando salgas del Shell , cuando des exit mataras a bash y con el todo los dem\u00e1s procesos que hab\u00edas lanzado. Como el contenedor no se destruye puedes revivirlo con docker start pero cuando salgas volver\u00e1 a quedar inerte.<\/p>\n<p>Es posible dejar un proceso trabajando en un contenedor indefinidamente por ejemplo dar un ping a 4.2.2.2 usando docker run \u2013d<\/p>\n<p>docker run \u2013d centos:6 ping 4.2.2.2<\/p>\n<p>Mientras el proceso ping siga dando ping estar\u00e1 vivo.<\/p>\n<p><strong>Creando im\u00e1genes a partir de contenedores<\/strong><\/p>\n<p>Como se lee m\u00e1s arriba un contenedor es generado de una imagen, si ejecuta un comando bash y modifica cosas dentro del contenedor y luego sale y de nuevo ejecuta otra vez un bash se creara un contenedor diferente \u201cresteado\u201d a veces se quiere mantener el cambio permanentemente y lo \u00fanico permanente en docker es la imagen de la que se crean los contenedores, por lo tanto para un cambio permanente habr\u00e1 que crear una imagen desde el contenedor<\/p>\n<p>docker commit d6a441fdca59 centos:lastdragon<\/p>\n<p>Con el commit hago que mi contenedor d6a441fdca59 se convierta a una imagen llamada centos con el tag lastdragon<\/p>\n<p>docker images<br \/>\nREPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE<br \/>\ncentos              lastdragon          5844ba97973e        About a minute ago   300.6 MB<\/p>\n<p>Docker puede comportarse similar a un hipervisor y parecer virtualizacion, sin embargo no es virtualizacion real, yo lo dejar\u00eda en la categor\u00eda de emulador. Seguramente hay o habr\u00e1 sitios en internet que te permitan mandar tu imagen personalizada para ejecutar un proceso, rent\u00e1ndote solo el proceso, deber\u00eda ser m\u00e1s econ\u00f3mico que un VPS o u servidor en un datacenter.<\/p>\n<p>Mi contribuci\u00f3n para docker es este aplicaci\u00f3n llamada <a href=\"https:\/\/www.lastdragon.net\/misarchivos\/lastdragondockerproc\">lastdragondockerproc<\/a> , la intenci\u00f3n es mantener vivo el contenedor indefinidamente tanto con servicios de red como aplicaciones en background.<\/p>\n<p>Esta aplicacion debe ser colada en el \/bin del contenedor y darle permisos de ejecutaron, te dara un shell bash, cuando des exit ejecutara una lista de instrucciones que definir\u00e1s en el archivo \/autoexec que debe estar en el raiz del contenedor<\/p>\n<p>lanzamiento del programa<\/p>\n<p>docter run -t -i repositorio:tag lastdragondockerproc<\/p>\n<p>si lo lanzas desde una sesi\u00f3n ssh debe permanecer vivo al cerrar la sesi\u00f3n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker es un programa muy similar a chroot en cuanto a su funci\u00f3n pero mucho m\u00e1s complicado en su ejecuci\u00f3n. Docker permite aislar programas en entornos emulados, puede emular un Ubuntu, centos, y pr\u00e1cticamente cualquier distro de GNU\/Linux y posiblemente otros. Docker puede crear ambientes cerrados para ejecutar aplicaciones aisladas del resto del sistema e&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1043","post","type-post","status-publish","format-standard","hentry","category-personal"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1043"}],"version-history":[{"count":4,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1043\/revisions"}],"predecessor-version":[{"id":1047,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1043\/revisions\/1047"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}