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