Clase 6: Almacenamiento en Docker
Introducción al almacenamiento Docker
- Los contenedores son efímeros, es decir, los ficheros, datos y configuraciones que creamos en los contenedores sobreviven a las paradas de los mismos pero, sin embargo, son destruidos si el contenedor es destruido.
- Docker nos proporciona varias soluciones para persistir los datos de los contenedores, entre ellas: los volúmenes Docker y los bind mount.
- Si usamos volumen Docker para guardar la información de un contenedor, estos datos se guardan en una parte del sistema de ficheros que es gestionada por docker, normalmente en
/var/lib/docker/volumes. - Si usamos bind mounts los datos de los contenedores se guardarán en un directorio gestionado por el usuario. Lo que estamos haciendo es “mapear” (montar) una parte de mi sistema de ficheros, de la que yo normalmente tengo el control, con una parte del sistema de ficheros del contenedor. Por lo tanto podemos montar tanto directorios como ficheros.
Gestionando volúmenes docker
Algunos comando útiles para trabajar con volúmenes Docker:
- docker volume create: Crea un volumen con el nombre indicado.
- docker volume rm: Elimina el volumen indicado.
- docker volume prune: Para eliminar los volúmenes que no están siendo usados por ningún contenedor.
- docker volume ls: Nos proporciona una lista de los volúmenes creados y algo de información adicional.
- docker volume inspect: Nos dará una información mucho más detallada de el volumen que hayamos elegido.
Usando volúmenes Docker
Al crear un contenedor podemos usar un volumen Docker o un bind mount usando el parámetro -v. Veamos un ejemplo donde usamos un volumen:
$ docker volume create miweb
$ docker run -d --name my-apache-app -v miweb:/usr/local/apache2/htdocs -p 8080:80 httpd:2.4
$ docker exec my-apache-app bash -c 'echo "<h1>Hola</h1>" > /usr/local/apache2/htdocs/index.html'
$ curl http://localhost:8080
<h1>Hola</h1>
$ docker rm -f my-apache-app
$ docker run -d --name my-apache-app -v miweb:/usr/local/apache2/htdocs -p 8080:80 httpd:2.4
$ curl http://localhost:8080
<h1>Hola</h1>
Algunas aclaraciones:
- Al no indicar el volumen, se creará un nuevo volumen.
- Si usamos el flag
-ve indicamos un nombre, se creará un volumen Docker nuevo. - Al usar tanto volúmenes como bind mount, el contenido de lo que tenemos sobreescribirá la carpeta destino en el sistema de ficheros del contenedor en caso de que exista.
Ejercicio
- Crea un volumen docker que se llame
miweb. - Crea un contenedor desde la imagen
php:7.4-apachedonde montes en el directorio/var/www/html(que sabemos que es el DocumentRoot del servidor que nos ofrece esa imagen) el volumen docker que has creado. - Utiliza el comando
docker cppara copiar un ficheroindex.html(donde aparece tu nombre) en el directorio/var/www/html. - Accede al contenedor desde el navegador para ver la información ofrecida por el fichero
index.html. - Borra el contenedor
- Crea un nuevo contenedor y monta el mismo volumen como en el ejercicio anterior.
- Accede al contenedor desde el navegador para ver la información ofrecida por el fichero
index.html. ¿Seguía existiendo ese fichero?
Gestionando bind mount
En este caso vamos a crear un directorio en el sistema de archivo del host, donde vamos a crear un fichero index.html:
$ mkdir web
$ cd web
/web$ echo "<h1>Hola</h1>" > index.html
$ docker run -d --name my-apache-app -v /home/usuario/web:/usr/local/apache2/htdocs -p 8080:80 httpd:2.4
$ curl http://localhost:8080
<h1>Hola</h1>
$ docker rm -f my-apache-app
$ docker run -d --name my-apache-app -v /home/usuario/web:/usr/local/apache2/htdocs -p 8080:80 httpd:2.4
$ curl http://localhost:8080
<h1>Hola</h1>
Además podemos comprobar que podemos modificar el contenido del fichero aunque este montado en el contenedor:
$ echo "<h1>Adios</h1>" > web/index.html
$ curl http://localhost:8080
<h1>Adios</h1>
Por último, indicar que si nuestra carpeta origen no existe y hacemos un bind mount con -v, esa carpeta se creará pero lo que tendremos en el contenedor es una carpeta vacía.
Ejercicio
- Crea un directorio en tu host y dentro crea un fichero
index.html(donde aparece tu nombre). - Crea un contenedor desde la imagen
php:7.4-apachedonde montes en el directorio/var/www/htmlel directorio que has creado por medio debind mount. - Accede al contenedor desde el navegador para ver la información ofrecida por el fichero
index.html. - Modifica el contenido del fichero
index.htmlen tu host y comprueba que al refrescar la página ofrecida por el contenedor, el contenido ha cambiado. - Borra el contenedor
- Crea un nuevo contenedor y monta el mismo directorio como en el ejercicio anterior.
- Accede al contenedor desde el navegador para ver la información ofrecida por el fichero
index.html. ¿Se sigue viendo el mismo contenido?