{"id":2434,"date":"2016-03-06T11:19:37","date_gmt":"2016-03-06T10:19:37","guid":{"rendered":"http:\/\/karstieltopia.com\/?p=2434"},"modified":"2016-03-06T11:19:37","modified_gmt":"2016-03-06T10:19:37","slug":"primeros-pasos-en-docker","status":"publish","type":"post","link":"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/","title":{"rendered":"Primeros pasos en Docker"},"content":{"rendered":"

Vale, ya tenemos instalado Docker en Windows (aunque lo que veremos en esta entrada sirve para cualquier entorno) y estamos deseosos de utilizarlo por primera vez, as\u00ed que ah\u00ed van nuestros primeros pasos en Docker.<\/p>\n

Si hemos dejado que nos instalase los iconos en el escritorio, veremos que tenemos dos enlaces directos diferentes, uno denominado Docker Quickstart Terminal y otro Kitematic. Vamos a empezar a hacer nuestros pinitos as\u00ed que arrancando el terminal (sobre el Kitematic ya hablaremos en otra entrada).<\/p>\n

Docker Quickstart Terminal<\/h2>\n

La primera vez que lo arranquemos en Windows tendr\u00e1 que descargarse la imagen de la distribuci\u00f3n Linux base en la que se ejecutar\u00e1 (si no os acord\u00e1is, pod\u00e9is echar un vistazo a la entrada anterior<\/a>, en donde os comentaba que en Linux esto se hace en nativo, pero que en Windows se tiene que virtualizar utilizando un gestor externo, VirtualBox, y una distribuci\u00f3n Linux b\u00e1sica con solo lo necesario, Boot2Docker. Como curiosidad, esta distribuci\u00f3n se descargar\u00e1 de Github, y es que<\/p>\n

Una vez que la hayamos descargado, esta imagen se empezar\u00e1 a instalar en VirtualBox. As\u00ed que ten\u00e9is que tener un poco de paciencia y estar atentos, porque puede ser que os pida permisos de administrador para realizar ciertas operaciones (crear un adaptador de red, etc). Cuando haya terminado de instalar todas la cosas, pasar\u00e9is a ver por fin la imagen de la terminal de Docker, en donde podremos empezar a hacer maldades con los contenedores.<\/p>\n

Como curiosidad, si ahora abr\u00eds VirtualBox, ver\u00e9is que ten\u00e9is una imagen instalada, ah\u00ed es d\u00f3nde se ejecutar\u00e1n los contenedores de Docker.<\/p>\n

Ahora s\u00ed, primeros pasos en Docker<\/h2>\n

Manos a la obra, porque si no empezamos no vamos a dar nuestros primeros pasos en Docker. Vamos a instalar un contenedor y para ello que mejor que el t\u00edpico Ubuntu que todos conocemos.<\/p>\n

La forma de ejecutar\u00a0este contenedor es muy sencilla, solo tenemos que teclear lo siguiente en la terminal:<\/p>\n

$ docker run ubuntu\r\n<\/pre>\n

Y empezaremos a ver que, como no la tenemos instalada localmente, se conectar\u00e1 a remoto para bajarse este contenedor y poder ejecutarlo.<\/p>\n

Para ver que lo tenemos correctamente funcionando, podemos ejecutar un ps como en cualquier otro Linux de la siguiente manera:<\/p>\n

$ docker ps \r\n\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES<\/pre>\n

Curioso, no vemos nuestro contenedor de Ubuntu que hemos creado. Eso es porque no est\u00e1 ejecutando nada y, por lo tanto, est\u00e1 parado. Si queremos ver lo que se ha ejecutado, podemos hacerlo as\u00ed.<\/p>\n

$ docker ps -a\r\nCONTAINER ID        IMAGE                                   COMMAND             CREATED             STATUS                     PORTS               NAMES\r\na9a25df5581c        ubuntu                                  \"\/bin\/bash\"         4 seconds ago       Exited (0) 4 seconds ago                       pedantic_babbage<\/pre>\n

Aqu\u00ed podemos ver que se ha ejecutado el contendor de Ubuntu, con un comando de bash y que ha terminado correctamente. Ah, s\u00ed, y tambi\u00e9n el curioso nombre que se le pone.<\/p>\n

Bueno, \u00bfy qu\u00e9 podemos hacer con esto? Podemos entrar dentro de la m\u00e1quina y hacer cosas en ella:<\/p>\n

$ docker run -t -i ubuntu \/bin\/bash\r\nroot@b32bad70d260:\/#<\/pre>\n

Como vemos, ahora tenemos el terminal de una consola dentro de este contenedor. Los par\u00e1metros que le hemos pasado son -t para un terminal tty y -i para que este sea interactivo.<\/p>\n

En este punto podemos trastear un poco y cuando terminemos, podemos salir con el t\u00edpico exit para volver a la consola de Docker.<\/p>\n

Por cierto, anteriormente os he comentado que las im\u00e1genes se guardan en repositorios y esas cosas. Entonces, \u00bfhay un registro de cambios? Pues s\u00ed, si queremos que Docker nos ense\u00f1e los cambios que hemos hecho, solo tenemos que hacer algo as\u00ed:<\/p>\n

$ docker ps -a\r\nCONTAINER ID        IMAGE                                   COMMAND             CREATED             STATUS                      PORTS               NAMES\r\nb32bad70d260        ubuntu                                  \"\/bin\/bash\"         4 minutes ago       Exited (0) 58 seconds ago                       gigantic_boyd\r\n\r\n$ docker diff b32bad70d260\r\nC \/root\r\nA \/root\/.bash_history<\/pre>\n

Aqu\u00ed vemos que si le pasamos el identificador al diff, nos dice lo que se ha cambiado respecto a la imagen original. Curioso, \u00bfverdad? En otra entrada podremos investigar como guardar los cambios en repositorios y dem\u00e1s.<\/p>\n

Pero antes de terminar, vamos a hacer que nuestro contenedor haga algo.<\/p>\n

$ docker run -d ubuntu \/bin\/sh -c \"while true; do echo hola mundo; sleep 1; done\"\r\n6f5a5e6f23558f354fe211c130a3595ae90902210cb9c773147e7de7af829d4c\r\n\r\n$ docker ps\r\nCONTAINER ID        IMAGE               COMMAND                  CREATED                  STATUS              PORTS               NAMES\r\n6f5a5e6f2355        ubuntu              \"\/bin\/sh -c 'while tr\"   Less than a second ago   Up 10 seconds                           distracted_davinci\r\n\r\n$ docker logs distracted_davinci\r\nhola mundo\r\nhola mundo\r\nhola mundo\r\nhola mundo\r\nhola mundo\r\nhola mundo\r\nhola mundo\r\nhola mundo<\/pre>\n

\u00bfQu\u00e9 hemos hecho aqu\u00ed? Veamos, primero ejecutamos el contenedor ubuntu que, c\u00f3mo ya lo tenemos instalado en nuestro entorno, utilizar\u00e1 ese. Le ponemos la opci\u00f3n -d para decirle que lo queremos ejecutar como un demonio, as\u00ed que estar\u00e1 funcionando de fondo y le decimos entonces que ejecute en un shell (\/bin\/sh) un mini script que lo \u00fanico que hace es repetir cada segundo “hola mundo”.<\/p>\n

Le damos y… no vemos nada, y es porque el contenedor est\u00e1 “contenido” en si mismo (redundancia total de t\u00e9rminos), as\u00ed que lo siguiente es ejecutar un ps para ver que pasa. Si os fij\u00e1is, aqu\u00ed est\u00e1 ya sin el -a, no es necesario ir al hist\u00f3rico porque lo tenemos ejecut\u00e1ndose permanentemente.<\/p>\n

Pero, \u00bfy c\u00f3mo podemos ver la salida? Veamos, la salida estar\u00eda dentro del propio shell del entorno, es decir, si estuvi\u00e9ramos dentro del contenedor estar\u00edamos viendo permanentemente “hola mundo”, as\u00ed que lo que ejecutamos es un comando para ver que est\u00e1 pasando por el contenedor. El comando tiene el nombre de “logs” y hay que indicarle el nombre gracioso del contenedor.<\/p>\n

Y ah\u00ed est\u00e1, un mont\u00f3n de “hola mundo”.<\/p>\n

Antes de terminar el art\u00edculo un detalle, es bueno que paremos esta m\u00e1quina porque de tanto saludar se va a aburrir, as\u00ed que para parar un contenedor solo tenemos que hacer esto:<\/p>\n

$ docker ps\r\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES\r\n6f5a5e6f2355        ubuntu              \"\/bin\/sh -c 'while tr\"   9 minutes ago       Up 9 minutes                            distracted_davinci\r\n\r\n$ docker stop 6f5a5e6f2355\r\n6f5a5e6f2355\r\n\r\n$ docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES<\/pre>\n

B\u00e1sicamente tenemos que ejecutar un “stop” con el identificador (tambi\u00e9n podr\u00edamos usar el nombre). Viendo el ejemplo, primero con un ps lo vemos en ejecuci\u00f3n, luego lo paramos y luego con el ps ya vemos que no est\u00e1, as\u00ed que el contenedor se ha parado correctamente.<\/p>\n

Y hasta aqu\u00ed han llegado estos primeros pasos en Docker. Ir\u00e9 entrando en m\u00e1s detalles en pr\u00f3ximos art\u00edculos, porque realmente parece muy interesante, \u00bfno os parece?<\/p>\n","protected":false},"excerpt":{"rendered":"

Vale, ya tenemos instalado Docker en Windows (aunque lo que veremos en esta entrada sirve para cualquier entorno) y estamos deseosos de utilizarlo por primera vez, as\u00ed que ah\u00ed van nuestros primeros pasos en Docker. Si hemos dejado que nos instalase los iconos en el escritorio, veremos que tenemos dos enlaces directos diferentes, uno denominado […]<\/p>\n","protected":false},"author":1,"featured_media":2435,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[920],"tags":[1007,1004,1009,66,90],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/karstieltopia.com\/wp-content\/uploads\/2016\/03\/docker_terminal.png?fit=630%2C309","jetpack_publicize_connections":[],"yoast_head":"\nPrimeros pasos en Docker - Karstieltopia<\/title>\n<meta name=\"description\" content=\"Vamos a ver unos primeros pasos en Docker de forma que podremos ir asentando conocimiento en este entorno con unos ejemplos sencillos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Primeros pasos en Docker - Karstieltopia\" \/>\n<meta property=\"og:description\" content=\"Vamos a ver unos primeros pasos en Docker de forma que podremos ir asentando conocimiento en este entorno con unos ejemplos sencillos.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"Karstieltopia\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-06T10:19:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/karstieltopia.com\/wp-content\/uploads\/2016\/03\/docker_terminal.png?fit=630%2C309\" \/>\n\t<meta property=\"og:image:width\" content=\"630\" \/>\n\t<meta property=\"og:image:height\" content=\"309\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@karstiel\" \/>\n<meta name=\"twitter:site\" content=\"@karstiel\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/karstieltopia.com\/#website\",\"url\":\"http:\/\/karstieltopia.com\/\",\"name\":\"Karstieltopia\",\"description\":\"Programaci\\u00f3n, tecnolog\\u00eda y a\\u00f1adidos\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/karstieltopia.com\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/#primaryimage\",\"inLanguage\":\"es\",\"url\":\"https:\/\/i0.wp.com\/karstieltopia.com\/wp-content\/uploads\/2016\/03\/docker_terminal.png?fit=630%2C309\",\"width\":630,\"height\":309,\"caption\":\"Terminal de Docker\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/#webpage\",\"url\":\"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/\",\"name\":\"Primeros pasos en Docker - Karstieltopia\",\"isPartOf\":{\"@id\":\"http:\/\/karstieltopia.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/#primaryimage\"},\"datePublished\":\"2016-03-06T10:19:37+00:00\",\"dateModified\":\"2016-03-06T10:19:37+00:00\",\"author\":{\"@id\":\"http:\/\/karstieltopia.com\/#\/schema\/person\/3d09a55c38c7c00e78c41fa3f71a6e75\"},\"description\":\"Vamos a ver unos primeros pasos en Docker de forma que podremos ir asentando conocimiento en este entorno con unos ejemplos sencillos.\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/karstieltopia.com\/sistemas-operativos\/virtualizacion\/primeros-pasos-en-docker\/\"]}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/karstieltopia.com\/#\/schema\/person\/3d09a55c38c7c00e78c41fa3f71a6e75\",\"name\":\"karstiel\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6AuIG-Dg","_links":{"self":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts\/2434"}],"collection":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/comments?post=2434"}],"version-history":[{"count":13,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts\/2434\/revisions"}],"predecessor-version":[{"id":2448,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/posts\/2434\/revisions\/2448"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/media\/2435"}],"wp:attachment":[{"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/media?parent=2434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/categories?post=2434"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/karstieltopia.com\/wp-json\/wp\/v2\/tags?post=2434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}