How do I create and manage volumes in Docker?

Crear y gestionar volúmenes en Docker es esencial para el almacenamiento persistente de datos. Utiliza `docker volume create` para configurar un volumen y `docker run -v` para adjuntarlo a un contenedor.
Índice
Cómo crear y administrar volúmenes en DockerLos volúmenes son la forma preferida de persistir datos en Docker. Son completamente administrados por Docker y tienen varias ventajas sobre los montajes de enlace:- Los volúmenes son más fáciles de hacer copias de seguridad o migrar que los montajes de enlace.- Puedes administrar volúmenes usando comandos de la CLI de Docker o la API de Docker.- Los volúmenes funcionan en Linux y Windows.- Los volúmenes se pueden compartir de forma más segura entre múltiples contenedores.- Los volúmenes permiten almacenar datos en hosts remotos o en proveedores de nube, cifrar el contenido de los volúmenes y agregar otras funcionalidades.- Los volúmenes permiten que nuevos volúmenes tengan su contenido prellenado por un contenedor.Además, los volúmenes son a menudo una mejor opción que persistir datos en el sistema de archivos de un contenedor, ya que los volúmenes son independientes del ciclo de vida del contenedor. Docker por lo tanto nunca destruye automáticamente los volúmenes cuando eliminas un contenedor, tampoco "purga" ningún dato dentro de un volumen cuando un contenedor no está conectado a él.Este artículo te guía a través de algunas tareas básicas de volumen, como crear volúmenes, usar volúmenes en contenedores y usar volúmenes con servicios de Docker.Nota: Los volúmenes de Docker también se utilizan a veces en Docker Desktop para compartir datos entre el host y el contenedor.Crear un volumenPuedes crear un volumen explícitamente usando el comando docker volume create, o Docker puede crear un volumen durante la ejecución de un contenedor.Crea un volumen:$ docker volume create my-volEnumera los volúmenes:$ docker volume lsInspecciona un volumen:$ docker volume inspect my-volElimina un volumen:$ docker volume rm my-volInicia un contenedor con un volumenSi inicias un contenedor que crea un nuevo volumen, y la marca -v o --volume se usa para montar un directorio vacío en el contenedor, el directorio vacío se llena con un contenido predeterminado proporcionado por la imagen.Por ejemplo, este comando inicia un contenedor de Ubuntu y carga el volumen /app en el contenedor.$ docker run -d \  -it \  --name devtest \  --mount source=myvol2,target=/app \  ubuntuUsa docker inspect devtest para verificar que el volumen se creó y montó correctamente. Busca la sección Montajes."Mounts": [    {        "Type": "volume",        "Name": "myvol2",        "Source": "/var/lib/docker/volumes/myvol2/_data",        "Destination": "/app",        "Driver": "local",        "Mode": "",        "RW": true,        "Propagation": ""    }]Detén el contenedor y elimínalo. El volumen no se elimina automáticamente. Puedes eliminar el volumen usando docker volume rm.$ docker container stop devtest$ docker container rm devtest$ docker volume rm myvol2Inicia un servicio con volúmenesCuando inicias un servicio y defines un volumen, cada contenedor de servicio usa su propio volumen local. Ningún contenedor de servicio puede compartir este volumen. Cuando el servicio se escala a múltiples nodos, cada nodo obtiene su propio volumen.Cuando usas un volumen nombrado, Docker replica el volumen en todos los nodos que ejecutan el servicio.Este ejemplo inicia un servicio nginx con cuatro réplicas, cada una de las cuales usa un volumen local llamado myvol2.$ docker service create -d \  --replicas=4 \  --name devtest-service \  --mount source=myvol2,target=/app \  nginx:latestUsa docker service ps devtest-service para verificar que el servicio se está ejecutando:$ docker service ps devtest-serviceElimina el servicio, que detiene todos sus tareas:$ docker service rm devtest-serviceElimina el volumen:$ docker volume rm myvol2Eliminación de volúmenesUn volumen no se elimina automáticamente cuando eliminas un contenedor, ni cuando eliminas un servicio. Para eliminar un volumen, usa el comando docker volume rm.Antes de eliminar un volumen, debes desmontarlo de cualquier contenedor.En situaciones donde primero necesitas desmontar un volumen utilizado por un contenedor, usa docker inspect para encontrar el nombre del contenedor y luego usa docker volume rm.$ docker volume rm volume_namePara eliminar volúmenes no utilizados, usa:$ docker volume prune

Cómo crear y gestionar volúmenes en Docker

Docker has revolutionized the way developers build, ship, and run applications. One of its core features is the ability to manage data effectively through the use of volumes. In this article, we’ll delve into the concepts of Docker volumes, how to create and manage them, and best practices for using them in your containerized applications.

Understanding Docker Volumes

Before we jump into the how-to’s, let’s clarify what Docker volumes are. In simple terms, a volume is a persistent data storage mechanism that exists outside the lifecycle of a Docker container. Unlike the container filesystem, which is ephemeral and built from the image, volumes remain intact even when containers are removed or updated. This characteristic makes volumes ideal for storing application data, configurations, and databases.

Key Characteristics of Docker Volumes:

  1. Persistencia: Los volúmenes son persistentes y pueden sobrevivir a los contenedores que los utilizan.
  2. PerformanceLos volúmenes proporcionan un mejor rendimiento para las operaciones de lectura y escritura en comparación con guardar datos directamente en el sistema de archivos del contenedor.
  3. GestiónLos volúmenes se pueden administrar utilizando comandos de Docker y se pueden respaldar y migrar más fácilmente.
  4. Compartir: Volumes can be shared among multiple containers, allowing for flexibility in multi-container applications.

Tipos de almacenamiento en Docker

Docker ofrece diferentes opciones de almacenamiento, cada una con sus casos de uso:- **Volumes**: Son la opción preferida para el almacenamiento persistente de datos. Los volúmenes son gestionados por Docker y se almacenan en una parte del sistema de archivos del host que está gestionada por Docker (`/var/lib/docker/volumes/` en Linux). Los volúmenes son independientes del ciclo de vida del contenedor y pueden ser compartidos entre contenedores. Son fáciles de respaldar, migrar y administrar.- **Bind mounts**: Permiten montar un archivo o directorio del host en el contenedor. A diferencia de los volúmenes, los bind mounts pueden apuntar a cualquier directorio del host. Son útiles cuando se necesita acceder a archivos específicos del host desde el contenedor, como por ejemplo, montar un directorio de código fuente para desarrollo.- **tmpfs mounts**: Almacenan los datos en la memoria volátil (RAM) del host en lugar de escribirlos en el sistema de archivos. Los datos en un tmpfs mount existen solo mientras el contenedor está en ejecución y se pierden cuando el contenedor se detiene. Son útiles para almacenar datos temporales que no necesitan persistir, como cachés o archivos de sesión.- **Named pipes**: En Windows, Docker puede usar named pipes para la comunicación entre el contenedor y el host. Un named pipe es un objeto del sistema que representa una conexión de comunicación entre procesos.La elección de la opción de almacenamiento depende de los requisitos específicos de la aplicación. Los volúmenes son generalmente la opción más versátil y recomendada para la mayoría de los casos de uso.

  • Volumes: Managed by Docker, volumes are the preferred way to persist data.
  • Montajes de EnlaceLos montajes de enlace son el método original de Docker para montar volúmenes en contenedores. A diferencia de los volúmenes, los montajes de enlace pueden apuntar a cualquier carpeta del sistema host. Esto significa que no requieren que el directorio exista previamente en el contenedor.Los montajes de enlace son menos manejables que los volúmenes, ya que se refieren directamente a una ruta del sistema host. Esto puede causar problemas de portabilidad si la ruta no existe en el host de destino. Además, los montajes de enlace no son tan eficientes como los volúmenes en términos de rendimiento de E/S.Para crear un montaje de enlace, se utiliza la opción -v o --mount al ejecutar un contenedor. Por ejemplo:``` docker run -v /ruta/host:/ruta/contenedor imagen ```O utilizando la sintaxis --mount:``` docker run --mount type=bind,source=/ruta/host,target=/ruta/contenedor imagen ```En ambos casos, la carpeta /ruta/host del sistema host se montará en /ruta/contenedor dentro del contenedor.Es importante tener en cuenta que los montajes de enlace no son la opción recomendada para la mayoría de los casos de uso. Los volúmenes ofrecen más funcionalidades y son más portátiles. Sin embargo, los montajes de enlace pueden ser útiles en situaciones específicas, como cuando se necesita acceder a archivos del sistema host desde el contenedor.Estos permiten especificar una ruta en el sistema de archivos del host que se montará en el contenedor. Son menos portátiles y pueden generar problemas de compatibilidad debido a diferencias en los entornos.
  • tmpfs Mounts: These are temporary storage solutions stored in memory. They are fast but short-lived, disappearing when the container stops.

In this article, we will focus primarily on volumes and how to create and manage them effectively.

Creating Docker Volumes

Creating a Docker volume is straightforward. You can do this using the docker volume create comando.

Ejemplo de Crear un Volumen:

docker volume create my_volume

Este comando crea un nuevo volumen llamado my_volume. Se puede verificar su creación mediante:

docker volume ls

Esto enumerará todos los volúmenes disponibles, incluyendo my_volume.

Properties of a Volume

You can inspect a volume to see its details:

docker volume inspeccionar mi_volumen

Este comando proporciona información como el controlador de volumen, el punto de montaje y otros metadatos.

Uso de volúmenes de Docker con contenedoresLos volúmenes de Docker son una característica poderosa que permite persistir datos generados y utilizados por los contenedores Docker. A diferencia de los sistemas de archivos efímeros de los contenedores, los volúmenes proporcionan una forma de almacenar datos fuera del ciclo de vida del contenedor, lo que los hace ideales para bases de datos, archivos de configuración y otros datos importantes que deben sobrevivir a la eliminación de un contenedor.Tipos de volúmenes1. Volúmenes nombrados: Son volúmenes gestionados por Docker que se crean y gestionan mediante el comando docker volume. Tienen un nombre único y pueden ser reutilizados por múltiples contenedores.2. Volúmenes de host: Son directorios del sistema de archivos del host que se montan en el contenedor. Proporcionan una forma de compartir archivos entre el host y el contenedor.3. Volúmenes anónimos: Son volúmenes temporales que se crean automáticamente cuando se inicia un contenedor y se eliminan cuando se detiene. No tienen un nombre específico y no se pueden reutilizar.Creación y gestión de volúmenesPara crear un volumen nombrado, utiliza el siguiente comando:``` docker volume create mi-volumen ```Para ver una lista de todos los volúmenes disponibles, ejecuta:``` docker volume ls ```Para inspeccionar un volumen específico, utiliza:``` docker volume inspect mi-volumen ```Para eliminar un volumen, usa:``` docker volume rm mi-volumen ```Montaje de volúmenes en contenedoresPara montar un volumen en un contenedor, utiliza la opción -v o --volume al ejecutar el comando docker run. Por ejemplo:``` docker run -d -v mi-volumen:/app/data nginx ```En este ejemplo, el volumen "mi-volumen" se monta en el directorio /app/data dentro del contenedor nginx.Para montar un volumen de host, especifica la ruta completa del directorio del host seguido de dos puntos y la ruta del contenedor:``` docker run -d -v /ruta/del/host:/app/data nginx ```Uso de volúmenes en docker-composeEn un archivo docker-compose.yml, puedes definir volúmenes utilizando la sección volumes. Por ejemplo:```yaml version: '3' services: web: image: nginx volumes: - mi-volumen:/app/data - /ruta/del/host:/app/config volumes: mi-volumen: ```En este ejemplo, se montan dos volúmenes en el servicio web: un volumen nombrado "mi-volumen" y un volumen de host "/ruta/del/host".Prácticas recomendadas1. Utiliza volúmenes nombrados para datos que deben persistir entre contenedores y reinicios.2. Utiliza volúmenes de host para compartir archivos entre el host y el contenedor, o para acceder a archivos del host desde el contenedor.3. Evita almacenar datos de aplicación en el sistema de archivos del contenedor, ya que se perderán cuando se elimine el contenedor.4. Utiliza etiquetas descriptivas para los volúmenes para facilitar su identificación y gestión.5. Realiza copias de seguridad periódicas de los datos almacenados en volúmenes importantes.6. Utiliza volúmenes para separar los datos de la aplicación del código de la aplicación, lo que facilita la actualización y el escalado de la aplicación.ConclusiónLos volúmenes de Docker son una herramienta esencial para gestionar datos persistentes en entornos de contenedores. Al comprender los diferentes tipos de volúmenes y cómo utilizarlos correctamente, puedes asegurarte de que tus aplicaciones Docker sean escalables, fiables y fáciles de mantener.

Once a volume is created, you can use it in your containers. You can either mount it as a volume or as a bind mount.

Montar un volumen en un contenedor

To mount a volume when creating a new container, use the -v or --montaje flag. Here’s how to do it with both methods:

Usando -v Bandera:

docker run -d --name mi_contenedor -v mi_volumen:/datos mi_imagen

En este comando:

  • - ejecuta el contenedor en modo desatendido.
  • --name my_container asigna un nombre al contenedor.
  • -m my_volume:/data monta el volumen en el /data ruta en el contenedor.
  • Tu imagen ha sido procesada. ¿Hay algo específico que te gustaría hacer con ella? es el nombre de tu imagen de Docker.

Usando --montaje Bandera:

El --montaje La bandera ofrece opciones más detalladas pero es ligeramente más prolija:

docker run -d --name my_container --mount source=my_volume,target=/data my_image

En este caso, fuente especifica el volumen y objetivo specifies the mount path in the container.

Managing Docker Volumes

La gestión eficiente de los volúmenes es crucial para mantener la estabilidad y el rendimiento de las aplicaciones. Aquí hay algunos comandos y prácticas que puede emplear.

Listing Volumes

Para ver todos los volúmenes, puedes ejecutar:

docker volume ls

Eliminación de volúmenes no utilizadosVolumes that are no longer referenced by any containers are considered to be "dangling". They can be located with the following command:docker volume ls -f dangling=trueTo remove all of these volumes, you can use the filter flag with the docker volume prune command:docker volume pruneIf you only want to remove some of the dangling volumes, provide a comma-separated list of volume names following the command. For example:docker volume prune my_volume,volume_1,volume_2If you attempt to remove volumes that are in use by containers, you will receive an error message similar to the following:Error response from daemon: remove my_volume: volume is in use - [9792fa7b1ea8]

Over time, unused volumes may accumulate and consume disk space. To remove unused volumes, you can use:

limpiar volúmenes no utilizados

Tenga cuidado con este comando, ya que eliminará todos los volúmenes no utilizados.

Eliminación de un Volumen Específico

If you want to remove a specific volume, use:

docker volume rm my_volume

You must ensure that no containers are using the volume, or the command will fail.

Backing Up and Restoring Volumes

Realizar copias de seguridad de los datos de un volumen es crucial para la recuperación ante desastres. Un método común consiste en crear un contenedor temporal que monte el volumen y copie los datos en un archivo tar.

Comando de Copia de Seguridad:

docker run --rm -v my_volume:/data -v $(pwd):/backup busybox tar czf /backup/backup.tar.gz -C /data .

This command does the following:

  • Runs a temporary busybox container.
  • Monta el my_volume a /data.
  • Mounts the current directory to /backup.
  • Crea un archivo comprimido del contenido del volumen.

Restore Command:

To restore the data from the backup, you can use:

docker run --rm -v my_volume:/data -v $(pwd):/backup busybox sh -c "cd /data && tar xzf /backup/backup.tar.gz"

Este comando extrae los contenidos del archivo de respaldo en el volumen.

Mejores Prácticas para Usar Volúmenes de Docker

Using Docker volumes effectively involves adhering to best practices. Here are some guidelines:

1. Utilice volúmenes con nombre

Los volúmenes nombrados son más portátiles que el uso de rutas absolutas. Permiten cambiar la estructura de archivos del host sin romper la funcionalidad del contenedor. Siempre prefiera los volúmenes nombrados sobre los montajes de enlace, especialmente en producción.

2. Organize Volumes

If your application uses multiple volumes, consider using a consistent naming convention that reflects the purpose of the volume. This practice makes it easier to manage and understand what each volume is for.

3. Monitorear el Uso del Volumen

Regularly check your volumes and their usage to avoid running out of disk space. Using commands like docker volume ls ayudará a mantener el control de lo que aún está en uso y lo que se puede podar.

4. Garantizar la integridad de los datos

When dealing with critical data, always implement backup and restore strategies. Regularly back up your volumes, especially for databases and important stateful applications.

5. Utiliza soluciones de almacenamiento externoSi tu computadora se está quedando sin espacio de almacenamiento, considera usar soluciones de almacenamiento externo como discos duros externos o unidades USB. Estos dispositivos pueden proporcionar espacio adicional para tus archivos y programas, liberando espacio en tu disco duro interno. Además, puedes usar servicios de almacenamiento en la nube como Google Drive o Dropbox para almacenar tus archivos en línea y acceder a ellos desde cualquier lugar.

For applications requiring high availability and redundancy, consider using external storage solutions such as cloud storage or network file systems (NFS). Docker supports various volume drivers that interface with external storage.

Conclusión

Docker volumes are an essential feature for managing persistent data in containerized applications. They provide a way to ensure data persists beyond the lifecycle of individual containers, improve performance, and maintain flexibility in multi-container architectures. By understanding how to create, manage, and optimize volumes, you can enhance the reliability and scalability of your applications.

Incorporating these best practices and understanding the nuances of volume management will not only help you avoid potential pitfalls but also empower you to build robust, stateful applications in Docker. Whether you are a developer, system administrator, or DevOps engineer, mastering Docker volumes is a skill worth investing in for your containerized workloads.