Docker utiliza dos tipos de formatos para representar procesos en ejecución:imágenes y contenedores, y ambos almacenan datos en el disco de su computadora. Hablaremos sobre los comandos que proporciona Docker para manejar datos y cómo puede usarlos para acceder a archivos de imágenes y contenedores.
La diferencia entre imágenes y contenedores
Las imágenes son lo que creas cuando ejecutas docker build
; se almacenan en un registro de contenedor como Docker Hub y contienen todos los archivos y el código para ejecutar una aplicación. Puede pensar en ellos como archivos ISO para un sistema operativo de máquina virtual.
Los contenedores se crean a partir de imágenes y son como la máquina virtual real que ejecuta la aplicación. Es posible que tenga varios contenedores ejecutándose en paralelo a partir de la misma imagen. Cada contenedor tendrá su propio sistema de archivos, creado opcionalmente con "montajes de volumen" que vinculan datos del host al contenedor.
Trabajar con el almacenamiento de imágenes de Docker
Las imágenes almacenan todo el contenido de la imagen en su disco. Cada vez que extrae una imagen de Internet, se descarga y almacena, generalmente para siempre. Las imágenes pueden ser muy grandes, por lo que pueden acumularse con el tiempo, especialmente en el caso de portátiles con almacenamiento limitado.
Si desea acceder a los datos de la imagen directamente, generalmente se almacenan en las siguientes ubicaciones:
- Linux:
/var/lib/docker/
- Windows:
C:ProgramDataDockerDesktop
- macOS:
~/Library/Containers/com.docker.docker/Data/vms/0/
Sin embargo, tocar estos datos probablemente sea una mala idea. . El almacenamiento de Docker es complicado y, en realidad, varía enormemente según el controlador de almacenamiento que esté utilizando. Linux ahora tiene por defecto overlay2
en la mayoría de las distribuciones, que ni siquiera es accesible para la mayoría de los usuarios finales. Jugar con esto puede conducir a la pérdida de datos.
En cambio, Docker proporciona comandos administrados para manejar imágenes. Puede ver todas las versiones de las imágenes descargadas con un simple comando:
docker image ls
Afortunadamente, no es tan malo como parece, ya que las imágenes de Docker almacenan versiones de forma incremental. Eso significa que cada vez que descarga una nueva versión, solo reemplaza las partes que se cambiaron. Si usa con frecuencia la misma imagen una y otra vez, es probable que no acumule demasiados costos de almacenamiento.
Sin embargo, si usa muchas imágenes diferentes, es posible que tenga muchas imágenes guardadas que ya no se usan. Para limpiarlos, Docker proporciona un comando integrado para ejecutar la recolección de elementos no utilizados. Esto eliminará todas las imágenes que no tengan referencias, es decir, que no estén etiquetadas o referenciadas por ningún contenedor.
docker image prune
Para eliminar todas las imágenes antiguas no utilizadas por los contenedores existentes, ejecútelo con -a
bandera:
docker image prune -a
Eso cubre el caso de uso principal, pero hay algunos comandos más útiles:
inspect
:muestra información sobre la versión de un contenedor.save & load
:guarda y carga imágenes en untar
archivo.rm
:elimina una imagen directamente.pull/push
:actualizaciones desde un registro remoto.history
:proporciona un registro de cambios.
Trabajar con almacenamiento de contenedores Docker
Puede ver toda la información sobre un contenedor con docker inspect
, que muestra los controladores y los datos del sistema de archivos, así como todos los montajes y volúmenes existentes.
docker inspect containerID
Los contenedores almacenan datos de dos maneras. Primero está el sistema de archivos base, que se copia de la imagen y es único para cada contenedor. Docker usa un "directorio inferior" y un "directorio superior", que son capas separadas que se fusionan en un sistema de archivos híbrido. El directorio inferior almacena los datos de la imagen base y el directorio superior almacena todo lo que se modificó durante el tiempo de ejecución, como los archivos de registro. En cualquier caso, el almacenamiento de estos depende del controlador del sistema de archivos que Docker esté configurado para usar.
Luego, hay monturas , que vinculan directorios desde el host al contenedor, generalmente administrados automáticamente con una función de Docker llamada volúmenes. Estos se almacenan normalmente y son accesibles para los usuarios finales. Si está realizando algún trabajo que requiera que modifique datos en contenedores en ejecución, probablemente debería modificar un volumen o un montaje de enlace.
Acceso a volúmenes
Se puede acceder directamente a los montajes de enlace y son una excelente opción si desea almacenar la configuración que se usa para muchos contenedores o almacenar datos accesibles que persisten a través de los reinicios del contenedor.
Si desea modificar los datos almacenados en volúmenes, también puede hacerlo. Se almacenan en un formato estándar accesible desde Linux:
/var/lib/docker/volumes/volumeID/_data
Puede obtener el ID del volumen y la información con docker volume inspect
.
Al igual que las imágenes, los volúmenes también pueden volverse obsoletos. Puede eliminarlos fácilmente, pero hacer una copia de seguridad y transferirlos es un proceso más complicado.
docker volume prune docker volume rm volumeID
Modificación del sistema de archivos de un contenedor Docker
Si desea modificar el sistema de archivos del contenedor, al igual que las imágenes, esta es una mala idea. En la mayoría de los casos, debe crear una nueva versión del contenedor con los cambios actualizados e implementar una actualización.
Sin embargo, si desea realizar algunos cambios rápidos sin detener el contenedor, la mejor manera es simplemente abrir un bash shell dentro del contenedor y modificarlo a través de Docker. Hacerlo es muy fácil:ejecute docker exec
en el contenedor y pase "bash" como el comando:
docker exec -it container bash
Desde aquí, puede usar los comandos normales de Linux. Si desea hacer esto de forma remota, puede instalar un servidor SSH en su contenedor y vincular el puerto 22 a otro puerto en el host.
RELACIONADO: Cómo usar SSH en un contenedor Docker