You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
En algún momento tus contenedores morirán y tendrás que volver a levantarlos. Si no has guardado los datos que tenían, perderás toda la información que tenían. Por eso es importante saber cómo gestionar el almacenamiento en Docker.
6
+
En algún momento tus contenedores morirán 😥 y tendrás que volver a crearlos. Si no has guardado los datos que tenían, perderás toda la información que almacenaban o generaron. Por eso es importante saber cómo gestionar el almacenamiento en Docker.
7
7
8
8
Existen diferentes formas de almacenar datos en Docker. En este módulo vamos a ver las siguientes:
9
9
@@ -13,20 +13,32 @@ Existen diferentes formas de almacenar datos en Docker. En este módulo vamos a
13
13
14
14
## Bind mounts
15
15
16
-
Un bind mount es un enlace directo entre una carpeta en tu host y una carpeta en tu contenedor. Esto significa que si cambias algo en la carpeta del host, también cambiará en la carpeta del contenedor y viceversa.
16
+
Un bind mount es un enlace directo entre una carpeta en tu máquina y una carpeta en tu contenedor. Esto significa que si cambias algo en la carpeta local, también cambiará en la carpeta del contenedor y viceversa.
17
17
18
18
Para crear un bind mount, utiliza la opción `--mount` o `-v` al crear un contenedor. Por ejemplo:
19
19
20
20
```bash
21
21
cd 01-contenedores/contenedores-iv
22
+
22
23
docker run -d --name devtest --mount type=bind,source="$(pwd)"/dev-folder,target=/usr/share/nginx/html/ -p 8080:80 nginx
23
24
```
24
25
25
-
Si cambias el contenido de la carpeta `dev-folder` en tu host, también cambiará en la carpeta `/usr/share/nginx/html/` en tu contenedor.
26
+
Si analizamos este comando tenemos:
27
+
28
+
-`docker run`: Crea y arranca un contenedor.
29
+
-`-d`: Lo hace en segundo plano.
30
+
-`--name devtest`: Le pone nombre al contenedor.
31
+
-`--mount type=bind,source="$(pwd)"/dev-folder,target=/usr/share/nginx/html/`: Crea un bind mount. El tipo de montaje es bind, la carpeta de origen es la carpeta actual (`$(pwd)`) más `dev-folder` y la carpeta de destino es `/usr/share/nginx/html/`.
32
+
33
+
> [!NOTE]
34
+
> Es comendable utilizar la opción `--mount` en lugar de `-v` o `--volume` porque es más explícito y fácil de leer.
35
+
36
+
37
+
Si cambias el contenido de la carpeta `dev-folder` en tu máquina local, también cambiará en la carpeta `/usr/share/nginx/html/` en tu contenedor.
26
38
27
39
#### Usar el bind mount como read-only
28
40
29
-
Tambi´n puedes montar un bind mount como read-only. Esto significa que no podrás escribir en la carpeta del contenedor. Para hacerlo, añade la opción `readonly` al comando `--mount`. Por ejemplo:
41
+
También puedes montar un bind mount como read-only. Esto significa que desde tu máquina podrás cambiar el contenido sin problemas pero desde dentro del contenedor no se podrá. Para hacerlo, añade la opción `readonly` al comando `--mount`. Por ejemplo:
30
42
31
43
```bash
32
44
docker rm -f devtest
@@ -39,35 +51,64 @@ Como está en modo lectura, en teoría no podría crear ningún archivo dentro d
39
51
```bash
40
52
docker container exec -it devtest sh
41
53
ls /usr/share/nginx/html
42
-
touch /usr/share/nginx/html/index2.html #Dará error porque el montaje está en modo read-only
54
+
touch /usr/share/nginx/html/index2.html
43
55
exit
44
56
```
45
57
58
+
El problema principal que tienen los montajes de tipo `bind` es que no son portables. Si tienes un contenedor en un host y quieres moverlo a otro, tendrás que mover también la carpeta que estás montando.
59
+
46
60
## Volúmenes
47
61
48
-
#Listar los volumenes en el host
49
-
docker volume ls
62
+
Los volúmenes son una forma de almacenar datos de forma persistente en Docker. Estos volúmenes se almacenan en una carpeta en el host y se pueden compartir entre varios contenedores. El path donde se almacenan los volúmenes en el host es `/var/lib/docker/volumes`y lo gestiona Docker.
50
63
51
-
#Crear un nuevo volumen con create
52
-
docker volume create data
53
-
docker volume ls
64
+
### Crear un volumen
54
65
55
-
#Crear un contenedor que a su vez crea un volumen
56
-
docker container run -dit --name my-container \
57
-
--mount source=my-data,target=/vol \
58
-
alpine
66
+
Para crear un volumen, utiliza el comando `docker volume create` seguido del nombre del volumen. Por ejemplo:
59
67
60
-
#Se puede utilizar tanto --mount como -v (o --volume)). Originalmente --mount solo se usaba para el modo clúster. Sin embargo, desde la versión 17.06 (Vamos por la 10.03.13)
61
-
# se puede utilizar para contenedores independientes.
68
+
```bash
69
+
docker volume create lemoncode-data
70
+
```
62
71
72
+
Para comprobar cuántos volúmenes tienes en tu host puedes utilizar este comando:
63
73
64
-
#Puedes comprobar que el volumen se ha creado correctamente
74
+
```bash
65
75
docker volume ls
76
+
```
77
+
78
+
Si quisieramos utilizar este volumen en un contenedor, podríamos hacerlo de la siguiente manera:
79
+
80
+
```bash
81
+
docker run -d --name devtest2 --mount source=lemoncode-data,target=/usr/share/nginx/html/ -p 8081:80 nginx
82
+
```
83
+
84
+
En este caso el volumen `lemoncode-data` se ha montado en la carpeta `/usr/share/nginx/html/` del contenedor `devtest2`.
85
+
86
+
### Crear un contenedor que a su vez crea un volumen
87
+
88
+
También es posible crear un contenedor que a su vez cree un volumen.
89
+
90
+
```bash
91
+
docker run -d --name devtest3 -v web-data:/usr/share/nginx/html/ -p 8082:80 nginx
92
+
```
93
+
94
+
En este caso, al ejecutarse el contenedor `devtest3` se creará un volumen llamado `web-data` que se montará en la carpeta `/usr/share/nginx/html/` del contenedor.
95
+
96
+
Estos volumenes de primeras no tienen datos. En el caso de los contenedores que utilizan la imagen `nginx` se creará un fichero `index.html` por defecto. Si queremos añadir datos a nuestro volumen, podemos hacerlo de la siguiente manera:
66
97
67
-
#Puedo asociar varios contenedores al mismo volumen a la vez
0 commit comments