Los volúmenes en Docker brindan la posibilidad de compartir información directamente entre el equipo local y un contenedor activo, facilitando la actualización constante y eficiente de contenidos como sitios web o análisis de datos en marcha. Esta herramienta permite reflejar modificaciones instantáneamente sin detener procesos.
¿Qué es exactamente un volumen en Docker?
Un volumen en Docker es equivalente a una carpeta o unidad compartida entre tu computadora y un contenedor que está en ejecución. Esta función crea un puente de comunicación bidireccional, vital para proyectos que requieren una actualización continua del contenido:
Cambios en páginas web activas.
Integración periódica de grandes volúmenes de datos.
Es importante subrayar que esta interacción se realiza exclusivamente con contenedores activos, no con imágenes almacenadas.
¿Cómo implementar un volumen en un proyecto sencillo con Docker?
Una manera práctica es desplegar un sitio web localmente usando el servidor web Nginx. El procedimiento es sencillo:
Se crea una carpeta local llamada sitio que contiene archivos HTML y recursos gráficos en assets.
En la terminal, se ingresa:
docker run -v ./sitio:/usr/share/nginx/html/sitio nginx
Con este comando, se comparte directamente el contenido del directorio local sitio dentro del contenedor Docker.
Al modificar localmente los archivos HTML, como cambiar imágenes en la propiedad src, los cambios aparecen inmediatamente en el navegador web al recargar la página.
¿Qué diferencias existen entre copiar y crear volúmenes?
Existen diferencias claves entre los comandos Docker copy y utilizar volúmenes:
¿Cuándo debes usar COPY?
Proyectos estáticos, sin necesidad frecuente o continua de actualización.
Cuando deseas mantener una copia permanente y aislada del contenido original dentro de la imagen Docker.
¿Cuándo es recomendable utilizar un volumen?
Para proyectos que necesitan ser actualizados con frecuencia o mientras están corriendo.
En casos de análisis de datos que requieren ingresar continuamente nueva información.
Cada opción ofrece beneficios según la naturaleza dinámica o estática del proyecto, siendo crucial decidir con claridad cuál método es más apropiado para tu caso particular.
¿Te has encontrado con escenarios específicos donde consideres usar volumen o copy? ¡Cuéntanos tu experiencia!
Si siguieron la clase al pie de la letra y en el navegador no se muestra la nueva imagen, pueden intentar lo siguiente:
docker build -t nginx .
docker run -it --rm -d -p 8080:80 -v ./sitio:/usr/share/nginx/html/sitio --name web nginx
Muchas gracias
Muchas gracias me funciono
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
$ 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
Muchas gracias bro, al 19/junio/2024 esta solucion me funciono.
Brother, tu ayuda fue excelente, el problema me parece es que necesitamos colocar toda la ruta del local
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.
Pero si es justo lo que mostraron en la clase:
Sergio, el amigo dice que el archivo para crear el volumen debe ser docker-compose.yml y no en el archivo Dockerfile donde está el comando COPY, porque el archivo Dockerfile (El que se utiliza en esta clase) define cómo se debe construir la imagen, pero los volúmenes se montan cuando inicias un contenedor a partir de esa imagen creada con el Dockerfile
Osea no es buena práctica o no es correcto crear un volumen en Dockerfile.
Las buenas prácticas o correcto para Volumenes son:
En el comando
docker run
agregando -v o mediante un archivo docker-compose.yml
Lo entendí así bro.
El volumen "sitio" me queda como una carpeta vacía, por lo que al intentar acceder a estos recursos me tira error 404. Los comandos que estoy utilizando son:
docker build -t nginx .docker run -it --rm -d -p 8080:80-v ./sitio:/usr/share/nginx/html/sitio --name web nginx
El DockerFile es exactamente igual al del video
¿Cuál podría ser el problema?
El problema podría ser que al ejecutar el comando docker run, la información del volumen 'sitio' no se está copiando correctamente dentro del contenedor. El Dockerfile debería manejar la copia o el mapeo de estos archivos, de lo contrario el directorio 'sitio' dentro del contenedor estará vacío, lo que resulta en el error 404 al intentar acceder a esos recursos.
Estaría genial si me cuentas de las ubicaciones de las carpetas en donde estás trabajando. Si quieres puedes buscarme por cualquiera de mis redes sociales y lo podemos arreglar juntos!
Los volúmenes son el mecanismo preferido para la persistencia de los datos generados y utilizados por los contenedores Docker.
totalmente deacuerdo
Pongan los recursos de la clase porfavor!
x2
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
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í.
Se están saltando pasos de nuevo...
Como cuáles?
Los Volúmenes en Docker son unidades de almacenamiento que actúan como carpetas compartidas bidireccionales entre la máquina anfitriona y un contenedor activo.
Su propósito principal es establecer un puente de comunicación para facilitar la actualización constante y eficiente de contenidos.
Permiten que las modificaciones realizadas en el sistema de archivos local se reflejen instantáneamente dentro del contenedor en ejecución.
Esto es vital para proyectos que requieren actualización continua (como un sitio web activo) sin detener o reconstruir el contenedor.
La interacción con los volúmenes se realiza exclusivamente con contenedores activos, no con las imágenes base.
La implementación práctica se realiza con el comando docker run -v, mapeando la ruta local a la ruta del contenedor.
El comando de ejemplo es docker run -v ./sitio:/usr/share/nginx/html/sitio nginx para montar un sitio web Nginx.
Los volúmenes difieren del comando COPY del Dockerfile en su naturaleza de persistencia.
COPY es ideal para proyectos estáticos o para mantener una copia aislada y permanente dentro de la imagen.
Se recomienda usar Volúmenes para proyectos dinámicos que necesitan ingresar datos continuamente o requieren una modificación mientras están corriendo.
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:
docker run -it --rm -d -p 8080:80-v C:\Users\Usuario\docker-intro\sitio:/usr/share/nginx/html/sitio --name web nginx
Gracias!!!!!!!
Los recursos de la clase son los amigos que hicimos en los comentarios a lo largo del curso
Lo que se hace en la clase NO ES UN VOLUMEN sino que es lo que se conoce como un bin mount. Los volumenes no pueden (ni deben) ser accedidos por el sistema operativo host.
Muy cierto, viene en la documentación oficial:
¿Podrían poner los recursos mencionados por el profesor en la clase 12?
Ya apaeció?
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:
192.168.3.20:8080 es el enlace del host (IP:puerto). Al no especificar IP, establece el 0.0.0.0 por defecto, es decir, usa las IPs de todas las interaces de red de tu máquina (localhost = 127.0.0.1, mi eth0 = 192.168.3.20)
80 es el puerto interno del contenedor donde se expone el servicio
-v ./src:/usr/share/nginx/html/web es el enlace de volumen:
./src es el directorio del host
/usr/share/nginx/html/web es el directorio del contenedor
--name linktree es el nombre del contenedor
linktree:2.0 es la etiqueta de la imagen (también puedes especificar el ID de la imagen)
[!TIP]
Agrega la bandera --rm para eliminar automáticamente el contenedor cuando se detenga:
En tu navegador accede a 192.168.3.20:8080/web/linktree.html (reemplaza la IP por la del host o la del localhost si aplica)
Detener Contenedor
docker stop linktree
Donde linktree es el nombre del contenedor (también puedes especificar el ID del contenedor).
Ejecutar un Contenedor Creado
docker start linktree
[!NOTE]
Puedes especificar el nombre del contenedor o el ID del contenedor
Eliminar Contenedor
dockerrm linktree
[!NOTE]
Puedes especificar el nombre del contenedor o el ID del contenedor.
[!TIP]
Agrega la bandera -f/--force para forzar la eliminación de un contenedor en ejecución (detiene y elimina en un solo comando):
dockerrm -f linktree
Verificar Archivos del Contenedor
Abrir un Shell Interactivo para el Contenedor
dockerexec -it linktree sh
Donde:
-i/--interactive mantiene STDIN abierto incluso si no está adjunto
-t/--tty asigna un pseudo-TTY
linktree es el nombre del contenedor (también puedes especificar el ID del contenedor)
sh es el comando a ejecutar (en este caso, el shell a abrir)
[!TIP]
Puedes reemplazar sh con otro shell si está disponible (p. ej., bash, zsh).
Verificar el Directorio de Interés
Por ejemplo, para verificar el directorio del volumen:
ls /usr/share/nginx/html/web/
Espero y les sirva. Se los comparto para tratar de resumir y explicar toda la información incongruente que se ha manejado durante el curso hasta este punto.
Sinceramente siento que el curso tiene mucha información errónea o incompleta. Sé que no se tiene que explicar todo a detalle como lo que son las redes, servidores, python, HTML, etc., pero no estaría de más dar un poco de contexto porque no todos tenemos el mimo background. Por ejemplo, en la clase que se utiliza Python y Flask, vendría bien explicar a grandes rasgos qué es Flask, cómo intalar las librerías de Python para el deploy con Flask, etc. Y al principio, solo se menciona que estaría bien tener experiencia con SOs, Linux, y Bash, pero formalmente no se establecen prerrequisitos para el curso como experiencia o conocimientos en programación web, redes y Python, temas que apenas y se explican en el curso. Quizá estaría bien considerar poner notas o una sección de recursos recomendados de ser necesario.
P.D. Este comentario es una crítica constructiva. Espero y lo tomén a bien y consideren mejorar o recrear el curso