Original article: Where are Docker Images Stored? Docker Container Paths Explained

Docker ha sido ampliamente adoptado y se utiliza para ejecutar y escalar aplicaciones en producción. Además, se puede usar para iniciar aplicaciones rápidamente ejecutando un solo comando de Docker.

Las empresas también están invirtiendo cada vez más esfuerzos para mejorar el desarrollo en contenedores Docker locales y remotos, lo que también tiene muchas ventajas.

Puedes obtener la información básica sobre la configuración de su Docker ejecutando:

$ docker info

...
 Storage Driver: overlay2
 Docker Root Dir: /var/lib/docker
...

El resultado contiene información sobre su controlador de almacenamiento, así como del directorio raíz de Docker.

La ubicación de almacenamiento de imágenes y contenedores de Docker

Un contenedor de Docker consta de configuraciones de red, volúmenes e imágenes. La ubicación de los archivos de Docker depende de su sistema operativo. Aquí hay una descripción general de los sistemas operativos más utilizados:

  • Ubuntu: /var/lib/docker/
  • Fedora: /var/lib/docker/
  • Debian: /var/lib/docker/
  • Windows: C:\ProgramData\DockerDesktop
  • MacOS: ~/Library/Containers/com.docker.docker/Data/vms/0/

En macOS y Windows, Docker ejecuta contenedores de Linux en un entorno virtual. Por lo tanto, hay algunas cosas adicionales que debe saber.

Docker para Mac

Docker no es compatible de forma nativa con macOS, de allí que Hyperkit es usado para correr una imagen virtual. Esta imagen virtual está localizada en:

~/Library/Containers/com.docker.docker/Data/vms/0

Dentro de la imagen virtual, la ruta es la que presenta Docker por default: /var/lib/docker.

Podemos investigar la dirección de nuestro directorio de Docker mediante el shell en el entorno virtual:

$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty 

Puedes cerrar esta sesión presionando Ctrl+a, seguido de k e y.

Docker para Windows

En Windows, Docker está un poco fraccionado. Hay contenedores nativos de Windows que funcionan de manera similar a los contenedores de Linux. Los contenedores de Linux se ejecutan en un entorno virtual mínimo basado en Hyper-V.
La configuración y la imagen virtual para ejecutar las imágenes de Linux se guardan en la carpeta raíz predeterminada de Docker.

C:\ProgramData\DockerDesktop

Si inspeccionas imágenes regulares, obtendrá rutas de Linux como:

$ docker inspect nginx

...
"UpperDir": "/var/lib/docker/overlay2/585...9eb/diff"
...

Puedes conectarte con la imagen virtual mediante:

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -i sh

Luego, puedes ir a la localización referenciada:

$ cd /var/lib/docker/overlay2/585...9eb/
$ ls -lah

drwx------    4 root     root        4.0K Feb  6 06:56 .
drwx------   13 root     root        4.0K Feb  6 09:17 ..
drwxr-xr-x    3 root     root        4.0K Feb  6 06:56 diff
-rw-r--r--    1 root     root          26 Feb  6 06:56 link
-rw-r--r--    1 root     root          57 Feb  6 06:56 lower
drwx------    2 root     root        4.0K Feb  6 06:56 work

La estructura interna de una carpeta de raíz de Docker

En el interior de /var/lib/docker se almacena diferente información. Por ejemplo, datos para contenedor, volúmenes, compilaciones, redes y clústeres.

$ ls -la /var/lib/docker

total 152
drwx--x--x   15 root     root          4096 Feb  1 13:09 .
drwxr-xr-x   13 root     root          4096 Aug  1  2019 ..
drwx------    2 root     root          4096 May 20  2019 builder
drwx------    4 root     root          4096 May 20  2019 buildkit
drwx------    3 root     root          4096 May 20  2019 containerd
drwx------    2 root     root         12288 Feb  3 19:35 containers
drwx------    3 root     root          4096 May 20  2019 image
drwxr-x---    3 root     root          4096 May 20  2019 network
drwx------    6 root     root         77824 Feb  3 19:37 overlay2
drwx------    4 root     root          4096 May 20  2019 plugins
drwx------    2 root     root          4096 Feb  1 13:09 runtimes
drwx------    2 root     root          4096 May 20  2019 swarm
drwx------    2 root     root          4096 Feb  3 19:37 tmp
drwx------    2 root     root          4096 May 20  2019 trust
drwx------   15 root     root         12288 Feb  3 19:35 volumes

Imágenes en Docker

Los contenidos más pesados son, a menudo, las imágenes. Si usas la superposición del controlador de almacenamiento predeterminado, tus imágenes de Docker se almacenarán en /var/lib/docker/overlay2.

Allí, podrás encontrar diferentes archivos que representan capas de solo lectura de una imagen de Docker y una capa superior que contiene sus cambios.
Exploremos el contenido usando un ejemplo:

$ docker image pull nginx
$ docker image inspect nginx

[
    {
        "Id": "sha256:207...6e1",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:ad5...c6f"
        ],
        "Parent": "",
 ...
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 126698063,
        "VirtualSize": 126698063,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/585...9eb/diff:
                             /var/lib/docker/overlay2/585...9eb/diff",
                "MergedDir": "/var/lib/docker/overlay2/585...9eb/merged",
                "UpperDir": "/var/lib/docker/overlay2/585...9eb/diff",
                "WorkDir": "/var/lib/docker/overlay2/585...9eb/work"
            },
...

LowerDir contiene las capas de solo lectura de una imagen. La capa de lectura y escritura que representa los cambios es parte de UpperDir. En este caso, la carpeta NGINX UpperDir contiene los archivos de registro:

$ ls -la /var/lib/docker/overlay2/585...9eb/diff

total 8
drwxr-xr-x    2 root     root    4096 Feb  2 08:06 .
drwxr-xr-x    3 root     root    4096 Feb  2 08:06 ..
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 access.log -> /dev/stdout
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 error.log -> /dev/stderr

MergedDir representa el resultado de UpperDir y LowerDir que utiliza Docker para ejecutar el contenedor. WorkDir es un directorio interno para overlay2 y debe estar vacío.

Volúmenes en Docker

Es posible agregar un almacenamiento persistente a los contenedores para conservar los datos durante más tiempo del que existe en el contenedor o para compartir el volumen con el host o con otros contenedores. Un contenedor se puede iniciar con un volumen usando la opción -v:

$ docker run --name nginx_container -v /var/log nginx

Podemos obtener información sobre la ubicación del volumen conectado mediante:

$ docker inspect nginx_container

...
"Mounts": [
            {
                "Type": "volume",
                "Name": "1e4...d9c",
                "Source": "/var/lib/docker/volumes/1e4...d9c/_data",
                "Destination": "/var/log",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...

El directorio al que se hace referencia contiene archivos de la ubicación /var/log del contenedor NGINX.

$ ls -lah /var/lib/docker/volumes/1e4...d9c/_data

total 88
drwxr-xr-x    4 root     root        4.0K Feb  3 21:02 .
drwxr-xr-x    3 root     root        4.0K Feb  3 21:02 ..
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 apt
-rw-rw----    1 root     43             0 Jan 30 00:00 btmp
-rw-r--r--    1 root     root       34.7K Feb  2 08:06 dpkg.log
-rw-r--r--    1 root     root        3.2K Feb  2 08:06 faillog
-rw-rw-r--    1 root     43         29.1K Feb  2 08:06 lastlog
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 nginx
-rw-rw-r--    1 root     43             0 Jan 30 00:00 w

Limpiar el espacio utilizado por Docker

Se recomienda utilizar el comando Docker para limpiar los contenedores no utilizados. El contenedor, las redes, las imágenes y la caché de compilación se pueden limpiar ejecutando:

$ docker system prune -a

Además, también puede eliminar volúmenes no utilizados ejecutando:

$ docker volumes prune

Resumen

Docker es una parte importante de los entornos y herramientas de muchas personas. A veces, Docker se siente un poco mágico al resolver problemas de una manera muy inteligente sin decirle al usuario cómo se hacen las cosas detrás de escena. Aun así, Docker es una herramienta común que almacena sus partes pesadas en ubicaciones que se pueden abrir y cambiar.

A veces, el almacenamiento puede llenarse rápidamente. Por lo tanto, es útil inspeccionar su carpeta raíz, pero no se recomienda eliminar o cambiar ningún archivo manualmente. En su lugar, los comandos de poda se pueden utilizar para liberar espacio en disco.

Espero que hayas disfrutado el artículo. Si te gusta y sientes la necesidad de un aplauso, sígueme en Twitter. Trabajo en eBay Kleinanzeigen, una de las mayores empresas de anuncios clasificados del mundo. Por cierto, ¡estamos contratando!

Feliz exploración de Docker :)

Referencias

Documentación del Storage Diver de Docker:
https://docs.docker.com/storage/storagedriver/

Sistema de archivos de superposición de documentación
https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt