Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Docker

Curso de Docker

Guido Vilariño

Guido Vilariño

Bind mounts

13/32
Recursos

Aportes 82

Preguntas 29

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Comandos:

$ mkdir dockerdata (creo un directorio en mi máquina)
$ docker run -d --name db mongo
$ docker ps (veo los contenedores activos)
$ docker exec -it db bash (entro al bash del contenedor)
$ mongo (me conecto a la BBDD)

shows dbs (listo las BBDD)
use platzi ( creo la BBDD platzi)
db.users.insert({“nombre”:“guido”}) (inserto un nuevo dato)
db.users.find() (veo el dato que cargué)
$ docker run -d --name db -v <path de mi maquina>:<path dentro del contenedor(/data/db mongo)> (corro un contenedor de mongo y creo un bind mount)

ERROR(14) del contenedor —resuelto
Estoy siguiendo el curso desde windows 10 en una distro de ubuntu 20.04 WSL2.
Tuve el siguiente problema: al poner la ruta local, el contenedor arrojaba un error(14).
Esta era mi ruta local:

docker run -d --name db -v /mnt/d/dockerPlatzi/mongodata:/data/db mongo  

Con ese error el contenedor no se mantenía ejecutando, se finalizaba.
Para buscar el error hice lo siguiente, ejecuté el comando

docker logs db

me salía un error largo, que a lo que entendía no tenía permisos.
Creí que era por windows mismo y la ruta en la que estaba posicionado.

Encontré dos soluciones:

La primera es que se debe de crear un volumen en docker con el siguiente comando.

docker volume create --name mongodata

luego continuando con los comandos que se dan en este video, se reemplazaría la ruta local que obtienes del pwd por el nombre del volumen que has creado. Algo así:

docker run -d --name db --v mongodata:/data/db mongo

La segunda es cambiar la ruta en la que te encuentras.
Hice un cambio de ruta en la línea de comandos de la siguiente manera:

cd ~

Este comando nos lleva al home (~) de la distribucion (de esta afirmación no estoy del todo seguro)

Luego en esa ruta creas la carpeta para hacer las pruebas de la clase

mkdir mongodata

Finalmente, introducirías el comando para ejecutar poniendo la ruta local de la siguiente manera:

docker run -d --name db --v ~/mongodata:/data/db mongo

y LISTO.

Para quienes esten usando Win10, tuve un problema de que estaba intentando linkear la carpeta de mi local con la del contenedor y tener los datos de mongo, insertaba datos en la BD pero no se me creaban los archivos en mi pc.

Para el PATH en windows, tuve que usar “” y para el PATH dentro del contenedor tuve que usar “/”

docker run  -d --name mongodb -v C:\Users\jaarevalo\Documents\Developer\Cursos\Docker\mongodata:/data/db mongo

Guido, explicás muy bien. Quiero hacer una observación respecto a los nombres que utilizás para los containers. Aquí usás “db” para el nombre del container que contiene la database mongo, pero también “db” es el directorio por defecto en las databases de mongodb. Por lo que puede confundir a quiénes nunca usamos mongo. Lo ideal es usar nombres distintos a cualquier directorio o archivo default del servicio que corramos, sobre todo en los ejemplos para quienes iniciamos en este mundo. Gracias.

Los contenedores son autocontenidos y no pueden acceder a la información de la máquina que los hostea.
A veces tenemos aplicaciones que generan datos y que queremos acceder a ellos.
Crearemos una carpeta nueva para que interactúe con nuestro contenedor

$ mkdir dockerdata

Vamos a crear una base de datos en mongo db y hacer que los datos no mueran con el contenedor cuando se cierre

$ docker run -d --name db mongo

Ahora entraremos al contenedor para generar datos en él:

$ docker exec -it db bash

Ahora estoy dentro del contenedor y accederé a mongo:

$ mongo

ya estoy conectado en la base de datos local y crearé una base de dato llamada “Platzi”

use platzi

crearé un nuevo usuario llamado “guido”

db.users.insert({“nombre”:“guido”})

verifico que esté creado:

db.users.find()

Saldré de mongo y del contenedor con el comando exit dos veces

y eliminaré el contenedor por completo con docker rm -f db

Pero al volver de acceder no estará disponible, dado que eliminé el contenedor.

Para que no se elimine el dato, necesito generar un directorio espejo en mi máquina local, para esto, utilizaremos bind mounts.

Lo primero que necesitamos es crear un nuevo directorio

mkdir mongodata

y obtendremos el path en el que está montado:

pwd

Y copiaremos en el portapapeles la ruta del directorio:

docker run -d --name db -v /miruta/mongodata:/data/db mongo
donde /miruta/mongodata es la ruta a mi carpeta local y /data/db es la carpeta donde mongo guarda sus datos

ahora, si repetimos todo el procedimiento anterior, todo quedará espejado en el directorio local, por lo tanto, el dato que ingresamos en la base de datos están disponibles en mongo si volvemos a

desde windows 10 para que mi funcionara desde la ruta de mi maquina local y la ruta del conetendor fue de la siguiente manera

docker run  -d --name mongodb -v "C:\Users\LAURA C\OneDrive\Escritorio\Docker\dockerdata\mongodata":/data/db mongo

Por si a alguien le sirve Estaba usando git bash (que usa una versión lijera de linux) en windows y no pude hacer esta práctica, me creaba un directorio random con terminación ;C y la data no se guardaba, me cambie a la linea de comandos nativa de windows y por fin pude completarla.

Buena profe se cambio de camisa xd ! :v

Estando en windows para no escribir toda la ruta del bind mount me pare en el directorio y ejecute este comando

docker run -d --name db -v ${pwd}:/data/db mongo

${pwd} resolvió la vida

Muy bien explicado pero como los comandos los estas escribiendo en la parte inferior la barra al correr e video cubre el código

Todo lo que se ve en esta clase está relacionado con volúmenes y como ya se dijo en clases anteriores Docker es virtualización de sistemas encontramos también volúmenes que son algo así como discos duros o datos que los contenedores pueden usar
Hay varios tipos de volúmenes

Para diferentes usos pero siempre se usan para persistir datos como por ejemplo imagina que estás haciendo una app que usa postgres sin importar la tecnología que usas para la lógica (node, python, php, java, c#) puedes tener muchas instancias de postgres en muchas versiones y los datos no se perderán a menos que los elimines
https://docs.docker.com/storage/volumes/

Automacié todo en un script

  • Crea la carpeta DockerData/mongodata
  • Permite escoger el nombre del contenedor.
  • Te mete dentro del contenedor.
    De eliminarse el contenedor, puede usted volver a ejecutar el script dónde si Dockerdata existiese, cambiaría de pocisión dentro de él y obtendría la ruta (para un posterior uso). Esto sirve a la inversa. Puede ver el código aquí

– Creamos un contenedor con la base de datos MongoDB, insertamos un dato a la base de datos platzi y eliminamos el contenedor.

mkdir dockerdata
docker run -d --name db mongo
docker exec -it db bash
# mongo
> show dbs
> use platzi
> db.users.insert({"nombre": "Boris"})
> db.users.find()
> exit
# exit
docker rm -f db

– Verificamos los datos que creamos se perdieron.

docker run -d --name db mongo
docker exec -it db bash
# mongo
> use platzi
> db.users.find()

– Creamos una carpeta, copiamos la ruta de nuestra carpeta. Creamos el contenedor de mongoDB (-v [ruta_local]:[ruta_container])

mkdir mongodata && cd mongodata
pwd
docker run -d --name db -v /root/dockerdata/mongodata:/data/db mongo
docker exec -it db bash
# mongo
> use platzi
> db.users.insert({"nombre": "Boris"})
> db.users.find()
> exit
# exit
docker rm -f db

– Verificamos que los datos no se hayan perdido.

ll mongodata
docker run -d --name db mongo
docker exec -it db bash
# mongo
> use platzi
> db.users.find()

Docker tiene dos opciones para persistir la data Volumes y Bind Mount.
https://docs.docker.com/storage/

Para los que estén trabajando en windows y tengan problemas con la ruta /mnt/c/Users/yourUser, les recomiendo utilizar el comando cd para que trabajen en el directorio raíz de WSL como si estuviesen en Linux.

Hola,
Despues de borrar la bd de mongo con la ruta de mi directorio y lo volví a crear asignandole la misma ruta me mostró lo siguiente ejecutando el comando docker exec -it db bash
Error response from daemon: Container 5125ef30531a0281c5b7f306ba10cf2480ba1a1d321a42258ee100c5246aaf9d is not running
apesar que trato de hacerle el docker start no arranca e contenedor. Estoy ejecutandolo en un windows 10 y no he encontrado el por qué del error… alguién sabe que podría ser?

By default all files created inside a container are stored on a writable container layer. This means that:

  1. The data doesn’t persist when that container no longer exists, and it can be difficult to get the data out of the container if another process needs it.

  2. A container’s writable layer is tightly coupled to the host machine where the container is running. You can’t easily move the data somewhere else.

  3. Writing into a container’s writable layer requires a storage driver to manage the filesystem. The storage driver provides a union filesystem, using the Linux kernel. This extra abstraction reduces performance as compared to using data volumes, which write directly to the host filesystem.

Docker has two options for containers to store files in the host machine, so that the files are persisted even after the container stops: volumes, and bind mounts. If you’re running Docker on Linux you can also use a tmpfs mount. If you’re running Docker on Windows you can also use a named pipe.

Official documentation: https://docs.docker.com/storage/

10. Bind mounts, espejar carpetas del contenedor hacia una carpeta externa
En ocasiones se desea tener datos persistentes aun cuando se elimine el contenedor, esto se puede hacer espejando carpetas, es decir, que los datos de una carpeta se copien de manera idéntica en otra carpeta, esto tiene varios uso e implicaciones, pero de forma general para este caso práctico se debe hacer lo siguiente la idea es la siguiente:
Crear un nuevo contenedor y espejar los datos de la carpeta del contenedor hacia el host.

  1. Crear una carpeta en el host; para guardar los archivos del contenedor al host.
  2. Crear un contendor partiendo de la imagen de mongo e Indicarle cuál carpeta va a espejar la información, es decir: directorio del contenedor hacia directorio del host.
  3. Verificar que está activo el contenedor recién creado.
  4. Entrar al bash del contendor.
  5. Entrar a mongo.
  6. listar bases de datos creadas, a ver si existe
  7. Crear y usar una nueva bases de datos y usarla por defecto.
  8. Realizar una inserción de datos.
  9. Verificar que los datos han sido insertados de manera correcta.
  10. Verificar con que dentro de la carpeta de hosts se hallan creados datos

Crear un nuevo contenedor y espejar los datos de la carpeta hosts al contenedor
11. Eliminar el contendor anterior
12. Crear un contendor partiendo de la imagen de mongo e Indicarle cuál carpeta va a espejar la información, es decir: del directorio del host al directorio del contenedor. Aplicar el comando del paso 2
13. Entrar al bash del contenedor
14. Entrar a mongo.
15. Listar bases de datos creadas, a ver si existe la anterior bases de datos creada
16. Usar la bases de datos anteriormente creada.
17. verificar que los datos han sido insertados de manera correcta.

Ejecución de los pasos para espejar información con Bind mounts

  1. $ mkdir ~/docker-data
  2. $ sudo docker run -d --name db -v ~/docker-data: /data/db mongo
  3. $ sudo docker ps
  4. $ sudo docker exec -it db bash
  5. $ mongo
  6. shows dbs

  7. use platzi

  8. db.users.insert({“nombre”:“guido”})

  9. db.users.find()

  10. cd ~/docker-data && ls -a
  11. $ sudo docker rm -f db
  12. $ sudo docker run -d --name db -v ~/docker-data: /data/db mongo
  13. $ sudo docker exec -it db bash
  14. $ mongo
  15. shows dbs

  16. use platzi

  17. db.users.find()

Esto debría mostrar los datos guardados anteriormente
Explicación del comando para espejar información
$ docker run -d --name <nombre c> -v <path L>:<path C> < nombre i>
parámetros

<nombre c>: 
	nombre del contenedor, así se llamará localmente
<path L>: 
	directorio local
<path C>: 
	dierectorio del contenedor
< nombre i>:

flag

--name: 
	Asignar un nombre de forma local a nuestro contenedor
-d or --detach : 
	Inicia un contenedor sin asociar el input/output del contenedor al terminal.
-v  
	Indica cuáles carpetas se van a sincronizar

Ejemplo:
$ sudo docker run -d --name db -v ~/docker-data: /data/db mongo

Tener un directorio en mi máquina que tenga un versión idéntica de lo que ocurre en el contenedor, es decir, que lo que pase dentro del contenedor ocurra en mi máquina támbien Bind mount docker run -d --name db -v <path de mi maquina>:<path dentro del contenedor(/data/db mongo)>

para los que estamos utilizando win 10

<docker run --name db -d -v /Users/PC/mongodt:/data/db mongo>

En mi caso en wsl al correr docker run -d --name db mongo
y luego correr docker ps, no me aparecía como contenedor corriendo. Luego al verlo con docker ps -a aparecía con el status “Exited (132)”.

Para solucionar esto tuve que correr la versión 4 de mongo.

Esto se hace con:

docker run -d --name db mongodb:4

Si alguno tiene problemas para un directorio puedes usar el siguiente comando en docker:

sudo docker run -d --name db -v "/$(pwd)/mongodata":/data/db mongo

Hola amigos por aca les dejo la forma en que logre hacer el bind mount desde mi equipo con windows 10:

docker run --name db -d -v C:/Users/"Bautista Josses"/Documents/dockerdata/mongodata:/data/db mongo

Saludos desde Nicaragua

Para los que usan WSL2 a mi me funciono perfectamente con

docker run -d --name db -v /home/saul/proyectos/Platzi/cursoDocker/dockerData/mongodata:/data/db mongo

Para los que usan windows 10 les comparto mi forma de hacer funcionar el bind mount

docker run  -d --name mongodb -v "C:\Users\Mar\Desktop\Docker\dockerdata\mongodata":/data/db mongo

Incluso volviendo a la clase anterior donde montamos un servidor nginx, pueden hacer que el servidor responda con una página guardada por ustedes en una dirección de su disco duro

docker run --name nginxtest -v "C:\Users\Mar\Desktop\docker\html":/usr/share/html -p 3000:80 -d nginx

De esta manera si dentro de la dirección C:\Users\Mar\Desktop\docker\html guardan un archivo index.html con este contenido

<h1>Hola</h1>

Cuando apunten en su navegador a localhost:3000 el nginx dockerizado les va a responder con este contenido.
😉

Me muestra un status: exited(14)

  • Para la persistencia de datos en los contenedores podemos montar para de nuestro directorio como volúmenes del filesystem de docker.
  • docker run -d -name db mongo -v /home/user/mypath:/data/db , creamos un nuevo container de imagen mongo, de nombre db, que no muestre el output del comando que ejecuta y que cree un volumen de la ruta /home/user/mypath del host hacia la ruta /data/db del container.

Apuntes de clase

mkdir dockerdata (creo un directorio en mi máquina)

docker run -d --name db mongo

docker ps (veo los contenedores activos)

docker exec -it db bash (entro al bash del contenedor)

docker rm -f <contenedor> (lo para y lo borra)

docker run -d --name db -v D:\santiago\dockerdata\mongodata:/data/db mongo

vericueto
Quizá del dialect. pericueto ‘cerro escarpado’, y este de per- y cueto.

  1. m. Lugar o sitio áspero, alto y quebrado, por donde no se puede andar sino con dificultad

Fuente: RAE

Es extraño… borro el contenedor, cuando lo vuelvo a crear encuentra la información pero en la carpeta no se ve ninguna información, alguien sabe que pasa en esos casos ??

Un bind mount es un archivo o carpeta almacenado en cualquier lugar del sistema de archivos del host del contenedor. La principal diferencia que tiene un bind mount de un volumen es que, dado que puede existir en cualquier lugar del sistema de archivos del host, los procesos fuera de Docker también pueden modificarlo.

En mac no me dejaba, me decia que el directorio era desconocido para Docker, aquí la razón. Se soluciona cambiando una configuración en docker desktop.

Exponiendo contenedores

Como se mencionó anteriormente, los contenedores prácticamente están contenidos en una burbuja, aislados del exterior 💭. Pero, ¿qué sucede cuando necesitamos exponer un servicio que está corriendo en nuestro contenedor hacía fuera de esa burbuja 🤔? Por ejemplo, cuando levantamos un servidor de nginx y queremos acceder a dicho servidor desde un navegador.

Imaginemos que tenemos una planta (nuestro contenedor) que produce energía eléctrica ⚡ y necesitamos llevar energía desde nuestra planta → hacía un pueblo 🏘 (máquina anfitriona). ¿Qué necesitamos para realizar esta conexión 🤔? 🔌 ¡Exacto, Necesitamos cables! (la realidad es más compleja).

Entonces, tenemos un cable que lo conectamos a algún lugar disponible de nuestra planta (contenedor) y el otro extremo del cable lo conectamos a la red de distribución del pueblo (máquina host). ¡Y listo! Tendremos energía eléctrica 😉.

Pero, ¿cuál vendría a ser ese cable en Docker 🤔? Bueno, esto lo lograríamos haciendo publico un puerto de nuestro contendor y lo conectamos a uno de los puertos de nuestra máquina anfitriona.

Lo anterior se logra añadiendo el flag -p al comando docker run, este quedaría así: docker run -d -p [HOST PORT]:[CONTAINER PORT] [CONTAINER] (el flag -d permite correr el contenedor en segundo plano y lanza su ID).

Por ejemplo, docker run -d -p 8080:80 nginx. Con esto podríamos acceder al servidor nginx que corre en el puerto 80 de nuestro contenedor desde el puerto 8080 de nuestra máquina.

En el comando anterior usamos el flag -d para ejecutar en segundo plano el contenedor, por lo cual no podremos dar seguimiento a lo que sucede con este 🤦‍♂️. Para resolverlo, podemos hacer uso del comando docker logs proxy, con esto podremos ver TODA la salida (hasta el momento) en nuestra terminal.

Añadiendo el flag -f al comando anterior le podemos dar seguimiento a los logs de nuestro contenedor (apropiándose la salida de nuestra terminal).

Muchas veces solamente necesitaremos ver el registro de lo que ha sucedido recientemente y no todo el historial. Para ello podemos usar el flag —tail que recibe cómo parámetro la cantidad de líneas a leer desde el final del registro. Por ejemplo, docker logs --tail 10 [CONTAINER] nos mostrará las últimas 10 filas.

con esto obtinen la ruta -v $(pwd):path_Container

Les recomiendo que empiecen a utilizar el mejor SO Linux

excelente muy buen ejercicio

Bind mount sirve para espejar el contenido que guardo dentro de mi contenedor, todo lo que ocurra en una ruta especifica dentro del contenedor pasará en un directorio local

Genial! El uso que le veo a esto es poder levantar un servidor desde docker, pero con el directorio de trabajo enlazado! Acabo de enlazar un proyecto de Docker a un proyecto de Laravel y todo genial! Aunque me di cuenta que básicamente el mongo se mantiene corriendo porque mongo ya es un proceso, al igual que NGINX, por eso el -d funciona, sin embargo, con Ubuntu no funciona, porque realmente no hay como tal un proceso corriendo, por eso fue que habiamos puesto el tail /dev/null 🤔

Si ejecutando el comando: docker run -d --name db -v <path de mi maquina>:<path dentro del contenedor(/data/db mongo)> les da el siguiente error:

docker: Error response from daemon: Conflict. The container name “/db” is already in use by container “c9056b5eaa6cfde2a534933c5bf40db62d137aa121c2c4ccd0b87eb4f2b5a3c1”. You have to remove (or rename) that container to be able to reuse that name.
See ‘docker run --help’.

Hagan login con docker login y sus credenciales, comprueben que la imagen de mongo corra en docker con docker run -d --name db mongo y por ultimo pueden cambiar el nombre de los directorios en el path de la maquina. Yo tenia mi carpeta del curso llamada “Curso de Docker” y lo cmabie a “Docker” y me funciono 😃

Que molesto es cuando utiliza la terminal en la parte baja de la pantalla y al pausar o mover el mouse se tape con los controles de reproducción, es un detalle que deberian tener en cuenta.

Bind mounts

  • Manera simple de compartir los datos que genere el contenedor con el disco de la máquina anfitriona.
  • Básicamente lo que hace es atar una ruta dentro de la máquina que ejecuta el contenedor con una ruta dentro del contenedor y vincula el contenido. Es decir, todo lo que ocurra en la ruta declarada del contenedor va a aparecer en la máquina anfitriona y viceversa.
  • Aunque es muy práctico tiene riesgos, ya que se le da acceso al contenedor a una parte del disco, lo que puede ser peligroso. Docker ofrece otras maneras más seguras de manejar datos en contenedores.

Manejo de datos en Docker

A veces tenemos aplicaciones que usan datos de la maquina anfitriona y que queremos compartir entre contenedores.

  1. Crear carpeta para trabajar
mkdir dockerdata
  1. Usar bd mongoDB
docker run -d --name db mongo
  1. Entrar al contenedor para ver los datos
docker exec -it db bash
  1. Bash de mongo
mongo
use platzi
show dbs
db.users.insert({"nombre":"guido"})
db.users.find()
exit
  1. Parar el contenedor
docker rm -f db
  1. Volver a crear el contenedor mongo y verificar que ya no existen los datos guardados en la bd anterior. Entonces se procede a crear un archivo en la maquina anfitriona y usar ese archivo para guardar los datos del contenedor y volver a realizar la prueba.

  2. Crear directorio y archivo

mkdir mongodata
pwd
  1. Se tuvo problemas para enlazar y se siguio la solución del compañero @4bel4ven
docker volume create --name mongodata
docker run -d --name db -v mongodata:/data/db mongo

Se realizan los pasos anteriores de vuelta, y los datos se mantienen, es decir, se comparten los datos.

Excelente herramienta Bind mounts:

Es una manera simple de compartir los datos entre mi local y el contenedor, básicamente conecta estas rutas, pero tiene un riesgo y es el acceso que tiene el contenedor, obviamente depende de la información delicada que allí se encuentran, sin embargo es un riesgo que está presente, Docker nos proporciona formas seguras que espero sean compartidas en próximas entregas del curso.

sudo docker run -d --name db -v home/alexander/Escritorio/dockerdata/mongodata:/data/db mongo

mas claro que el agua

la verdad no conocia bind mounts, pq solo he usado volumes, aprendere cuando usar uno o el otro.

entendido

comandos docker:::
docker run -d --name db mongo
docker exec -it db bash
Dentro de monngo ::
use platzi
db.user.insert({"nombre": "Edgar"})
db.users.find()

Los bind mounts tiene riesgos, y es que se le esta dando acceso a docker a datos de la maquina host, lo cual le quita uno de los grandes beneficios a docker.

Estoy siguiendo el curso utilizando una maquina virtual (VirtualBox) con Ubuntu y tuve un error en donde no quedaba montado cuando realizaba:

docker run d --name db mongo

Cuando investigue este error consistia en que el sistema necesitaba soportar AVX, pero la virtualización de Windows no la soporta.
La solición fue por la terminal de Windows deshabilitar “Microsoft Hyper V”, lo hice siguiendo este tutorial y funciono perfecto:

https://forums.virtualbox.org/viewtopic.php?f=25&t=99390

Al parecer mi CPU no es compatible con mongo. Pero lo intentare en el play docker

Intente realizar el bind mount desde windows 10 c0n wsl ubuntu 20.04 focal pero no guardaba los archivos en el directorio indicado. Este es el comando que use:

sudo docker run --name db -d -v "$(pwd):/data/db" mongo:4

despues de mongo puse dos puntos y el 4 por que mi pc solo soporta la version 4 de mongo y no las mas nueva.
Bueno total que nunca pude hacer que persistieran los cambiosen WSL Ubuntu. Donde si me funciono el bind mount fue en Powershell y el comando que use fue el siguiente:

docker run --name db -d -v D:\CURSOS\Platzi\DOCKER\mongodata:/data/db mongo:4 

Ya tarde 1 semana tratando de lograr que funcione en WSL ubuntu a lo cual entendi que auque es linux no es linux por completo tiene sus limitaciones dentro de WSL.
Y bueno a seguir con el curso.

No usar comillas dobles docker run -d --name db -v /"ruta donde guardaras info de tu contenedor":"/directorio de donde tomara la info" mongo

docker run -d --name basedatos mongo. Este comando es para correr un contenedor mongo, llamado basedatos.

No olvidar usar la misma base de datos en la que se guardó inicialmente. De lo contrario los datos no aparecerán aunque se haya hecho el Bind mount bien. Éxitos!

USANDO BIND MOUNTS

#Crear una carpeta en linux 
mkdir <nombre-carpeta>

#Ingresar a la carpeta
cd <nombre-carpeta>

#Crear contenedor con bind mount
docker run -d --name <nombre-contenedor> -v <ruta-maquina>:<ruta-contenedor> <imagen> 

yo intente con:
… -v C:/Users/x/docker/dockerdata/mongodata:/data/db mongo.
y me aparecía un ID de que se creo, pero estaba detenido y no le podía hacer un wen run. posteriormente note que muchos tenían errores similares… hasta que encontré el comentario de
@Davian Ricardo Bermúdez Huerfano
pff basta con: -v ${pwd}:/data/db mongo
${pwd}!!! esa cosa te arregla la vida!!.. y con windows 10 ;v

woow que chulada de curso , me encanta

En Windows 10 tuve problemas para crear el contenedor con la ruta específica y no sabía porqué, luego intenté encerrar la ruta entre comillas “C:\etc\etc” y funcionó perfectamente 👌👌

la ruta que copia guido
es con ctrl+ insert
y cuando pega es con shif + insert

Aqui les dejo el link a la documentación para que lean más a fondo acerca de Bind Mounts
Bind Mounts - Docker Docs

Clase conseguida con éxito!

Dejo un pequeño apunte por si a alguien más le llega a pasar. Cuando montaba una carpeta con el siguiente comando:

docker run -d --name db -v /c/Users/adria/Documents/Conocimiento/CursosPlatzi/CursoDocker/dockerdata:/data/db mongo

Me hacia cosas raras, me creaba una carpeta con el nombre dockerdata;C y no guardaba nada dentro.

La solución fue añadir otra / al principio de la ruta y ya todo funciono correctamente:

docker run -d --name db -v //c/Users/adria/Documents/Conocimiento/CursosPlatzi/CursoDocker/dockerdata:/data/db mongo

Por si a alguien le pasa:
Yo estaba usando MobaXterm como CLI y no podía ejecutar el comando

docker exec -it db bash

Me salía el error:

the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'

La solución fue cambiarme al cmd y funcionó.

Por si desean realizarlo de una manera más corta al momento de conectar las carpetas

sudo docker run -d --name db -v "$(pwd):/data/db"  mongo

Los contenedores son entidades auto-contenidas que no pueden acceder (a menos de que se lo permitamos) al sistema operativo, a la máquina que está ejecutándolos.

Sin embargo, en ciertas ocasiones trabajamos con aplicaciones que generan o usan datos que nos interesa poder manejar o acceder de alguna u otra manera, ya sea para compartirlos con otro contenedor, obtenerlos por razones de login, para persistirlos en otro proceso, etc.

Esto lo podemos solucionar teniendo un directorio en la máquina anfitriona que funcione como “espejo” de la información almacenada dentro de un contenedor; esto quiere decir, que lo que ocurra dentro del contenedor con dicha información, también se reflejará en la máquina anfitriona y viceversa. Esto se puede hacer con el uso de Bind Mounts.

Podemos utilizar Bind Mounts especificándolo en momento en que iniciamos un contenedor, con la bandera -v seguido de la ruta del directorio que trabajará como espejo, de dos puntos, y de la ruta de la carpeta del contenedor que será espejada. Por ejemplo:

$ docker run -d --name db -v ./mongodata:/data/db mongo

Sin embargo, el implementar esta herramienta en ambientes productivos o en servidores con información sensible tiene un riesgo, y es que le estaríamos dando permisos al contenedor para acceder a una parte de la maquina anfitriona; si esa parte de la máquina tiene información sensible y la utilizamos como espejo dentro de un contenedor que no conocemos o que es de proveniencia sospechosa, podría ser peligroso.

Se presento este error:

docker: Error response from daemon: Conflict. The container name "/db" is already in use by container "6bde6f2bd08143738a76bff26e639e57eb6fab9a68daae5f6d65d5b00cac1dc5". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

Para los que les sale este error solo cambiar el nombre, así que lo hice de esta forma:

docker run --name marcelomongo -d -v D:\dockerdata\mongodata:/data/db mongo

Y listo, resuelto: estoy con win 10 y en julio 2021, ojala les sirva

Con Windows ejecuta el siguiente comando:

docker run -d --name db -v "/mnt/c/Users/
PcUser/dockerTest/mongodata":/data/db mongo

Excelente hasta el momento todo entendido y funcionando

Alternativa para windows usando Bash as Admin en Cmder

$ docker run -d --name db -v "$(pwd):/data/db" mongo

hay que entender que un mount bind es diferente al crear un volume como los estas haciendo en los comentarios de abajo

En mi caso paso algo curioso, no me creo la copia de datos en mi carpeta local, pero aun después de eliminar y volver a crear el contenedor los datos continúan en mongo

  • Se crea un contenedor con una DB de mongodb. sudo docker run -d --name db mongo.
  • Se accede a la terminal de la imagen del contenedor de docker. sudo docker exec -it db bash.
  • Se accede a la sesión de mongodb de la imagen con el comando mongo.
  • Se crea una nueva db llamada platzi con use platzi.
  • Se crea un nuevo usuario con db.users.insert({'nombre':'Oscar'}).
  • Comprobamos que de verdad existe con db.users.find().
  • Se sale de la consola interactiva de mongo con exit.
  • El profesor utilizo el comando docker rm -f db. Esto obviamente borró la imagen de docker y borró los datos. Esto es infructuoso, pues si queremos utilizar la información después de borrar la base de datos no va a ser posible. Para ello, utilizamos una imagen espejo en una carpeta específica, en este caso será dockerdata.
  • Para solucionar el problema anterior necesitamos utilizar una herramienta llamada Bind mounts. Se utiliza el siguiente comando sudo docker run -d --name <nombre contenedor> -v <path de la ruta>:<path dentro del contenedor> mongo -> sudo docker run -d --name db -v /home/oscar-dev/CursoDocker/code/dockerdata/mongodata:/data/db mongo.
  • Ingresamos a la consola de la imagen, ingresamos a mongo y creamos el mismo usuario.
  • Eliminamos la imagen sudo docker rm -f db.
  • La volvemos a crear con la bind mount sudo docker run -d --name db -v /home/oscar-dev/CursoDocker/code/dockerdata/mongodata:/data/db mongo.
  • Accedemos a la imagen, ingresamos a la consola interactiva, mongo y buscamos los usuarios en la colección platzi. Se puede apreciar que este existe,

Los bind mounts básicamente atan una ruta dentro de la máquina con una ruta dentro del contenedor, lo que hace es espejar esa ruta dentro del contenedor, todos los datos que se agreguen a esta va a poder visualizarse dentro del contenedor. El riesgo de esto es precisamente el espejo de la aplicación, si ingreso datos sensibles personales o de la compañía, estos podrán ser accedidos desde el contenedor.

Inicia lo bueno 😃

montar un path de mongo sudo docker run -d --name db -v /path/local:/data/db mongo

por que exec? por que -f?

Buen material, excelente explicacion, gracias…
con lo que me quedo …
docker run -d -v <path_anfitrion>:<path docker> mongo
docker run: comando para crear y ejecutar un contenedor
-d : dispatch ( no se si lo escribi bien jejej )
-v : espejear dos directorios ( anfitrion y contenedor )

docker run -d --name db -v "$(pwd)/dockerData/mongoData":/data/db mongo```

Si les pasa como a mi que a mitad de la clase les toca parar y apagar el pc y luego no les funciona nada, con el comando

docker restart db
docker exec -it db bash

pueden seguir trabajando.

nop

es necesario ir a recursos en docker desktop para poder exponer la carpeta