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
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 utilizardocker 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 realizarscripts
.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 ejecutardocker 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ásdocker image pull ubuntu:xenial
. Si no especificas nada estás descargando la última, es como si ejecutarasdocker image pull ubuntu:latest
. Indicarte quedocker image pull ubuntu:latest
es lo mismo que ejecutardocker 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 utilizardocker 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 espaciopull
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 adocker image ls
docker rmi <imagen>
es la versión cortadocker image rm <imagen>
docker pull <imagen>
otra alternativa adocker image pull <imagen>
docker push <imagen>
es equivalente adocker 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 elPath
. - 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.
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