Gestión de Volúmenes en Docker

DockerBeginner
Practicar Ahora

Introducción

En este apartado exploraremos el uso de los volúmenes, que son los mecanismos de Docker para gestionar el almacenamiento persistente de datos. Conocerás las propiedades fundamentales de estos almacenes, comprendiendo las diferencias entre volúmenes internos y externos, así como los escenarios ideales para implementar cada uno.

Gestión de Volúmenes de Datos

El uso de volúmenes de datos es la operación estándar para garantizar la persistencia de la información en Docker. En esta sección, pondremos en práctica las operaciones habituales para administrar estos volúmenes.

Objetivo

Tu meta es crear un volumen de datos llamado my-vol utilizando los comandos de docker y añadir un archivo denominado test.txt dentro de dicho volumen.

Ejemplo de Resultado

A continuación, se muestra un ejemplo de lo que deberías lograr al finalizar este desafío:

  1. Crear un volumen de datos llamado my-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
  1. Obtener el punto de montaje (Mountpoint) consultando los detalles del volumen.
[
  {
    "CreatedAt": "2024-01-20T17:37:33+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
    "Name": "my-vol",
    "Options": {},
    "Scope": "local"
  }
]
  1. Acceder al Mountpoint y crear el archivo test.txt.
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## pwd
/var/lib/docker/volumes/my-vol/_data
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## ls
test.txt

Requisitos

Para completar este desafío, necesitarás:

  • Saber cómo crear un volumen de datos con el comando docker.
  • Crear un archivo utilizando el usuario root.
  • Cambiar al usuario root mediante sudo su y configurar la contraseña del usuario root con sudo passwd root.

Creación de Contenedores con Volúmenes de Datos

En esta sección, crearemos contenedores vinculados a volúmenes de datos de Docker y realizaremos copias de archivos hacia ellos.

Objetivo

Debes crear un volumen de Docker llamado nginx-vol, iniciar un contenedor llamado nginx montando dicho volumen, y finalmente copiar el archivo /home/labex/project/index.html al interior del contenedor nginx.

Ejemplo de Resultado

Este es el resultado esperado al concluir esta etapa:

  1. Crear un volumen de datos llamado nginx-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
local     nginx-vol
  1. Crear un contenedor llamado nginx basado en la imagen oficial de nginx, montando su directorio /usr/share/nginx/html en el volumen nginx-vol.
labex:~/ $ docker ps | grep nginx
c39296aaf39e   nginx     "/docker-entrypoint.…"   35 seconds ago   Up 31 seconds   80/tcp    nginx
  1. Verificar el contenido del archivo /home/labex/project/index.html.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
  1. Confirmar que el archivo se ha copiado correctamente en el contenedor nginx.
labex:/tmp/ $ docker exec nginx cat /usr/share/nginx/html/index.html
hello world

Requisitos

Para completar este desafío, necesitarás:

  • Saber cómo crear un volumen de datos con el comando docker.
  • Conocer el procedimiento para iniciar un contenedor.
  • Saber cómo copiar archivos locales hacia el interior de los contenedores.

Creación de Contenedores con Rutas del Host (Bind Mounts)

En muchas situaciones, en lugar de usar volúmenes gestionados por Docker, es preferible utilizar directamente un directorio del sistema de archivos local para la persistencia. En esta sección, utilizaremos una ruta del host para crear contenedores.

Objetivo

Tu meta es crear un contenedor que utilice una "Ruta del Host" (Host Path), copiar el archivo /home/labex/project/nginx.txt dentro del contenedor y verificar que los archivos en el contenedor coincidan con los de la ruta del host.

Ejemplo de Resultado

Ejemplo de lo que debes lograr:

  1. Crear un directorio nginx dentro de /tmp.
labex:/tmp/ $ ls | grep nginx
nginx
  1. Iniciar el contenedor nginx-host basado en la imagen nginx, montando el directorio local /tmp/nginx en el directorio /usr/share/nginx/html del contenedor.
labex:/tmp/ $ docker ps | grep nginx-host
6fc2d40e12df   nginx     "/docker-entrypoint.…"   44 seconds ago   Up 43 seconds   80/tcp    nginx-host
  1. Comprobar los detalles específicos del montaje con el comando docker inspect.
"Mounts": [
   {
         "Type": "bind",
         "Source": "/tmp/nginx",
         "Destination": "/usr/share/nginx/html",
         "Mode": "",
         "RW": true,
         "Propagation": "rprivate"
   }
],
  1. Verificar el contenido del archivo local /home/labex/project/nginx.txt.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
  1. Copiar el archivo al contenedor y verificar su lectura desde el mismo.
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
  1. Comprobar el directorio /tmp/nginx en la máquina local para confirmar la presencia del archivo nginx.txt.
labex:nginx/ $ pwd
/tmp/nginx
labex:nginx/ $ cat nginx.txt
hello nginx

Requisitos

Para completar este desafío, necesitarás:

  • Identificar la ruta del host (Host Path) que deseas utilizar.
  • Saber ejecutar comandos dentro del contenedor para verificar el acceso a archivos o directorios.
  • Conocer cómo iniciar un contenedor vinculando una ruta del host.
  • Estar familiarizado con comandos básicos de Linux como cd, mkdir, touch, etc.

Compartir Datos entre Contenedores

En entornos de contenedores, a veces es necesario compartir información de un contenedor a otro. Existen diversas técnicas para lograrlo, y en este desafío exploraremos cómo realizar este intercambio de datos.

Objetivo

Tu objetivo es implementar el uso compartido de datos entre dos contenedores. Específicamente, usarás una ruta del host para iniciar el contenedor A, luego iniciarás un contenedor B montando los volúmenes de A, permitiendo así que ambos compartan la misma información.

Ejemplo de Resultado

Ejemplo de los pasos a seguir:

  1. Crear un directorio /tmp/share en el host local.
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
  1. Crear un contenedor llamado nginx-share (imagen nginx) y montar el directorio local /tmp/share en /usr/share/nginx/html.
labex:/tmp/ $ docker ps | grep nginx-share
216d02d94f39   nginx     "/docker-entrypoint.…"   55 seconds ago   Up 55 seconds   80/tcp    nginx-share
  1. Crear un contenedor llamado busybox-share (imagen busybox) que monte los volúmenes desde el contenedor nginx-share.
labex:/tmp/ $ docker ps | grep busy
30bf04aee681   busybox   "sh"                     43 seconds ago   Up 42 seconds             busybox-share
  1. Verificar el contenido del archivo local /home/labex/project/share.txt.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
  1. Confirmar que el archivo es accesible desde el contenedor nginx-share.
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
  1. Acceder al contenedor busybox-share para verificar que el archivo share.txt también está disponible allí.
labex:/tmp/ $ docker exec busybox-share cat /usr/share/nginx/html/share.txt
hello share

Requisitos

Para completar este desafío, necesitarás:

  • Estar familiarizado con las operaciones básicas y conceptos de los contenedores Docker.
  • Utilizar la línea de comandos de Docker para crear, ejecutar y detener contenedores.
  • Comprender el concepto y uso de los volúmenes de datos.
  • Entender cómo montar volúmenes de un contenedor en otro.
  • Manejar comandos básicos de Linux como cd, mkdir, touch, etc.

Resumen

¡Enhorabuena por completar este desafío! Si ya te sientes cómodo utilizando volúmenes de almacenamiento en contenedores, estás listo para avanzar al siguiente nivel.

✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar