Introducción
Docker es una plataforma de contenedores que constituye un entorno estandarizado, ligero, virtualizado, portátil y definido por software que permite que el software se ejecute de forma aislada de otro software que se ejecuta en la máquina host física. Docker es un componente definitorio del aspecto de Desarrollo e Integración Continuos del Desarrollo de Software. Al proporcionar un entorno de ejecución consistente, Docker garantiza que el software se comporte de la misma manera independientemente de la máquina host física en la que se implemente. Para un análisis detallado del ecosistema de Docker, consulte este artículo.
Aunque los contenedores de Docker son autónomos, a veces necesitan compartir el acceso a los datos o persistir los datos en el disco después de que el contenedor se detenga. Los datos pueden tener la forma de bases de datos, archivos de registro o datos generados por el usuario. Es imposible incluir dichos datos en un archivo de configuración de imagen de Docker, pero deben estar disponibles para que su aplicación funcione como se espera. El intercambio y la persistencia de datos en los contenedores de Docker se gestionan mediante Volúmenes de Docker. Los Volúmenes de Docker se pueden crear durante la creación del contenedor o crearse más tarde y adjuntarse a los contenedores. En este tutorial, analizaremos las cuatro formas diferentes de compartir datos entre contenedores.
Requisitos previos
- Configurar un servidor que ejecute Ubuntu 20.04 y Crear un usuario no raíz con privilegios sudo. Inicie sesión con el usuario no raíz para continuar con los siguientes pasos.
- Instalar Docker: tenemos un tutorial sobre Cómo instalar y operar Docker en Ubuntu, debe seguir los pasos 1, 2, 3 y 4. Esto debería funcionar para cualquier distribución de Ubuntu.
Tenga en cuenta que, aunque estamos trabajando con Ubuntu 20.04, las instrucciones y comandos para Docker funcionarán en cualquier otro sistema operativo con Docker instalado y el usuario sudo agregado al grupo docker como se explicó en los requisitos previos anteriores.
Paso 1: Crear volúmenes de Docker independientes
Comenzaremos creando volúmenes independientes que no estén relacionados con ningún contenedor de Docker. Para lograr esto, tenemos el comando docker volume create que se introdujo en la versión 1.9 de Docker. Ingrese el siguiente comando para crear un volumen llamado Step1DataVolume :
|
1 |
docker volume create --name Step1DataVolume |
Debería ver la siguiente salida que indica que la creación del volumen fue exitosa:
![]()
Ahora que tenemos un volumen independiente, podemos crear un nuevo contenedor a partir de la imagen oficial de Ubuntu como ejemplo para hacer uso de él. Ingrese el siguiente comando para crear el contenedor y adjuntar el volumen:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
En este comando, el --rm flag eliminará automáticamente el contenedor después de salir. El -v flag se utiliza para especificar y montar el volumen. El -v flag toma el nombre del volumen, dos puntos y la ruta absoluta dentro del contenedor donde debe aparecer el volumen. Tenga en cuenta que cuando se ejecuta el comando, si los directorios especificados en la ruta no existen, se crearán. Si ya existen, el volumen montado ocultará el contenido existente. Para el -ti flag, la -t da acceso a la terminal, y la -i nos permite interactuar con el contenedor a través de la terminal.
Mientras esté dentro del contenedor, ejecute el siguiente comando para escribir algunos datos en el volumen:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
Escriba exit y presione enter para salir del contenedor. Como se explicó, el contenedor se elimina automáticamente al salir, gracias al --rm flag; sin embargo, el volumen seguirá siendo accesible.
Para verificar que el volumen aún existe, puede usar el docker volume inspect comando:
|
1 |
docker volume inspect Step1DataVolume |
Debería ver la siguiente salida:

A continuación, creemos un nuevo contenedor. Primero, adjunte el volumen y vea si podemos acceder al texto que creamos en el contenedor anterior. Ingrese el siguiente comando para crear y ejecutar el contenedor usando el ubuntu imagen:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Dentro del contenedor, ejecute el siguiente comando para verificar que el archivo StepOne.txt existe:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Debería ver una salida similar:

A continuación, escriba exit y presione enter para salir del contenedor. En este paso, aprendió a manejar la persistencia de datos utilizando volúmenes de Docker independientes y cómo adjuntar volúmenes a los contenedores.
Paso 2: Creación de un volumen de Docker que persiste los datos al eliminar un contenedor
En este paso, utilizaremos un único comando para crear un volumen al mismo tiempo que creamos un contenedor. Luego eliminaremos el contenedor y adjuntaremos el volumen a un nuevo contenedor. El comando es similar al utilizado en el Paso 1, sin embargo, añadimos una flag --name, para especificar un nombre para el contenedor:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Mientras esté dentro del contenedor, ingrese el siguiente comando para escribir datos en el volumen y verificar que los datos estén allí:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
A continuación se muestra la salida de los tres comandos:

A continuación, salga del contenedor. Cuando reinicie el contenedor utilizando el siguiente comando, el volumen se adjuntará automáticamente:
|
1 |
docker start -ai Step2Container1 |
Dentro del contenedor, verifique que el volumen esté montado comprobando la existencia del archivo StepTwo.txt utilizando el comando:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Aquí está la salida:

Puede salir del contenedor ahora. Docker evita la eliminación de un volumen al que hace referencia otro contenedor. Puede intentar eliminar el volumen utilizando el comando:
|
1 |
docker volume rm Step2DataVolume |
Debería ver el mensaje de error en la salida:
![]()
Eliminemos el contenedor utilizando el id del contenedor que se muestra en la salida con el comando docker rm :
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
Reemplace el id de contenedor resaltado con el id de su contenedor que se muestra en su terminal. El comando elimina el contenedor, pero no elimina el volumen que creamos. Puede listar los volúmenes disponibles utilizando el comando docker volume ls para verificar:
|
1 |
docker volume ls |
Aquí está la salida:

Para eliminar el contenedor creado en el Paso 2, ingrese el siguiente comando:
|
1 |
docker volume rm Step2DataVolume |
En este paso, pudo crear un volumen de Docker al mismo tiempo que creaba un contenedor. Veamos cómo podemos crear un volumen a partir de un directorio existente con datos.
Paso 3: Creación de un volumen de Docker a partir de un directorio existente con datos
Si desea copiar datos en un volumen, puede crear un volumen mientras crea un contenedor y proporcionar la ruta a un directorio que contenga los datos en la imagen base. En el siguiente comando, creamos un contenedor y agregamos un volumen de datos en /var, que es un directorio que contiene datos en la imagen base:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
Cuando se ejecuta el comando, el contenido del directorio /var de la imagen base se copiará en el volumen. El volumen se puede adjuntar a un nuevo contenedor. A continuación, salga del contenedor:

Ingrese el siguiente comando para crear el contenedor, adjuntar el volumen y listar el contenido del volumen utilizando el comando ls:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
Debería ver una salida similar del comando, que es una copia del contenido del directorio /var de la imagen base ahora disponible en el Step3DataVolume:

Mientras monta el /var directorio como lo hicimos en este ejemplo puede ser poco práctico, nos ayuda a comprender que puede montar cualquier directorio creado en sus imágenes personalizadas en un volumen de Docker para que los datos estén disponibles para otros contenedores.
Paso 4: Compartir datos entre múltiples contenedores de Docker
En la mayoría de los casos, querrá que múltiples contenedores accedan a los datos de un volumen de Docker. En los ejemplos anteriores, solo hemos adjuntado un volumen a un contenedor. Ahora, aprenderá cómo adjuntar un volumen a múltiples contenedores. Aunque puede lograr esto fácilmente, Docker no maneja el bloqueo de archivos. Para múltiples contenedores que escriben en el mismo volumen, debe diseñar individualmente las aplicaciones que se ejecutan en esos contenedores para manejar la escritura en almacenes de datos compartidos para evitar la corrupción de datos.
- Cree Step4Container1 y Step4DataVolume
Use el docker run comando con el parámetro --name para crear un contenedor con nombre:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Dentro del contenedor, ejecute el siguiente comando para crear un archivo de texto y agregar algo de texto:
|
1 |
echo "Texto de muestra del paso cuatro" > /Step4DataVolume/StepFour.txt |
Después de eso, salga del contenedor y regrese al entorno del host. Ahora, queremos crear otro contenedor y montar los volúmenes de Step4Container1 en él.
- Cree Step4Container2 y adjunte los volúmenes del contenedor Step4Container1
Ejecute el siguiente comando para crear Step4Container2 y montar volúmenes de Step4Container1:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Dentro del contenedor, use el cat comando para verificar la persistencia de los datos:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Debería ver la siguiente salida:

Podemos agregar un poco más de texto al archivo desde Step4Container2 ingresando el siguiente comando:
|
1 |
echo "Estamos agregando texto mientras estamos dentro de Step4Container2" >> /Step4DataVolume/StepFour.txt |
Salga del contenedor después de esto y volveremos a Step4Container1 para verificar si los datos aún están presentes.
- Verificar los cambios realizados en el volumen de Docker entre diferentes contenedores
Para ver los cambios, primero reiniciará el Step4Container1 usando el comando:
|
1 |
docker start -ai Step4Container1 |
Verifique los cambios usando el comando:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Debería ver una salida similar a la captura de pantalla a continuación:

Una vez que verifique que ambos contenedores pueden leer y escribir datos en el mismo volumen, ahora puede salir del contenedor. Como se mencionó, Docker no maneja el bloqueo de archivos; es tarea de la lógica de su aplicación que se ejecuta dentro de los contenedores manejar el acceso de lectura y escritura a los almacenes de datos compartidos. Docker permite montar volúmenes como de solo lectura para evitar la corrupción accidental de datos por parte de contenedores que solo requieren acceso de solo lectura agregando :ro como se muestra en el siguiente ejemplo.
- Montar un volumen en un contenedor Docker como de solo lectura
Para este ejemplo, crearemos un contenedor llamado Step4Container3. En el comando de creación, montamos volúmenes de Step4Container1 y agregamos :ro para especificar que este contenedor tiene acceso de solo lectura pero no puede escribir en el volumen. Ejecute el siguiente comando en su terminal:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Una vez dentro del contenedor, puede leer el archivo de texto en el volumen ingresando el siguiente comando:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Sin embargo, si intenta eliminar el archivo usando el comando:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Recibirás un mensaje de error en tu terminal como:
![]()
Una vez que hayas verificado los permisos de lectura y escritura, puedes salir del contenedor. Si deseas limpiar los contenedores y el volumen creados en este tutorial, ejecuta los siguientes comandos:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
En este paso, aprendiste cómo compartir datos entre múltiples contenedores utilizando volúmenes de Docker, así como a montar volúmenes de datos en contenedores como de solo lectura.
Conclusión
En este tutorial, creaste algunos volúmenes de Docker y aprendiste cómo compartir datos entre contenedores de Docker. Al tratar con el intercambio de datos entre contenedores, notamos que la lógica de la aplicación individual dentro del contenedor debe manejar el bloqueo de archivos para evitar la corrupción de datos al escribir en almacenes de datos compartidos, ya que Docker no tiene una implementación para manejar el bloqueo de archivos.
Para obtener más recursos sobre cómo utilizar Docker, es posible que desees consultar más tutoriales en nuestro blog:
- Cómo compartir datos entre un contenedor Docker y un host
- Limpiar recursos de Docker – Imágenes, contenedores y volúmenes
- Cómo desplegar Laravel, Nginx y MySQL con Docker Compose
- Cómo instalar y configurar Docker en CentOS 7
¡Feliz computación!
Comentarios
Aún no hay comentarios. Sea el primero.