# 5.2.- Almacenamiento en Docker.

pixabay.com. Server Storage (CC BY)

Docker ofrece varias opciones para el almacenamiento y la persistencia de datos, lo que es crucial para la mayoría de las aplicaciones. Veamos paso a paso como funciona para entender estos conceptos y los principales comandos asociados a la administración del almacenamiento.

Por defecto, todos los archivos que se crean dentro de un contenedor se almacenan en la última capa del sistema de archivos (la capa de lectura/escritura), esto quiere decir que los datos que tenemos en esta capa se perderán cuando el contenedor se elimine y no podremos compartirlos con otros contenedores.

Docker nos ofrece tres posibilidades para implementar persistencia de datos en los contenedores:

- Bind mounts
- Volumes
- tmpfs mounts

#### Bind mounts

Los bind mounts son básicamente montajes de directorios (o archivos) de la máquina host directamente en el contenedor. A diferencia de los volúmenes, los bind mounts dependen de la estructura del sistema de archivos del host.

Para utilizar un bind mount, puedes usar la opción -v o --mount en el comando docker run.

    docker run -d -v /path/on/host:/path/in/container my-image

Retomemos el ejercicio resuelto del punto 5.1 del anexo donde teníamos dos contenedores (httpd y mysql) interconectados dentro de la misma red. En este punto, vamos a añadir un bind mount para que el contenedor apache-container para cargar los archivos de la web en la ruta /var/www/html del contenedor.

## Modificamos docker run

Añadimos el flag e indicamos el bind mount concreto para añadir la persistencia de datos a nuestro contenedor del servidor web.

    docker run -d \
    --rm \
    --name apache-container \
    -p 8080:80 \
    -v $(pwd):/var/www/html \
    httpd:latest

En este comando, -v $(pwd):/var/www/html indica que se debe montar el directorio actual del host (representado por $(pwd)) en el directorio /var/www/html dentro del contenedor. Cualquier cambio realizado en el directorio /var/www/html del contenedor se reflejará en el directorio actual del host, y viceversa.

Esto es útil para el desarrollo, ya que permite ver y editar los archivos de la aplicación directamente desde el sistema host.

#### Volúmenes (Volumes)

Los volúmenes son la opción preferida para persistir los datos generados y utilizados por los contenedores Docker. Son completamente gestionados por Docker y viven en la máquina host. Los volúmenes son fáciles de respaldar o migrar.

Para crear un volumen, puedes usar el comando docker volume create.

    docker volume create myvolume

Para listar todos los volúmenes, puedes usar el comando docker volume ls.

    docker volume ls

Para utilizar un volumen, puedes usar la opción -v o --mount en el comando docker run.

    docker run -d -v myvolume:/path/in/container my-image

Retomemos el ejercicio resuelto del punto 5.1 del anexo donde teníamos dos contenedores (httpd y mysql) interconectados dentro de la misma red. En este punto, vamos a añadir un volumen para la persistencia de datos de nuestro contenedor mysql-container.

## Creamos el volumen

    docker volume create mysql-data

## Modificamos docker run

Añadimos el flag e indicamos el volumen concreto para añadir la persistencia de datos a nuestro contenedor de MySQL Server.

    docker run -d \
    --network my_bridge_network \
    --name mysql-container \
    -e MYSQL_ROOT_PASSWORD=root \
    -p 3306:3306 \
    -v mysql-data:/var/lib/mysql \
    mysql/mysql-server:8.0

En este comando, -v mysql-data:/var/lib/mysql indica que se debe montar el volumen mysql-data en el directorio /var/lib/mysql dentro del contenedor. El directorio /var/lib/mysql es donde MySQL almacena los datos por defecto.

Si el volumen mysql-data no existe, Docker lo creará automáticamente. Ahora, cualquier dato que MySQL escriba en /var/lib/mysql se almacenará en el volumen mysql-data y persistirá a través de las paradas y reinicios del contenedor.

#### tmpfs mounts

Los tmpfs mounts son almacenamientos temporales creados en la memoria del host y nunca se escriben en el sistema de archivos del host. Son útiles para casos de uso sensibles al rendimiento y a la latencia.

Para utilizar un tmpfs mount, puedes usar la opción --tmpfs en el comando docker run.

    docker run -d --tmpfs /path/in/container my-image

# Debes conocer

Es importante mencionar que cada opción de almacenamiento tiene sus propios casos de uso y limitaciones. Los volúmenes son la opción más segura y versátil para la mayoría de las aplicaciones, mientras que los bind mounts y tmpfs mounts pueden ser útiles para casos de uso más específicos.

# Autoevaluación

# Pregunta 1

Cuando se utiliza la opción -v o --volume en el comando docker run, se está creando un bind mount que vincula un directorio del host con un directorio del contenedor, y cualquier cambio realizado en el directorio del contenedor se reflejará en el directorio del host.

Verdadero Falso

# Retroalimentación

Verdadero

Al usar la opción -v o --volume en el comando docker run, se crea un bind mount que vincula un directorio del sistema host con un directorio del contenedor. Cualquier cambio realizado en el directorio del contenedor se reflejará en el directorio del host, y viceversa.

# Pregunta 2

Si se elimina un contenedor que tiene asociado un volumen, los datos del volumen también se eliminarán automáticamente.

Verdadero Falso

# Retroalimentación

Falso

Los datos en un volumen persisten incluso después de que el contenedor se ha eliminado. Este es uno de los beneficios de usar volúmenes para la persistencia de datos en Docker. A menos que se elimine explícitamente el volumen, los datos permanecerán.

Creado con eXeLearning (Ventana nueva)