User Tools

Site Tools


apuntes:docker

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
apuntes:docker [2017/09/20 01:37] – [Trabajar con Docker] Santiago Faciapuntes:docker [2023/04/14 11:06] (current) – [Eliminar la caché] Santiago Faci
Line 4: Line 4:
  
 ===== ¿Qué es Docker? ===== ===== ¿Qué es Docker? =====
 +
 +Docker es una plataforma para desarrollar, lanzar y ejecutar aplicaciones. Permite separar las aplicaciones desarrolladas de la infraestructura donde se desarrollan y trabajar así más comoda y rapidamente. 
 +
 +Docker permite empaquetar y lanzar una aplicación en un entorno totalmente aislado llamado contenedor. Estos contenedores se ejecutan directamente sobre el kernel de la máquina por lo que son mucho más ligeros que las máquinas virtuales. De esa manera podemos ejecutar mucho más contenedores para el mismo equipo que si éstos fueran maquina virtuales. De esta manera, podemos probar rapidamente uestra aplicación web, por ejemplo, en múltiples entornos distintos al de donde nos encontramos desarrollando. Realmente es mucho más rápido que hacerlo en una máquina virtual, puesto que reduce el tiempo de carga y el espacio requerido por cada uno de estos contenedores o máquinas.
 +
 +Incluso existe un repositorio, el [[http://hub.docker.com|Hub de Docker]], donde podemos encontrar imágenes de máquinas que podemos directamente descargar y ejecutar como contenedores. De esa forma, podemos, con un solo comando, lanzar una máquina con la configuración exacta a la que necesitamos para probar nuestro sitio web, aplicación web o cualquier desarrollo en el que estemos trabajando. 
 +
 +En las siguienes imágenes se compara la arquitectura de Docker y la de un sistema basado en máquinas virtuales. Se puede observar que, al eliminar la necesidad de un Sistema Operativo invitado, los contenedores de Docker son mucho más ligeros. En la práctica, se puede apreciar claramente como la velocidad de creación y arranque de estos contenedores es claramente superior a la de cualquier máquina virtual, sobre todo porque en cada contenedor podremos decidir que capas instalar contando sólo con lo estrictamente necesario.
  
 <figure> <figure>
Line 11: Line 19:
 <caption>Máquina virtual vs Contenedor</caption></figure> <caption>Máquina virtual vs Contenedor</caption></figure>
  
-==== Instalación ====+<figure> 
 +{{ apuntes:arquitectura_docker.png }} 
 +<caption>Arquitectura de Docker</caption></figure>
  
-[[http://www.docker.com/|Docker]]+===== Instalación ===== 
 + 
 +Una vez hayamos descargado [[http://www.docker.com|Docker]] para su instalación, podemos ejecutar el siguiente comando para comprobar que todo se ha instalado y funciona correctamente. Básicamente ejecuta un contenedor llamado //hello-world// que se ejecuta sobre nuestra máquina y muestra un mensaje. Si todo sale bien significa que nuestra instalación de Docker funciona sin problemas.
  
 <code bash> <code bash>
Line 27: Line 39:
 . . . . . .
 </code> </code>
 +
 +Si queremos comprobar la versión de Docker podemos hacerlo de la siguiente manera. A veces puede ser útil puesto que se pueden haber añadido nuevas características en las versiones posteriores y podemos necesitar saber en cuál estamos nosotros.
  
 <code bash> <code bash>
Line 33: Line 47:
 </code> </code>
  
-==== Trabajar con Docker ====+===== Imágenes =====
  
-=== Lanzar un contenedor ===+Las imágenes son una serie de capas software que definen la estructura que tendrá el contenedor que se cree a partir de ella.
  
-El comando ''docker run'' crea y lanza un contenedor a partir de una imagen dada. En este caso se trata de una imagen del [[https://hub.docker.com|Hub de Docker]] que contiene una máquina debian.+==== Crear una imagen ====
  
-<code bash> +Normalmente se crean a través de un fichero donde se definen las características que se quieren añadir a dicha imagen, creando un fichero llamado ''Dockerfile'' como el siguienteEn nuestro caso hemos definido que queremos una máquina con soporte para PHP 7.0 y que disponga de un servidor web ApacheAdemás, se copiará el contenido de nuestra carpeta ''src'' (imaginemos que tenemos alli código PHP que queremos probar) a la carpeta ''/var/www/html'' del contenedor, que es justo la carpeta donde se copia el contenido que queremos que Apache sirva.
-santi@zenbook:$ docker run -it debian bash +
-Unable to find image 'debian:latestlocally +
-latest: Pulling from library/debian +
-219d2e45b4af: Pull complete  +
-Digest: sha256:126052225b62db18c32f03a4462a92fad2ef243c6509371edb82. . . +
-Status: Downloaded newer image for debian:latest +
-root@94565ea1af31:/#  +
-</code>+
  
-=== Listar los contenedores en ejecución ===+<file vim Dockerfile> 
 +FROM php:7.0-apache 
 +COPY src /var/www/html 
 +</file>
  
-Si dejamos el contenedor en marcha lanzamos el comando ''docker ps'' desde otra consola podremos ver como el contenedor se encuentra en ejecución.+De esta forma tendremos una carpeta cuyo contenido será el fichero ''Dockerfile'' que acabamos de crear la carpeta ''src'' con el sitio web que queremos probar
  
 <code bash> <code bash>
-santi@zenbook:docker ps +santi@zenbook:ls 
-CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES +Dockerfile src
-a859e3fdc573        debian              "bash"              10 seconds ago      Up 7 seconds                            laughing_goldstine+
 </code> </code>
  
-=== Listar todos los contenedores ===+A continuación, ya podemos crear la imagen, ejecutando el siguiente comando, donde aprovechamos para etiquetarla como ''miapache-php'':
  
-También podemos listar todos los contenedores, estén o no iniciados.+<code bash> 
 +santi@zenbook:$ docker build -t miapache-php . 
 +Sending build context to Docker daemon  3.584kB 
 +Step 1/2 : FROM php:7.0-apache 
 +7.0-apache: Pulling from library/php 
 +aa18ad1a0d33: Already exists  
 +29d5f85af454: Pull complete  
 +eca642e7826b: Pull complete  
 +3638d91a9039: Pull complete  
 +3646a95ab677: Pull complete  
 +628b8373e193: Pull complete  
 +c24a2b2280ed: Pull complete  
 +f968b84cbbbc: Pull complete  
 +d9ca89480aeb: Pull complete  
 +9d506ea407af: Pull complete  
 +3e07f2e31260: Pull complete  
 +cddaac5f61ab: Pull complete  
 +1d7adb8f245d: Pull complete  
 +Digest: sha256:917ceda30c70ebb682536a1f091f25a8364d61c72c3323. . . 
 +Status: Downloaded newer image for php:7.0-apache 
 + ---> b123b973e3e8 
 +Step 2/2 : COPY src /var/www/html 
 + ---> 8a6954795b9f 
 +Removing intermediate container dc20be7a4288 
 +Successfully built 8a6954795b9f 
 +Successfully tagged miapache-php:latest 
 +</code> 
 + 
 +Ahora sólo nos queda lanzar un contenedor de esa imagen para ponerla en marcha. En este caso mapeamos el puerto 80 de la máquina
  
 <code bash> <code bash>
-santi@zenbook:$ docker ps -a +santi@zenbook:$ docker run -p 5555:80 miapache-php 
-CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES +AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message 
-5248cf319258        debian              "bash"              7 seconds ago       Exited (0seconds ago                        silly_wiles +AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message 
-78d990ba4591        hello-world         "/hello"            17 seconds ago      Exited (0) 14 seconds ago                       vibrant_mccarthy+[Wed Sep 20 11:25:14.857530 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (DebianPHP/7.0.23 configured -- resuming normal operations 
 +[Wed Sep 20 11:25:14.857575 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
 </code> </code>
  
-=== Listar las imágenes locales ===+Podemos ver como ha arracando un servidor web Apache y, por el mapeo de puertos que hemos establecido, podemos visitar la URL ''http://localhost:5555'' para visitar el sitio web. 
 + 
 +==== Listar las imágenes locales ====
  
 Además, es posible comprobar que imágenes tenemos disponibles localmente. Serán las imágenes de las que hayamos creado contenedores en algún momento, independientemente de que éstos todavía existan. Además, es posible comprobar que imágenes tenemos disponibles localmente. Serán las imágenes de las que hayamos creado contenedores en algún momento, independientemente de que éstos todavía existan.
Line 77: Line 116:
 santi@zenbook:$ docker images santi@zenbook:$ docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 +miapache-php        latest              8a6954795b9f        5 minutes ago       390MB
 debian              latest              72ef1cf971d1        6 days ago          100MB debian              latest              72ef1cf971d1        6 days ago          100MB
 hello-world         latest              05a3bd381fc2        7 days ago          1.84kB hello-world         latest              05a3bd381fc2        7 days ago          1.84kB
 </code> </code>
  
-=== Eliminar un contenedor === +==== Eliminar una imagen ====
- +
-Podemos eliminar un contenedor con el comando ''docker rm'' pasando su ''CONTAINER ID'' como argumento. También podríamos haberle asociado un nombre al crearlo para poder referirnos a él. Lo veremos más adelante. +
- +
-<code bash> +
-santi@zenbook:$ docker rm 78d990ba4591 +
-78d990ba4591 +
-</code> +
- +
-=== Eliminar una imagen ===+
  
 Si no necesitamos una imagen, y ésta no tiene contenedores creados, podemos eliminarla del sistema. Si no necesitamos una imagen, y ésta no tiene contenedores creados, podemos eliminarla del sistema.
Line 102: Line 133:
 </code> </code>
  
-=== Lanzar un contenedor con Apache ===+===== Contenedores ===== 
 + 
 +==== Lanzar un contenedor ===
 + 
 +Como ya hemos visto un poco más arriba, el comando ''docker run'' crea y lanza un contenedor a partir de una imagen dada. En el caso anterior utilizabamos una imagen previamente preparada y descargada. A la imagen la habiamos llamado //miapache-php// y podíamos utilizar ese nombre para lanzar un contenedor. Además, al lanzar el contenedor mapeabamos el puerto 80 del contenedor con el puerto 5555 de nuestra máquina. 
 + 
 +<code bash> 
 +santi@zenbook:$ docker run -p 5555:80 miapache-php 
 +</code> 
 + 
 +Ahora veremos como también podemos lanzar contenedores indicando una imagen de la que todavía no disponemos (por ejemplo una imagen de [[https://hub.docker.com|Hub de Docker]] que contiene una máquina debian). Docker se encargará de descargar la imagen y, posteriormente, lanzará el contenedor. Además, al final del comando pasaremos como argumento el comando que queremos que docker ejecute sobre el contenedor en cuanto este inicie. En este caso queremos iniciar una sesión de ''bash''
 + 
 +<code bash> 
 +santi@zenbook:$ docker run -it debian bash 
 +Unable to find image 'debian:latest' locally 
 +latest: Pulling from library/debian 
 +219d2e45b4af: Pull complete  
 +Digest: sha256:126052225b62db18c32f03a4462a92fad2ef243c6509371edb82. . . 
 +Status: Downloaded newer image for debian:latest 
 +root@94565ea1af31:/#  
 +</code>
  
 Ahora veamos un ejemplo en el que queramos desplegar una página web en un servidor web Apache. Queremos crear un contenedor con un servidor Apache desde el que podamos comprobar que la página funciona correctamente. Ahora veamos un ejemplo en el que queramos desplegar una página web en un servidor web Apache. Queremos crear un contenedor con un servidor Apache desde el que podamos comprobar que la página funciona correctamente.
Line 129: Line 180:
 </code> </code>
  
-Una vez lanzada puesta en marcha podemos ir a la dirección ''http://localhost:5555'' con nuestro navegador y visitar nuestro sitio web funcionando desde el contenedor.+Una vez lanzado puesto en marcha podemos ir a la dirección ''http://localhost:5555'' con nuestro navegador y visitar nuestro sitio web funcionando desde el contenedor.
  
-Podemos ver cómo está el contenedor en ejecución con el comando ''docker ps''+Podemos ver cómo está el contenedor en ejecución con el comando ''docker ps'' que, puesto que se ha lanzado en segundo plano, sigue en funcionamiento.
  
 <code bash> <code bash>
Line 138: Line 189:
 444c11d75d0a        httpd:2.4           "httpd-foreground"   21 seconds ago      Up 19 seconds       0.0.0.0:5555->80/tcp   miapache 444c11d75d0a        httpd:2.4           "httpd-foreground"   21 seconds ago      Up 19 seconds       0.0.0.0:5555->80/tcp   miapache
 </code> </code>
 +
 +==== Listar los contenedores en ejecución ====
 +
 +Si dejamos el contenedor en marcha y lanzamos el comando ''docker ps'' desde otra consola podremos ver como el contenedor se encuentra en ejecución.
 +
 +<code bash>
 +santi@zenbook:$ docker ps
 +CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 +a859e3fdc573        debian              "bash"              10 seconds ago      Up 7 seconds                            laughing_goldstine
 +</code>
 +
 +==== Listar todos los contenedores ====
 +
 +También podemos listar todos los contenedores, estén o no iniciados.
 +
 +<code bash>
 +santi@zenbook:$ docker ps -a
 +CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
 +5248cf319258        debian              "bash"              7 seconds ago       Exited (0) 2 seconds ago                        silly_wiles
 +78d990ba4591        hello-world         "/hello"            17 seconds ago      Exited (0) 14 seconds ago                       vibrant_mccarthy
 +</code>
 +
 +==== Eliminar un contenedor ====
 +
 +Podemos eliminar un contenedor con el comando ''docker rm'' pasando su ''CONTAINER ID'' como argumento. También podríamos haberle asociado un nombre al crearlo para poder referirnos a él. Lo veremos más adelante.
 +
 +<code bash>
 +santi@zenbook:$ docker rm 78d990ba4591
 +78d990ba4591
 +</code>
 +
 +==== Detener un contenedor ====
  
 Y ahora podemos detener y/o volver a iniciar el contenedor refiriéndonos a ella a través del nombre asociado. Y ahora podemos detener y/o volver a iniciar el contenedor refiriéndonos a ella a través del nombre asociado.
Line 145: Line 228:
 miapache miapache
 </code> </code>
 +
 +==== Iniciar un contenedor ====
  
 El contenedor queda ya asociado y simplemente lo tengo que lanzar con el siguiente comando cada vez que lo quiera poner en marcha El contenedor queda ya asociado y simplemente lo tengo que lanzar con el siguiente comando cada vez que lo quiera poner en marcha
Line 152: Line 237:
 miapache miapache
 </code> </code>
 +
 +==== Mostrar la información de un contenedor ====
 +
 +También podemos mostrar toda la información sobre un contenedor existente
  
 <code bash> <code bash>
Line 179: Line 268:
         "HostsPath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/hosts",         "HostsPath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/hosts",
         "LogPath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c-json.log",         "LogPath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c-json.log",
-        "Name": "/miapp",+        "Name": "/miapache",
         "RestartCount": 0,         "RestartCount": 0,
         "Driver": "devicemapper",         "Driver": "devicemapper",
Line 195: Line 284:
 . . . . . .
 </code> </code>
 +
 +Como se puede ver, la información que se muestra, es muy exhaustiva. En ocasiones, si sabemos lo que buscamos, podemos directamente aplicar un filtro para indicar que partes de la configuración queremos que se muestren.
 +
 +En este caso queremos simplemente ver la configuración del contenedor (el que hemos creado anteriormente con nombre //miapache//) en lo que a la red y el montaje de volúmenes se refiere.
  
 <code bash> <code bash>
Line 200: Line 293:
 map[80/tcp:[{0.0.0.0 5555}]][{bind  /var/www/unsitioweb /usr/local/apache2/htdocs   true }] map[80/tcp:[{0.0.0.0 5555}]][{bind  /var/www/unsitioweb /usr/local/apache2/htdocs   true }]
 </code> </code>
 +
 +===== Varios =====
 +
 +==== Eliminar la caché ====
 +
 +Eliminará la cache del proceso de construcción de las imágenes. Asi podemos forzar que vuelva a descargar todos los ficheros y realizar todos los pasos como si fuera la primera vez.
 +
 +<code bash>
 +santi@zenbook:$ docker builder prune
 +</code>
 +
 +----
 +
 +(c) 2017 Santiago Faci
apuntes/docker.1505871463.txt.gz · Last modified: 2019/01/04 13:02 (external edit)