You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
12 Hrs
9 Min
40 Seg

Configurar volúmenes básicos en Docker

12/19
Resources

Docker: Volume Management and Potential

Docker has revolutionized the world of application development with several powerful features, most notably the use of volumes. These are not mere storage spaces, but act as dynamic data bridges between our local environment and the containers running in Docker, enabling direct, real-time interaction with our applications. Let's unveil this functionality and explore how to leverage its potential in different scenarios.

What are volumes in Docker?

Volumes in Docker offer the ability to share a drive or folder between your local machine and an active container. Important to distinguish, we are talking about containers and not Docker images; they are already running entities that allow live data manipulation.

What are the usage scenarios for volumes?

Volumes are useful in multiple contexts. For example, you might want to update a website in real time without stopping your container. Or perhaps, in data analysis, you need to insert new data while processes are running. Volumes are key to maintaining that fluidity of work.

How to configure a volume in Docker?

Setting up a volume is simple and here's how:

  • Step 1: Within your local environment, create a folder (e.g. assets) to host the files to share.
  • Step 2: Prepare your Dockerfile or Docker run command with the -v parameter, specifying the local path and its destination in the container.
  • Step 3: Run the container with the volume configuration and verify its operation using Docker Desktop or commands such as docker ps.

How do local changes affect the container?

When you use volumes, changes you make locally, such as updating an HTML file or deleting an image, will be instantly reflected in the container. This allows you to iterate nimbly over your project without the need to restart or rebuild the container.

What is the difference between volume and copy in Docker?

The decision to use volume or COPY command in your Dockerfile depends on the workflow you want to employ:

  • Using volume: Ideal for dynamic projects where files and data change frequently.
  • Using the COPY command: Best for static projects, where resources will not need updates after the initial deployment.

Choosing appropriately between creating a volume or copying data within your Docker image can be decisive for the efficiency and agility of your project. I hope these guidelines will help you optimize your Docker workflow and take full advantage of the potential of volumes - keep learning and experimenting!

Contributions 46

Questions 8

Sort by:

Want to see more contributions, questions and answers from the community?

Si siguieron la clase al pie de la letra y en el navegador no se muestra la nueva imagen, pueden intentar lo siguiente: 1. `docker build -t nginx .` 2. `docker run -it --rm -d -p 8080:80 -v ./sitio:/usr/share/nginx/html/sitio --name web nginx`
No están los recursos en la clase -.-
Para los que siguen teniendo problemas a la hora de crear el volumen: * Yo ocupe los recursos de la clase 6, por cierto y en Windows al menos lo resolví de esta manera * De hecho cree el volumen sobre la imagen previamente creada **sitioweb** ```js $ docker run -it --rm -d -p 8080:80 -v C:/Users/OneDrive/Documentos/practicas/docker/sitio:/usr/share/nginx/html/sitio --name web sitioweb ```Si lo ven lo único que hice fue pegar la ruta del directorio que estamos usando **"C:/Users/OneDrive/Documentos/practicas/docker/sitio"** en lugar de **"./sitio"** De hecho en algún otro comentario, ya se da esta solución, lo pongo algo mas ejemplificado por si es de ayuda
Estaba creando mis notas y quise profundizar en el comando -v, luego pregunte al chat-gpt si podía hacer los mismo que hice en mi linea de comando desde mi dockerfile y me respondió que no: No puedes crear un volumen directamente desde el Dockerfile. Los volúmenes son un concepto de tiempo de ejecución, no de construcción.   El Dockerfile define cómo se debe construir la imagen, pero los volúmenes se montan cuando inicias un contenedor a partir de esa imagen. La creación y el montaje de volúmenes se especifica en el comando docker run o mediante un archivo docker-compose.yml.
Los volúmenes son el mecanismo preferido para la persistencia de los datos generados y utilizados por los contenedores Docker.

Pongan los recursos de la clase porfavor!

Utilizar los recursos de la clase 6.

Crear la carpeta /assets dentro de la carpeta /sitio
Descarga dos imágenes random y déjalas en /assets
Ejecuta docker run -it --rm -d -p 8080:80 -v ./sitio:/usr/share/nginx/html/sitio --name web nginx
Verificar en Docker Desktop el container “nginx” en la pestaña “Exec”:

cd /usr/share/nginx/html/sitio

ls

assets linktree.html

cd assets

ls

batman.jpeg superman.jpg

rm batman.jpeg

ls

superman.jpg

Recuerda que la url cambió a:
localhost:8080/sitio/linktree.html

En el archivo linktree.html utiliza:
COPY (cuando el contenido es estático)
VOLUMEN (cuando el contenido es dinámico)

Complejo… pero ahí vamos… gran curso y de gran utilidad.

En un entrevista técnica, la segunda pregunta fue si usaba Docker para crear contenedores, y por eso estoy aquí.

Probe muchos intentos pero el unico que me funcionara para que se copieran correctamente los archivos de la carpeta sitio y se cre el volumen correctamente fue agregando comillas "" al paremetro -v y agregando la ruta absoulta o completa, asi me funciono correctamente: docker run -it --rm -d -p 8080:80 -v "C:/Users/Luis Hiram/Documents/Docker/curso-de-docker-fundamentos-clase-06/sitio:/usr/share/nginx/html/sitio" --name sitioweb sitioweb:0.1
En el caso que siga sin funcionar y te sale not found 404, puedes probar con el mismo comando pero usando la ruta absoluta de la carpeta sitio. Este es mi ejemplo, tu lo puedes adaptar según la ruta de tu carpeta: ```js docker run -it --rm -d -p 8080:80 -v C:\Users\Usuario\docker-intro\sitio:/usr/share/nginx/html/sitio --name web nginx ```
No estan los recurso de esta clase
No se efectuaban los cambios en mi caso, y llegué a lo siguiente: Si el Dockerfile dice `COPY /sitio /usr/share/nginx/html` entonces el parametro correspondiente al volumen al momento de ejecutar el contenedor debe ser `-v ./sitio:/usr/share/nginx/html` NO `-v ./sitio:/usr/share/nginx/html/sitio`
Cuando intento montar el volumen en el Dockerfile no funciona. Me lanza un error 404 al intentar acceder al archivo linktree.html. Si dejo el COPY + VOLUME en el Dockerfile, el recurso si lo puedo abrir en el puerto asignado pero no se actualiza. ¿De que forma se puede hacer correctamente el montado de los volúmenes desde el Dockerfile? Sobre todo para los casos cuando quieres montar múltiples volúmenes.
Despues de probar mucho para que funcionara tuve que agregar la ruta absoluta (así como la entrega el explorador de windows) de mi carpeta sitio en la instrucción del docker run. De igual manera para usarla desde el dockerFile se debe agregar la ruta absoluta pero en formato Unix es decir cambiando los \ por /
ok
Yo tuve problemas para que se actualizaran los cambios al modificar el archivo. Y finalmente lo logre siguiendo estos pasos: 1\. Genere la imagen con: `docker build -t nginx:clase12 .` Mi dockfile se ve asi ```js FROM nginx:latest # Path: /usr/share/nginx/html COPY /sitio /usr/share/nginx/html/sitio VOLUME [ "./sitio", "usr/share/nginx/html/sitio" ] ``` 2\. Al ejecutar el contenedor agregue la ruta absoluta entre comillas `docker run -it --rm -d -p 8080:80 -v "D:\Cursos\Platzi\cursoDocker-Fundamentos\clase12\sitio":/usr/share/nginx/html/sitio --name web nginx:clase12` Y de esa forma ya pude ver los cambios en tiempo real del archivo html.
![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202025-03-27%20a%20las%203.48.40p.m.-21278eab-a917-4813-ab19-8c445de24f74.jpg)
Para que no pongan todo el path completo pueden utilizar $(pwd) que devuelve la ruta del directorio actual donde ejecutas el comando. Entonces quedaria : docker run -it --rm -d -p 8501:8501 -v $(pwd)/sitio:/usr/share/nginx/html/sitio --name web nginx
Ejecutando el comando si me funciona el volumen (claro poniendo la ruta absoluta de la carpeta donde está el proyecto) pero si lo intento modificando el Dockerfile y agregando VOLUME no funciona
![](https://static.platzi.com/media/user_upload/image-5e747324-09ef-4b8c-895d-a7080afa72e7.jpg)![](https://static.platzi.com/media/user_upload/image-27b14807-f518-46dc-82b7-7b4197986480.jpg)
Les dejo un comando por si tienen problemas en windows: `docker run -it --rm -d -p 8080:80 -v "$(pwd -W)/su-sitio:/usr/share/nginx/html/su-sitio"` --name su-sitito nginx
De esta manera me funciono en Windows ![](https://static.platzi.com/media/user_upload/image-a0cd2a67-ed4d-46b5-bc77-f78cef273e79.jpg)
`docker run -it --rm -d -p 8080:80 -v ./sitio:/usr/share/nginx/html/sitio --name web nginx` Cada opción significa: 1. `docker run`: Comando para crear y arrancar un contenedor 2. Opciones de ejecución: * `-it`: Combina dos flags * `-i`: Modo interactivo * `-t`: Asigna una terminal TTY * `--rm`: Elimina automáticamente el contenedor cuando se detenga * `-d`: Ejecuta en modo detached (background) 3. Configuración de red: * `-p 8080:80`: Mapea el puerto 8080 del host al puerto 80 del contenedor 4. Volumen: * `-v ./sitio:/usr/share/nginx/html/sitio`: Monta el directorio local `./sitio` en la ruta `/usr/share/nginx/html/sitio` del contenedor 5. Identificación: * `--name web`: Asigna el nombre "web" al contenedor 6. `nginx`: La imagen que se usará para crear el contenedor Este comando crea un servidor web Nginx que: * Corre en segundo plano * Es accesible desde el puerto 8080 del host * Tiene acceso a los archivos locales en ./sitio * Se eliminará automáticamente al detenerse * Se puede acceder mediante el nombre "web"
Por mas que ejecuto el comando del volumen la carpeta sitio no se guarda con los archivos de mi carpeta local y no entiendo por que. Importe los archivos manualmente a la carpeta volumen que se creo y al actualizar el html tampoco se ve regflejado cuando recargo la pagina. ![](https://static.platzi.com/media/user_upload/image-2d42f304-155c-4462-a374-c8b603a6498c.jpg)
Tuve que pasar por muchísimas cosas para que esto me termine funcionando aquí les diré todo para correr el contenedor el comando de la clase esta bien pero necesita mejoras ```js docker run -it --rm -d -p 8080:80 -v "/d/Platzi/Docker ruta/Docker fundamentos/Docker frontend project/Sitio:/usr/share/nginx/html" --name bigboy2 mi-nginx ```puedes usar el nginx como imagen simplemente había creado una nueva la ruta (obviamente la tuya es diferente) se debe de poner entre comillas dobles para que te funcione bien (puede funcionar sin las comillas pero si alguna carpeta tiene espacio no funcionara). puedes poner la ruta como la ponen en la clase, yo la puse manualmente por problemas que tenia crear un archivo llamado docker-compose.yml. dentro de este tuve que poner la siguiente información ```js version: '3.8' services: nginx: image: nginx:latest container_name: bigboy2 ports: - "8080:80" volumes: - "./Sitio:/usr/share/nginx/html" ```esto va dentro de ese archivo, ese archivo se crea en la raíz similar al docker file en el container\_name va el nombre del contenedor tuyo. para correr el programa el se necesita un comando nuevo debido al compose ```js docker-compose up -d ``` Luego de esto ya te debería actualizar de sin problemas, esto permite que cuando cambies algo en el código se vea. Mucha suerte es un gran curso
Tuve un problema al montar el volumen en docker usando windows 11. El problema se debía a que la ruta especificada contenía espacios, lo que causaba un error de referencia inválida en Docker. La solución fue encerrar la ruta entre comillas (`"`) para que Docker la interpretara correctamente. El comando ajustado quedó de la siguiente manera docker run -it --rm -d -p 8080:80 -v 'C:\Users\Julio Cesar\Documents\clase06\sitio:/usr/share/nginx/html/sitio' --name web80 nginx
El VOLUME en el dockerfile por si solo no crea la persistencia de datos, igual hay que ejecutarlo con el flag -v en el comando
### **Tipos de volúmenes en Docker** 1. **Volúmenes gestionados por Docker** (docker volume create): * Docker crea y gestiona el volumen, que se almacena en el sistema de archivos del host en una ubicación controlada por Docker. * Son la forma recomendada de crear volúmenes, ya que Docker se encarga de gestionar el almacenamiento. 2. **Volúmenes bind mounts**: * Permiten mapear una carpeta específica del sistema anfitrión en un contenedor, lo que proporciona más control sobre la ubicación del almacenamiento. * Sin embargo, no son completamente gestionados por Docker, lo que los hace más susceptibles a problemas de permisos y administración.
Errores en windows y como solucionarlos: * response from daemon: .\sitio;C%!(EXTRA string=is not a valid Windows path) * 404 Los dos errores ocurren porque Docker está esperando una ruta válida pero hay un problema con la forma en que especificamos el directorio local (`./sitio`). Este tipo de error es común cuando usamos Docker en **Windows** (especialmente con WSL o Docker Desktop) y hay un malentendido con el formato de la ruta del sistema de archivos entre Linux y Windows. Solución: **Usa una ruta absoluta de Windows** Docker en Windows espera una **ruta absoluta** para el mapeo de volúmenes. docker run -it --rm -d -p 8080:80 -v C:/Users/TuUsuario/Documents/sitio:/usr/share/nginx/html/sitio --name web nginx
Use una de las imágenes que construimos y como no cree la carpeta "sitio" me toco poner una variable en la ruta y asi funciono: docker run -it --rm -d -p 8085:80 -v $(pwd):/usr/share/nginx/html --name web25 jesus/sitioweb:latest ```js FROM nginx:latest # path: /usr/share/nginx/html COPY /index.html /usr/share/nginx/html ```FROM nginx:latest \# path: /usr/share/nginx/html COPY /index.html /usr/share/nginx/html
### COPY vs VOLUME en Docker (Copilot) COPY: Se utiliza en el Dockerfile para copiar archivos o directorios desde tu máquina host al sistema de archivos del contenedor. Contenido estático: Es ideal para contenido que no cambia frecuentemente, como archivos HTML, imágenes, scripts, etc. Ejemplo: FROM nginx:latest COPY ./sitio /usr/share/nginx/html VOLUME: Se utiliza para montar un directorio desde tu máquina host al contenedor, permitiendo que los cambios en el directorio host se reflejen en el contenedor y viceversa. Contenido dinámico: Es ideal para contenido que cambia frecuentemente, como archivos de configuración, datos de aplicaciones, etc. Ejemplo: docker run -it --rm -d -p 8080:80 -v ./sitio:/usr/share/nginx/html --name web nginx En este ejemplo, el directorio ./sitio en tu máquina host se monta en /usr/share/nginx/html dentro del contenedor, permitiendo que cualquier cambio en ./sitio se refleje inmediatamente en el contenedor.
Estoy intentando hacer el ejercicio también en docker desktop pero no toma las rutas /sitio y /usr/share/nginx/html ¿Debo cambiar algo? ![]()![](https://static.platzi.com/media/user_upload/image-1d8531c8-7b09-42bb-90cb-89637235ec7d.jpg)
Intenté crear mi contenedor con el dockerfile del final de la clase pero el comportamiento fue diferente.  Corrijanme si estoy mal pero la keyword `VOLUME` en el dockerfile solo sirve para señalar el destino de un volumen en un contenedor, no el origen.  En el ejemplo si creamos la imagen con el dockerfile del final de la clase estamos señalando 2 destinos para volúmenes, no un origen y destino como cuando se usa la flag `-v` del comando `docker run`.
¿Si solo defino el volumen en el Dockerfile, y no lo hago en el comando de ejecución como ... sudo docker run -it -v ./rutaO:/rutaL.., donde quedaría ubicado el volumen?
Para los que como yo no entendian porque no funcionaba los cambios de volumen con el Dockerfile. El VOLUME en Dockerfile solo es para definir el punto del montaje del volumen para montar el directorio en el host igual dependemos de la flag -v al ejecutar el contenedor. Resumen * Usa la instrucción `VOLUME` en el `Dockerfile` para definir el punto de montaje del volumen. * Al ejecutar el contenedor, usa la opción `-v` para montar un directorio del host en el contenedor.
A mi no me funciono, si me deja crear el volumen y el contenedor pero a la hora de hacer un cambio el local no se ve reflejado en la pagina aunque la recargue.
Basicamente los volumenes son para compartir recursos en tiempo real.
Son 2 acciones diferentes, una cosa es declarar un `VOLUME` en el `Dockerfile` y otra en comando -v despues del `docker run`. Por eso es que muchos indican que desde el `Dockerfile` no les funciona.
Si alguien sigue teniendo problemas en sincronizar el contenido local con el del contenedor, aquí esta lo que yo encontré (Con Windows y WSL). En el Dockerfile NO colocar ni "COPY" o "VOLUME", y proceder con los comandos como los hemos visto en el curso: `docker build -t server:latest .` `docker run -it --rm -d -p 8080:80 -v ./site:/usr/share/nginx/html/site --name web server` Espero les sea de utilidad.
el VOLUME en el dockerfile no funciona, no sincroniza cambios, el -v desde la terminal si
Donde accedo a los recursos de la clase? no encuentro este ejemplo
hola Intente crear el contenedor con el VOLUME definido desde el Dockerfile. Sin embargo, no me funciono, el sitio no se ejecuta y cuando verfifico con Docker Desktop no veo mapeada la carpeta sitio en la ruta /usr/share/nginx/html
Esta clase no cuenta con la pestaña de recursos!
Encuentro que los volúmenes tienen un alto uso para el tema de un posible 'live share', así a medida que se va trabajando se podría ver directamente en el contenedor como reflejan dichos cambios.

Siguiendo con la misma dinámica de preguntarle a la IA : ¿Cuál sería el comando exacto para ejecutar un contenedor Docker que utiliza la imagen de Nginx, la cual sirve los archivos de mi sitio web desde un directorio de mi maquina local y cuyos cambios se vean reflejados en el contenedor?

Para que tengan una idea de donde es preferible utilizar un volumen, lo mejor es agregarlo cuando quieres tener un entorno de desarrollo que es importante que los cambios que hagas en el proyecto se vean reflejados en el contenedor en tiempo real. Pero para subir a producción lo mejor es COPY, ya que solo vamos a querer ver cambios en ese entorno, cuando se suba algo a producción intencionalmente.
Hola a todos Las sentencias que se aplican en la clase es todo orientado a linux para el caso puntual Windows se deben hacer los siguientes cambios. 1\. Modificar Dockerfile para que la ruta de copia de los archivos no se html sino sitio en el contenedor `#**********************************************` `FROM nginx:latest` `# Path del sitio` `COPY /sitio /usr/share/nginx/html/sitio #**********************************************` 2\. Generar una nueva imagen con el cambio del Dockerfile `docker build -t nginx:1.0 .` 3\. Lanzar el nuevo contenedor basado en la nueva imagen, pero se debe orientar la ruta de archivos de "./sitio" (ruta ubuntu) a "disco:\ruta\_de\_la\_carpeta\_windows" (ruta en Windows) ejem: "D:\cursodocker\sitio" `docker run -it --rm -d -p 8080:80 -v D:\cursodocker\sitio:/usr/share/nginx/html/sitio --name web nginx:1.0`