Ejemplo de almacenamiento de imágenes

Se ha creado una imagen que hemos subido a Docker Hub llamada josedom24/servidorweb. Esta imagen ofrece un servidor web sobre un sistema operativo Debian Linux, con una sencilla página web.

Durante el proceso de generación de la imagen:

  • Se ha partido de la imagen debian:stable-slim (Pimera capa).
  • Se ha instalado el servidor web Apache (Segunda capa).
  • La imagen tiene dos versiones. Las versiones están etiquetadas con las etiquetas v1 y v2. Cada versión tiene un fichero index.html diferente. (Tercera capa).

Vamos a descargar la primera versión de la imagen (suponemos que no tenemos descargada ninguna imagen en nuestro registro local):

$ docker pull josedom24/servidorweb:v1
v1: Pulling from josedom24/servidorweb
9532dfcb62dd: Pull complete 
209210f58112: Pull complete 
4f6c4ab344d9: Pull complete 
Digest: sha256:5707a7005d440bf32619e27e37800419b2c52644205da3c6a9edb9d55b8c51de
Status: Downloaded newer image for josedom24/servidorweb:v1
docker.io/josedom24/servidorweb:v1

Vemos como se han descargado las 3 capas, y que finalmente tenemos una nueva imagen en nuestro registro local:

$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED      SIZE
josedom24/servidorweb   v1        d0d75af6b8ec   3 days ago   187MB

A continuación descargamos la segunda versión de la imagen:

$ docker pull josedom24/servidorweb:v2
v2: Pulling from josedom24/servidorweb
9532dfcb62dd: Already exists 
209210f58112: Already exists 
274f48ad3e93: Pull complete 
Digest: sha256:9acd8efeb1f0be80c466a7ebb3772e045ffcb6b12cfbfadaa8b7c4b110bd83ea
Status: Downloaded newer image for josedom24/servidorweb:v2
docker.io/josedom24/servidorweb:v2

Podemos observar que las dos primeras capas “ya existen”, es decir, ya la tenemos almacenadas en nuestro registro, porque son iguales a las capas de la primera versión de la imagen.

Si visualizamos las imágenes:

$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED      SIZE
josedom24/servidorweb   v2        f558b3613d2c   3 days ago   187MB
josedom24/servidorweb   v1        d0d75af6b8ec   3 days ago   187MB

Podemos pensar que se ha ocupado en el disco duro 187Mb + 187 Mb, pero en realidad el espacio ocupado por las dos primeras capas sólo se guarda en el disco una vez, esas capas se comparten entre las dos versiones de la imagen. Esto lo podemos ver de manera más clara ejecutando el siguiente comando:

docker system df -v
Images space usage:

REPOSITORY              TAG       IMAGE ID       CREATED      SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS
josedom24/servidorweb   v2        f558b3613d2c   3 days ago   187MB     186.8MB       25B           0
josedom24/servidorweb   v1        d0d75af6b8ec   3 days ago   187MB     186.8MB       22B           0

De los 187 MB que tienen de tamaño las imágenes, 186,8 MB están compartido (este es el tamaño de las dos primeras capas), por lo tanto el espacio ocupado por cada una de las imágenes corresponde a la tercera capa (el fichero index.html) que en este caso es 25B y 22B.

Por lo tanto, ¿cuánto han ocupado en total estas dos imágenes en el disco duro? Pues sería 186,8MB + 25B + 22B. El mecanismo de compartir capas entre imágenes hace que se ocupe el menor espacio posible en disco duro, el almacenamiento es muy eficiente.

Ejemplo de almacenamiento de contenedores

Hemos descargado la imagen ubuntu y vemos su tamaño:

$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED       SIZE
ubuntu                  latest    e34e831650c1   2 weeks ago   77.9MB

Si creamos un contenedor interactivo:

$ docker run -it --name contenedor1 ubuntu

Nos salimos, y a continuación visualizamos el tamaño ocupado por el contenedor con la opción -s (size) del comando docker ps:

$ docker ps -a -s
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES         SIZE
679822aff71a   ubuntu    "/bin/bash"   25 seconds ago   Exited (0) 9 seconds ago             contenedor1   5B (virtual 77.9MB)

Vemos que el tamaño real del contenedor es 5B, aunque el sistema de archivos del contenedor (tamaño virtual) es de 77,9MB. Este tamaño es el de la imagen ubuntu cuyo sistema de ficheros se comparte con el contenedor.

Si a continuación volvemos a acceder al contenedor y creamos un fichero:

$ docker start contenedor1
contenedor1
$ docker attach contenedor1
root@a2d1ce6990d8:/# echo "00000000000000000">file.txt

Y volvemos a ver el tamaño, vemos que ha crecido con la creación del fichero:

$ docker ps -a -s
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES         SIZE
679822aff71a   ubuntu    "/bin/bash"   2 minutes ago   Exited (0) 5 seconds ago             contenedor1   62B (virtual 77.9MB)

El tamaño del contenedor ha aumentado, en realidad la Capa del Contenedor de lectura y escritura ha aumentado ya que hemos creado un nuevo fichero.

Por todo lo que hemos explicado, ahora se entiende que no podemos eliminar una imagen cuando tenemos contenedores creados a a partir de ella.

$ docker rmi ubuntu
Error response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container 679822aff71a is using its referenced image e34e831650c1

Actualizado: