Trabajando con volúmenes de Docker

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo administrar datos en contenedores de Docker utilizando volúmenes. Los volúmenes de Docker son el mecanismo preferido para persistir los datos generados y utilizados por los contenedores de Docker. Este laboratorio te guiará a través de varios aspectos de los volúmenes de Docker, incluyendo la creación, administración, compartición de datos, copia de seguridad y restauración. Al final de este laboratorio, tendrás una comprensión sólida de cómo administrar eficazmente los datos en entornos de Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/run -.-> lab-389189{{"Trabajando con volúmenes de Docker"}} docker/ls -.-> lab-389189{{"Trabajando con volúmenes de Docker"}} docker/stop -.-> lab-389189{{"Trabajando con volúmenes de Docker"}} docker/rm -.-> lab-389189{{"Trabajando con volúmenes de Docker"}} docker/exec -.-> lab-389189{{"Trabajando con volúmenes de Docker"}} docker/inspect -.-> lab-389189{{"Trabajando con volúmenes de Docker"}} docker/volume -.-> lab-389189{{"Trabajando con volúmenes de Docker"}} end

Comprender las opciones de almacenamiento de Docker

Antes de profundizar en los volúmenes de Docker, es importante entender las diferentes opciones de almacenamiento disponibles en Docker. Docker ofrece tres opciones principales para almacenar datos:

  1. Volúmenes: El mecanismo preferido para persistir datos en Docker.
  2. Montajes de enlace (Bind mounts): Conectan una ruta específica de la máquina host a un contenedor.
  3. Montajes tmpfs: Almacenan datos temporalmente en la memoria de la máquina host.

En este laboratorio, nos centraremos principalmente en los volúmenes, ya que son la opción más flexible y recomendada para administrar datos en Docker.

Comencemos listando los volúmenes actuales en su sistema:

docker volume ls

Verá una salida similar a esta:

DRIVER    VOLUME NAME
local     jenkins-data

Este comando lista todos los volúmenes de Docker en su sistema. La salida muestra el controlador de volumen (por lo general "local") y el nombre del volumen. Es posible que vea algunos volúmenes existentes, o la lista puede estar vacía si aún no ha creado ningún volumen.

No se preocupe si ve nombres de volúmenes diferentes o ningún volumen en absoluto. Esto es normal y depende de lo que haya hecho con Docker previamente en su sistema.

Crear y administrar volúmenes con nombre

Ahora, creemos un nuevo volumen con nombre. Un volumen con nombre es un volumen que creas explícitamente y le das un nombre específico. Esto facilita su referencia y administración posteriormente.

Ejecuta este comando para crear un nuevo volumen:

docker volume create my_data

Este comando crea un nuevo volumen llamado my_data. Docker se encargará de todos los detalles sobre dónde y cómo se almacena este volumen en tu sistema host.

Verifiquemos que el volumen se haya creado:

docker volume ls

Ahora deberías ver my_data en la lista de volúmenes, junto con cualquier otro volumen que ya estuviera allí.

Para obtener información más detallada sobre el volumen, podemos usar el comando inspect:

docker volume inspect my_data

Esto mostrará una salida como esta:

[
  {
    "CreatedAt": "2024-08-22T14:31:09+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
    "Name": "my_data",
    "Options": {},
    "Scope": "local"
  }
]

Esta salida nos dice varias cosas sobre nuestro volumen:

  • Cuándo se creó
  • El controlador que está utilizando (en este caso, local)
  • El punto de montaje (dónde se almacenan realmente los datos en tu sistema host)
  • El nombre que le dimos

No te preocupes si no entiendes todos estos detalles de inmediato. Las partes más importantes para nosotros son el Name y el Mountpoint.

Usar volúmenes con contenedores

Ahora que tenemos un volumen, usémoslo con un contenedor. Iniciaremos un nuevo contenedor y montaremos nuestro volumen en él.

Ejecuta este comando:

docker run -d --name my_container -v my_data:/app/data ubuntu:latest sleep infinity

Desglosemos este comando:

  • docker run: Esto le dice a Docker que ejecute un nuevo contenedor.
  • -d: Esto ejecuta el contenedor en modo desatendido (en segundo plano).
  • --name my_container: Esto le da un nombre a nuestro contenedor, lo que facilita su referencia posteriormente.
  • -v my_data:/app/data: Esto monta nuestro volumen my_data en el directorio /app/data dentro del contenedor.
  • ubuntu:latest: Esta es la imagen que estamos utilizando para nuestro contenedor.
  • sleep infinity: Este es el comando que el contenedor ejecutará. Simplemente mantiene el contenedor en ejecución indefinidamente.

Ahora nuestro contenedor está en ejecución con el volumen montado. Creemos algunos datos en el volumen:

docker exec my_container sh -c "echo 'Hello from Docker volume' > /app/data/test.txt"

Este comando hace algunas cosas:

  • docker exec: Esto nos permite ejecutar un comando en un contenedor en ejecución.
  • my_container: Este es el nombre de nuestro contenedor.
  • sh -c "...": Esto ejecuta un comando de shell dentro del contenedor.
  • El comando real crea un archivo llamado test.txt en nuestro volumen con el contenido "Hello from Docker volume".

Para verificar que los datos se hayan escrito, podemos leer el archivo:

docker exec my_container cat /app/data/test.txt

Deberías ver el mensaje "Hello from Docker volume" impreso en la consola.

Compartir datos entre contenedores

Uno de los grandes beneficios de los volúmenes de Docker es la capacidad de compartir datos entre contenedores. Creemos otro contenedor que utilice el mismo volumen:

docker run -d --name another_container -v my_data:/app/shared_data ubuntu:latest sleep infinity

Este comando es muy similar al que usamos antes, pero le estamos dando al contenedor un nombre diferente y montando el volumen en una ruta diferente dentro del contenedor.

Ahora, verifiquemos que este nuevo contenedor pueda acceder a los datos que creamos anteriormente:

docker exec another_container cat /app/shared_data/test.txt

Deberías ver el mismo mensaje "Hello from Docker volume" que escribimos antes. Esto muestra que ambos contenedores están accediendo a los mismos datos.

Agreguemos más datos desde este nuevo contenedor:

docker exec another_container sh -c "echo 'Data from another container' >> /app/shared_data/test.txt"

Este comando agrega una nueva línea al archivo test.txt.

Ahora, si verificamos el contenido del archivo desde cualquiera de los contenedores, deberíamos ver ambas líneas:

docker exec my_container cat /app/data/test.txt

Deberías ver tanto "Hello from Docker volume" como "Data from another container" en la salida.

Esto demuestra cómo se pueden usar los volúmenes de Docker para compartir datos entre contenedores, lo cual es increíblemente útil para muchas aplicaciones.

Copia de seguridad y restauración de volúmenes

Realizar copias de seguridad y restaurar volúmenes de Docker es crucial para la preservación de datos. Veamos el proceso paso a paso:

Primero, necesitamos detener y eliminar los contenedores que estaban utilizando el volumen. Esto se debe a que no podemos eliminar un volumen mientras está en uso:

docker stop my_container another_container
docker rm my_container another_container

Ahora, creemos una copia de seguridad de nuestro volumen:

docker run --rm -v my_data:/source:ro -v $(pwd):/backup ubuntu tar cvf /backup/my_data_backup.tar -C /source.

Este comando puede parecer complejo, así que desglosémoslo:

  • docker run --rm: Ejecuta un contenedor temporal y lo elimina cuando termine.
  • -v my_data:/source:ro: Monta nuestro volumen en modo solo lectura dentro del contenedor.
  • -v $(pwd):/backup: Monta el directorio actual como /backup en el contenedor.
  • ubuntu: Utiliza la imagen de Ubuntu.
  • tar cvf /backup/my_data_backup.tar -C /source.: Crea un archivo tar con los datos del volumen.

Ahora, eliminemos nuestro volumen original:

docker volume rm my_data

Para restaurar los datos, crearemos un nuevo volumen y extraeremos la copia de seguridad en él:

docker volume create my_restored_data
docker run --rm -v my_restored_data:/dest -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/my_data_backup.tar -C /dest"

Esto crea un nuevo volumen y extrae nuestra copia de seguridad en él.

Verifiquemos que los datos se hayan restaurado:

docker run --rm -v my_restored_data:/app/data ubuntu cat /app/data/test.txt

Deberías ver el contenido del archivo que creamos anteriormente.

Resumen

En este laboratorio, has aprendido cómo trabajar con volúmenes de Docker. Has creado y administrado volúmenes con nombre, utilizado volúmenes con contenedores, compartido datos entre contenedores y realizado operaciones de copia de seguridad y restauración. Estas habilidades son esenciales para una gestión eficaz de datos en entornos de Docker.

Puntos clave:

  • Los volúmenes de Docker proporcionan una forma flexible y eficiente de gestionar datos persistentes en contenedores.
  • Los volúmenes se pueden crear, inspeccionar y eliminar fácilmente utilizando comandos de la interfaz de línea de comandos (CLI) de Docker.
  • Los datos en los volúmenes se pueden compartir entre múltiples contenedores.
  • Realizar copias de seguridad y restaurar volúmenes es crucial para la preservación de datos y se puede lograr utilizando comandos estándar de Linux.

A medida que continúes trabajando con Docker, recuerda considerar la persistencia y gestión de datos como un aspecto crucial de tus aplicaciones contenerizadas. Siempre planifica la copia de seguridad y recuperación de datos, especialmente en entornos de producción.