Gestionar imágenes con Docker

Este es uno de los capítulos del tutorial Tutorial de Docker. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Antes de empezar a arrancar contenedores como si no hubiera un mañana, creo que es realmente interesante saber gestionar tanto las imágenes como los contenedores. De otra manera te vas a encontrar con un sinfin de imágenes y contenedores que ocupan espacio en tu ordenador o donde sea que los estés corriendo y que no te aportan nada. Así, en este primer capítulo del tutorial sobre Docker, verás no solo como descargar imágenes, si no también de donde se descargan, como borrarlas y algunas herramientas adicionales para gestionar imágenes con Docker.

Gestionar imágenes con Docker

Gestionar imágenes con Docker

Docker Hub o donde están esas imágenes.

A partir de aquí, y en repetidas ocasiones, encontrarás referencias a descargar una imagen de un repositorio. Pero ¿que es eso de un repositorio?¿Donde está ese repositorio?¿A quien pertenece ese repositorio?

En general, a lo largo de este capítulo, y del tutorial en general, me refiero a los repositorios de Docker Hub. Entonces ¿que es Docker Hub?

Docker Hub es un servicio proporcionado por Docker para compartir imágenes de contenedores con el resto del mundo en general. Aunque también es posible compartir tus imágenes de forma privada. ¿Y como se comparten esas imágenes?

Las imágenes se encuentran en repositorios, almacenes. Aunque ya entraré en mas profundidad en el mundo de Docker Hub, indicar que tu o una empresa, pueden tener varios repositorios tanto públicos como privados, donde guardar sus imágenes. Si bien, en Docker Hub, con una cuenta gratuita solo puedes tener un repositorio privado.

¿Que hay en los repositorios?

En cada repositorio tienes diferentes versiones de una misma imagen. Por ejemplo, si vas al repositorio de Ubuntu. encontrarás imágenes para distintas versiones de Ubuntu, eoan, disco, xenial, etc. Además para cada una de estas versiones existen imágenes para diferentes arquitecturas, 386, amd64, arm/v7, arm64/v8, etc. Pero de la arquitectura no te tienes que procupar. De esto se encarga docker, seleccionando la imagen adecuada para tu arquitectura.

De cualquier forma, dedicaré un capítulo posterior a Docker Hub, para que crees tus propios repositorios, y puedas comenzar a subir tus imágenes. Esto te facilitará los desplieges de tus imágenes al tenerlas centralizadas en un sitio.

Trabajando con imágenes

La primera de las instrucciones que tienes que conocer para adentrarte en el mundo de las imágenes de Docker es docker image --help. Si, la ayuda. En muchas ocasiones te lías a buscar en internet, y no caes que en tu propio ordenador tienes una importante fuente de información. Y lo mejor de todo, una fuente de información fiable y actualizada. Eso si también puedes recurrir a la documentación oficial.

Si ejecutas docker image --help vas a obtener un listado de todas los comandos que puedes ejecutar para trabajar con imágenes. Sin embargo, me voy a centrar en los mas básicos, y ya te adentrarás mas adelante en el resto, conforme los vayas necesitando.

  • build es la herramienta que tienes para construir tus propias imágenes a partir de un Dockerfile. Pero no te preocupes de esto ahora mismo, lo veremos en un siguiente capítulo del tutorial.
  • history te muestra la historia de esa imagen, es decir, como se construyó esa imagen. Los pasos que se siguieron para construir la imagen. Por ejemplo, en el caso de Ubuntu, tendrás algo como lo que puedes ver a continuación,
MAGE               CREATED             CREATED BY                                      SIZE
a2a15febcdf3        4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           4 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>           4 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B
<missing>           4 weeks ago         /bin/sh -c [ -z "$(apt-get indextargets)" ]     987kB
<missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:c477cb0e95c56b51e…   63.2MB
  • inspect te permite ver los detalles y entrañas de una imagen. Por ejemplo, el número identificador, las etiquetas, la fecha de creación, las variables de entorno, los comandos, la versión de docker, y otros aspectos mas. Sin embargo, ahora mismo no te preocupes de esto, ya le sacarás punta mas adelante. Ahora solo recuerda que tienes esta opción a tu disposición.
  • ls te muestra todas las imágenes que tienes descargas en tu equipo. docker image ls. Si quieres que te muestre también las imágenes intermedias tienes que utilizar docker image ls -a. Si solo quieres ver los números de identificación, ID utiliza la opción -q. Esto te será de utilidad para realizar scripts.
  • prune te permite borrar todas las imágenes que no estés utilizando. Este comando lo tienes que utilizar con relativo cuidado, porque te puedes quedar sin imágenes en tu equipo. Sin embargo, tampoco te tienes que preocupar en exceso. Recuerda que las imágenes se encuentra en los repositorios, con lo que siempre puedes volver a descargarla.

Más comandos

  • pull te permite descargar una imagen de un repositorio. Así, por ejemplo, para descargar una imagen de Ubuntu, solo tienes que ejecutar docker image pull ubuntu. Si quieres descargar una versión concreta, tal y como te indicaba en el apartado anterior, tendrás que añadir la etiqueta. Por ejemplo, si quieres descargar la versión de Ubuntu Xenial, ejecutarás docker image pull ubuntu:xenial. Si no especificas nada estás descargando la última, es como si ejecutaras docker image pull ubuntu:latest. Indicarte que docker image pull ubuntu:latest es lo mismo que ejecutar docker pull ubuntu.
  • push te permite subir una imagen a un repositorio. Esto lo dejamos para mas adelante.
  • rm te permite borrar una o varias imágenes. También puedes utilizar docker rmi <nombre de la imagen>. Puedes indicar el nombre de la imagen o parte del número de identificación de la imagen. Quiero decir, que no es necesario que le digas todo el ID de la imagen. Si existen dos imágenes y empienzan con diferentes carácter, puedes utilizar solo un carácter.

Comandos básicos con imágenes

Por ahora, solo necesitarás básicamente tres comandos para gestionar tus imágenes,

  • ls, para saber las imágenes que tienes en tu equipo.
  • rm para borrar las imágenes cuando hayas dejado de utilizarlas y recuperar ese espacio
  • pull en el caso de que quieras descargar la imagen.

Esto de pull lo comento, porque si intentas crear un contenedor sin que esté la imagen disponible, lo primero será descargarlo. Esto ya lo viste en el capítulo de introducción de Docker.

Indicarte que los siguientes comandos son equivalentes,

  • docker images es equivalente a docker image ls
  • docker rmi <imagen> es la versión corta docker image rm <imagen>
  • docker pull <imagen> otra alternativa a docker image pull <imagen>
  • docker push <imagen> es equivalente a docker image push <imagen> Llegados a este punto hacerte una observación en referencia al borrado de imágenes. Y es que no podrás borrar una imagen si existe un contenedor

Un poco de práctica

Una observación: verás que hay como dos tipos de imágenes a la hora de descargarlas de Docker Hub,

  • Las que se descargan como docker pull ubuntu
  • Otras que tienen la forma docker pull atareao/baseimage

Las primeras son imágenes oficiales, y son la recomendación oficial de imágenes que tienes que utilizar en tus proyectos. Las segundas, son imágenes que ha creado una persona como tu o yo, o una empresa. Esto no quita con que no sean fiables. Sin embargo, es mejor conocer la persona o equipo que está detrás de esa imagen.

Así para que practiques un poco me voy a basar en la segunda de las imágenes. Se trata de una imagen de Ubuntu, pero con lo mínimo de lo mínimo. Tan poco que supera por poco los 38MB, y con esto ya puedes empezar a trabajar.

Así lo primero es descargar la imagen,

$ docker pull atareao/baseimage

Using default tag: latest
latest: Pulling from atareao/baseimage
Digest: sha256:96408f1b2a4044942b9590a33de7b373a42460c29209bf48546785931aa5e964
Status: Image is up to date for atareao/baseimage:latest
docker.io/atareao/baseimage:latest

Comprueba que tienes la imagen descargada en tu equipo. Para ello ejecuta,

$ docker images

atareao/baseimage       latest              4564665e4e1c        22 months ago       38.8MB

Llega el momento de ver como se hizo esa imagen. Simplemente ejecuta,

$ docker history atareao/baseimage
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
4564665e4e1c        13 minutes ago      /bin/bash -c #(nop)  SHELL [/bin/bash -c]       0B                  
6b333fe405e4        13 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
95cf1e350102        13 minutes ago      /bin/sh -c #(nop) ADD file:b605b0bc23666cf38…   38.8MB              
54cf38b3968b        13 minutes ago      /bin/sh -c #(nop)  LABEL org.label-schema.ve…   0B

Por supuesto, tienes la opción de ver los detalles (tripas) de esa imagen utilizando,

$ docker inspect atareao/baseimage

[
    {
        "Id": "sha256:4564665e4e1c6357c15127d44334257c8cc4db4ed4cc154432a7a68529ae50e1",
        "RepoTags": [
            "atareao/baseimage:amd64",
            "atareao/baseimage:latest"
        ],
        "RepoDigests": [
            "atareao/baseimage@sha256:96408f1b2a4044942b9590a33de7b373a42460c29209bf48546785931aa5e964"
        ],
        "Parent": "sha256:6b333fe405e491c2a81a00018ec938c789ff9be066a2451cbe4f5ebaea308118",
        "Comment": "",
        "Created": "2020-01-02T06:43:07.105332402Z",
        "Container": "41c127310b4de4fbd3145b406a96c4eaa466c73955b6032dc90ad57caf76c5ac",
        "ContainerConfig": {
            "Hostname": "41c127310b4d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash",
                "-c",
                "#(nop) ",
                "SHELL [/bin/bash -c]"
            ],
            "Image": "sha256:6b333fe405e491c2a81a00018ec938c789ff9be066a2451cbe4f5ebaea308118",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "arch": "amd64",
                "family": "haswell silvermont excavator zx-c",
                "kernelversion": "4.10.0",
                "minfamily": "ivybridge silvermont piledriver zx-c",
                "minkernelversion": "4.4.148",
                "operatingsystem": "linux",
                "org.label-schema.build-date": "2019-01-22T14:10:00+00:00",
                "org.label-schema.name": "minimal base images with Ubuntu",
                "org.label-schema.schema-version": "1.0rc1",
                "org.label-schema.vcs-type": "git",
                "org.label-schema.vcs-url": "https://github.com/Blitznote/apt-image",
                "org.label-schema.vendor": "Blitznote",
                "subarch": "cx16 fxsr pclmul popcnt mmx sse2 sse3 ssse3 sse4_1 sse4_2"
            },
            "Shell": [
                "/bin/bash",
                "-c"
            ]
        },
        "DockerVersion": "19.03.2",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:6b333fe405e491c2a81a00018ec938c789ff9be066a2451cbe4f5ebaea308118",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "arch": "amd64",
                "family": "haswell silvermont excavator zx-c",
                "kernelversion": "4.10.0",
                "minfamily": "ivybridge silvermont piledriver zx-c",
                "minkernelversion": "4.4.148",
                "operatingsystem": "linux",
                "org.label-schema.build-date": "2019-01-22T14:10:00+00:00",
                "org.label-schema.name": "minimal base images with Ubuntu",
                "org.label-schema.schema-version": "1.0rc1",
                "org.label-schema.vcs-type": "git",
                "org.label-schema.vcs-url": "https://github.com/Blitznote/apt-image",
                "org.label-schema.vendor": "Blitznote",
                "subarch": "cx16 fxsr pclmul popcnt mmx sse2 sse3 ssse3 sse4_1 sse4_2"
            },
            "Shell": [
                "/bin/bash",
                "-c"
            ]
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 38768546,
        "VirtualSize": 38768546,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/fab65b4c07fbdf7f215097415c00737ef9d87265af9a4dad5cb240f5ec7fbb87/merged",
                "UpperDir": "/var/lib/docker/overlay2/fab65b4c07fbdf7f215097415c00737ef9d87265af9a4dad5cb240f5ec7fbb87/diff",
                "WorkDir": "/var/lib/docker/overlay2/fab65b4c07fbdf7f215097415c00737ef9d87265af9a4dad5cb240f5ec7fbb87/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:a669dbb2d94fd2333c3e4d91521d0c3221c27c23e69747a4269aad7eb6cd27b5"
            ]
        },
        "Metadata": {
            "LastTagTime": "2020-01-02T07:46:47.432665726+01:00"
        }
    }
]
Algunos detalles

Por ahora solo te tines que fijar en 3 aspectos,

  • Lo primero es el reducido tamaño de la imagen. Con apenas 38 MB ya tienes un Ubuntu sobre el que empezar a construir tus propias imágenes. Esto lo verás con detalle en un capítulo posterior.
  • En Env encuentras las variables de entorno. En este caso tienes definido el Path.
  • Por otro lado, en Cmd está la instrucción que ejecutarás al iniciar el contenedor.

El único paso que te queda pendiente es el de borrar esta nueva imagen. Para ello, tan solo tienes que ejecutar la instrucción docker rmi atareao/baseimage, también puedes borrar la imagen por el identificado, docker rmi 49db5d90d6f1. Recuerda que no es necesario poner todos los caracteres del identificador. Es decir, también podrías borrar la imagen con un docker rmi 49.

Conclusión

En este primer capítulo del tutorial sobre docker, has podido ver los primeros pasos sobre gestionar imágenes de Docker. Como descargarlas de Docker Hub, ver su contenido y borrarlas de tu equipo.

En el siguiente capítulo vas a hacer lo mismo, pero con contenedores. Podrás iniciar tus contenedores a partir de las imágenes que tengas descargadas o descargues, etc.

1 comentario en “Gestionar imágenes con Docker

  1. ED
    Edgardo Lo Grasso hace 2 años

    Estimado Lorenzo, te quería consultar, estoy realizando el tutorial, con una rpi 4, he creado los dos archivos Dockerfile y run.sh, pero no he logrado que corra el docker, por otro lado consultar, comenzaste con la imagen atareao/baseimage y cuando creaste los archivos utilizaste atareao/sample, el cual no figura. Cual puede ser el error. Desde ya muchas gracias, por el aporte a la comunidad

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *