User Tools

Site Tools


apuntes:docker

This is an old revision of the document!


Docker

¿Qué es Docker?

Figure 1: Máquina virtual vs Contenedor

Instalación

Docker

santi@zenbook:$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
5b0f327be733: Pull complete 
Digest: sha256:1f19634d26995c320618d94e6f29c09c6589d5df3c063287a00e6de8. . .
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker!
This message shows that your installation appears to be working correctly.
. . .
santi@zenbook:$ docker --version
Docker version 17.05.0-ce, build 89658be

Trabajar con Docker

Lanzar un contenedor

El comando docker run crea y lanza un contenedor a partir de una imagen dada. En este caso se trata de una imagen del Hub de Docker que contiene una máquina debian.

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:/# 

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.

santi@zenbook:$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a859e3fdc573        debian              "bash"              10 seconds ago      Up 7 seconds                            laughing_goldstine

Listar todos los contenedores

También podemos listar todos los contenedores, estén o no iniciados.

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

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.

santi@zenbook:$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              latest              72ef1cf971d1        6 days ago          100MB
hello-world         latest              05a3bd381fc2        7 days ago          1.84kB

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.

santi@zenbook:$ docker rm 78d990ba4591
78d990ba4591

Eliminar una imagen

Si no necesitamos una imagen, y ésta no tiene contenedores creados, podemos eliminarla del sistema.

santi@zenbook:$ docker rmi 05a3bd381fc2
Untagged: hello-world:latest
Untagged: hello-world@sha256:1f19634d26995c320618d94e6f29c. . .
Deleted: sha256:05a3bd381fc2470695a35f230afefd7bf978b56625. . .
Deleted: sha256:3a36971a9f14df69f90891bf24dc2b9ed9c2d20959. . .

Lanzar un contenedor con Apache

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.

Con el siguiente comando crearemos y lanzaremos un contenedor con las siguientes características:

  • El contenedor tendrá asociado el nombre miapache que podrá ser utilizando a partir de su creación para realizar cualquier operación sobre él
  • Se ha mapeado el puerto 80 del contenedor sobre el puerto 5555 de la máquina real. De esa manera, conectándonos al puerto 5555 de nuestro equipo podremos ver que ocurre en el 80 del contenedor, justamente donde estará escuchando el Apache del mismo
  • Hemos mapeado la ruta actual de nuestro equipo con la ruta /usr/local/apache2/htdocs del contenedor, que es donde Apache va a ir a buscar la web que aloje. Suponemos que el directorio actual de mi máquina tengo el sitio web que quiero testear
  • Indicamos que queremos crear y lanzar un contenedor utilizando la imagen del Hub de Docker, concretamente con la versión 2.4
  • También hemos indicado con la opción -d que queremos que la máquina se lance en segundo plano
santi@zenbook:$ docker run -dit --name miapache -p 5555:80 -v "$PWD":/usr/local/apache2/htdocs httpd:2.4
Unable to find image 'httpd:2.4' locally
2.4: Pulling from library/httpd
aa18ad1a0d33: Pull complete 
2b28e4afdec2: Pull complete 
802b6cd5ed3b: Pull complete 
6f2336b7c318: Pull complete 
d7c441746c9e: Pull complete 
ba7f19f905f9: Pull complete 
5c7522be7faf: Pull complete 
Digest: sha256:a46bd62f5286321ed19875778246f3afe97df5f9e91f0dd369a6ecfa529dbe81
Status: Downloaded newer image for httpd:2.4
444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c

Una vez lanzada y puesta 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

santi@zenbook:$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
444c11d75d0a        httpd:2.4           "httpd-foreground"   21 seconds ago      Up 19 seconds       0.0.0.0:5555->80/tcp   miapache

Detener un contenedor

Y ahora podemos detener y/o volver a iniciar el contenedor refiriéndonos a ella a través del nombre asociado.

santi@zenbook:$ docker stop miapache
miapache

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

santi@zenbook:$ docker start miapache
miapache

Mostrar la información de un contenedor

También podemos mostrar toda la información sobre un contenedor existente

santi@zenbook:$ docker inspect miapache
[
    {
        "Id": "444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c",
        "Created": "2017-09-20T01:15:37.043910145Z",
        "Path": "httpd-foreground",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 9146,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2017-09-20T01:17:16.277707412Z",
            "FinishedAt": "2017-09-20T01:16:36.545679645Z"
        },
        "Image": "sha256:d2327de7e695e105d1f764c5c291c3305cb1b2168960fab9afd2df2e71343532",
        "ResolvConfPath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/hostname",
        "HostsPath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/hosts",
        "LogPath": "/var/lib/docker/containers/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c/444c11d75d0a1e424c5c24668e62357af74de8b801e75d37c1e014e0423c9a2c-json.log",
        "Name": "/miapache",
        "RestartCount": 0,
        "Driver": "devicemapper",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/var/www/unsitioweb:/usr/local/apache2/htdocs"
            ],
            "ContainerIDFile": "",
. . .
. . .
. . .

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.

santi@zenbook:$ docker inspect --format "{{.NetworkSettings.Ports}}{{ .Mounts}}" miapache
map[80/tcp:[{0.0.0.0 5555}]][{bind  /var/www/unsitioweb /usr/local/apache2/htdocs   true }]
apuntes/docker.1505871849.txt.gz · Last modified: 2019/01/04 13:02 (external edit)