Skip to main content

Docker: Almacenamiento y redes

Almacenamiento​

Vamos a trabajar con volúmenes docker:​

1. Crea un volumen docker que se llame miweb.​

docker volume create miweb
docker volume ls
root@docker:~#  docker volume create miweb
miweb
root@docker:~# docker volume ls
DRIVER VOLUME NAME
local miweb
root@docker:~#

2. Crea un contenedor desde la imagen php:7.4-apache donde 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.​

docker run -d --name miweb -p 8080:80 -v miweb:/var/www/html php:7.4-apache
docker ps
root@docker:~# docker run -d --name miweb -p 8080:80 -v miweb:/var/www/html php:7.4-apache
Unable to find image 'php:7.4-apache' locally
7.4-apache: Pulling from library/php
a603fa5e3b41: Pull complete
c428f1a49423: Pull complete
156740b07ef8: Pull complete
fb5a4c8af82f: Pull complete
25f85b498fd5: Pull complete
9b233e420ac7: Pull complete
fe42347c4ecf: Pull complete
d14eb2ed1e17: Pull complete
66d98f73acb6: Pull complete
d2c43c5efbc8: Pull complete
ab590b48ea47: Pull complete
80692ae2d067: Pull complete
05e465aaa99a: Pull complete
Digest: sha256:c9d7e608f73832673479770d66aacc8100011ec751d1905ff63fae3fe2e0ca6d
Status: Downloaded newer image for php:7.4-apache
fe5f52e0f6b1dd279f01f08da715ba683427df974749857b018d7d2437a83099
root@docker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe5f52e0f6b1 php:7.4-apache "docker-php-entrypoi…" 17 seconds ago Up 16 seconds 0.0.0.0:8080->80/tcp miweb
root@docker:~#

3. Utiliza el comando docker cp para copiar un fichero index.html (donde aparece tu nombre) en el directorio /var/www/html.​

 <!DOCTYPE html>
<html>
<body>
<h1>Nombre: Belén Nazareth</h1>
<h2>Prueba de docker</h2>
<img src="https://cataas.com/cat" alt="cat">
</body>
</html>
docker cp index.html miweb:/var/www/html

4. Accede al contenedor desde el navegador para ver la información ofrecida por el fichero index.html.​

docker

5. Borra el contenedor​

docker rm -f miweb
debian@docker:~$ docker rm -f miweb
miweb
debian@docker:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
debian@docker:~$

6. Crea un nuevo contenedor y monta el mismo volumen como en el ejercicio anterior.​

docker run -d --name miweb -p 8080:80 -v miweb:/var/www/html php:7.4-apache

7. Accede al contenedor desde el navegador para ver la información ofrecida por el fichero index.html. ¿Seguía existiendo ese fichero?​

docker

Sí, ya que al montar el volumen, se mantiene la información que se ha guardado en él, y aunque se borre el contenedor, el volumen sigue existiendo.

Vamos a trabajar con bind mount:​

1. Crea un directorio en tu host y dentro crea un fichero index.html (donde aparece tu nombre).​

 <!DOCTYPE html>
<html>
<body>
<h1>Nombre: Belén Nazareth</h1>
<h2>Prueba de docker: bind mount</h2>
<img src="https://cataas.com/cat" alt="cat">
</body>
</html>
mkdir bindmount
mv index.html bindmount/

2. Crea un contenedor desde la imagen php:7.4-apache donde montes en el directorio /var/www/html el directorio que has creado por medio de bind mount.​

docker run -d --name miweb -p 8080:80 -v /home/debian/bindmount:/var/www/html php:7.4-apache
debian@docker:~$ docker run -d --name miweb -p 8080:80 -v /home/debian/bindmount:/var/www/html php:7.4-apache
8c4a49f3523dc94464b67502ac765b1396a24cc2393f2998abecf0403f684adc
debian@docker:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c4a49f3523d php:7.4-apache "docker-php-entrypoi…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp miweb
debian@docker:~$

3. Accede al contenedor desde el navegador para ver la información ofrecida por el fichero index.html.​

docker

4. Modifica el contenido del fichero index.html en tu host y comprueba que al refrescar la página ofrecida por el contenedor, el contenido ha cambiado.​

nano bindmount/index.html
 <!DOCTYPE html>
<html>
<body>
<h1>Nombre: Belén Nazareth</h1>
<h2>Prueba de docker: bind mount 2</h2>
<img src="https://cataas.com/cat" alt="cat">
</body>
</html>

docker

5. Borra el contenedor​

docker rm -f miweb

6. Crea un nuevo contenedor y monta el mismo directorio como en el ejercicio anterior.​

docker run -d --name miweb -p 8080:80 -v /home/debian/bindmount:/var/www/html php:7.4-apache

7. Accede al contenedor desde el navegador para ver la información ofrecida por el fichero index.html. ¿Se sigue viendo el mismo contenido?​

docker

Sí, porque como hemos montado el mismo volumen se mantiene el mismo contenido.

Redes

Despliegue de Nextcloud + mariadb/postgreSQL

Vamos a desplegar la aplicación nextcloud con una base de datos (puedes elegir mariadb o PostgreSQL) (NOTA: Para que no te de errores utiliza la imagen mariadb:10.5). Te puede servir el ejercicio que hemos realizado para desplegar Wordpress. Para ello sigue los siguientes pasos:

1. Crea una red de tipo bridge.​

docker network create nextcloud_network --driver bridge
docker network ls
debian@docker:~$ docker network create nextcloud_network --driver bridge
144e6fc41b25433eb3d1ab5985eb07cf7f3d9e47d0ad4d004595ef9550e0914d
debian@docker:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
d65cf43a13c1 bridge bridge local
c93f21ee2a41 host host local
144e6fc41b25 nextcloud_network bridge local
c3a9f2b27456 none null local
debian@docker:~$

2. Crea el contenedor de la base de datos conectado a la red que has creado. La base de datos se debe configurar para crear una base de datos y un usuario. Además el contenedor debe utilizar almacenamiento (volúmenes o bind mount) para guardar la información. Puedes seguir la documentación de mariadb o la de PostgreSQL.​

docker run -d --name nextcloud-db --network nextcloud_network -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=nextcloud -v nextcloud-db:/var/lib/mysql mariadb:10.5
debian@docker:~$ docker run -d --name nextcloud-db --network nextcloud_network -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=nextcloud -v nextcloud-db:/var/lib/mysql mariadb:10.5
Unable to find image 'mariadb:10.5' locally
10.5: Pulling from library/mariadb
99803d4b97f3: Pull complete
b8bc823a83fd: Pull complete
16685f710f5d: Pull complete
b5660ff63058: Pull complete
fb5880d2d359: Pull complete
baf131972ef1: Pull complete
2969c5907ed8: Pull complete
178375b1f8ce: Pull complete
Digest: sha256:e2e6d26f6419df86e1edef1897fe0e4e28ed40ee65b9b4538e24b0696cc75fd2
Status: Downloaded newer image for mariadb:10.5
372a77b9b0df3ca704a1e9ceae5a4ffa91530c2214dc5938aebd92e112364915
debian@docker:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
372a77b9b0df mariadb:10.5 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp nextcloud-db
89ceb01dbc82 php:7.4-apache "docker-php-entrypoi…" 13 minutes ago Up 12 minutes 0.0.0.0:8080->80/tcp miweb
debian@docker:~$

3. A continuación, siguiendo la documentación de la imagen nextcloud, crea un contenedor conectado a la misma red, e indica las variables adecuadas para que se configure de forma adecuada y realice la conexión a la base de datos. El contenedor también debe ser persistente usando almacenamiento.​

docker run -d --name nextcloud --network nextcloud_network -p 8080:80 -v nextcloud:/var/www/html -e MYSQL_HOST=nextcloud-db -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=nextcloud nextcloud
debian@docker:~$ docker run -d --name nextcloud --network nextcloud_network -p 8080:80 -v nextcloud:/var/www/html -e MYSQL_HOST=nextcloud-db -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=nextcloud nextcloud
59b593b2f420ee3350fd43354c661ae4c936e8d1197681324b9b9401ed1cfeb1
debian@docker:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59b593b2f420 nextcloud "/entrypoint.sh apac…" 14 seconds ago Up 13 seconds 0.0.0.0:8080->80/tcp nextcloud
372a77b9b0df mariadb:10.5 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 3306/tcp nextcloud-db
debian@docker:~$

4. Accede a la aplicación usando un navegador web.​

docker

Entrega​

Almacenamiento con volúmenes docker​

1. Instrucción para crear el volumen docker.​

docker volume create miweb

2. Instrucción para crear el contenedor.​

docker run -d --name miweb -p 8080:80 -v miweb:/var/www/html php:7.4-apache

3. Pantallazo accediendo a la página web.​

docker

4. Instrucción para borrar el contenedor.​

docker rm -f miweb

5. Instrucción para crear de nuevo el contenedor con el volumen y pantallazo accediendo de nuevo a la página.​

docker run -d --name miweb -p 8080:80 -v miweb:/var/www/html php:7.4-apache

docker

Almacenamiento con bind mount​

1. Instrucción para crear el contenedor.​

docker run -d --name miweb -p 8080:80 -v /home/debian/bindmount:/var/www/html php:7.4-apache

2. Pantallazo accediendo a la página web.​

docker

3. Pantallazo accediendo a la página web, después de cambiar el fichero index.html en tu host.​

docker

Redes​

1. Instrucción para crear la red​

docker network create nextcloud_network --driver bridge

2. Instrucción para crear el contenedor de base de datos.​

docker run -d --name nextcloud-db --network nextcloud_network -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=nextcloud -v nextcloud-db:/var/lib/mysql mariadb:10.5

3. Instrucción para crear el contenedor de nextcloud.​

docker run -d --name nextcloud --network nextcloud_network -p 8080:80 -v nextcloud:/var/www/html -e MYSQL_HOST=nextcloud-db -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=nextcloud -e MYSQL_PASSWORD=nextcloud nextcloud

4. Pantallazos accediendo a nextcloud para comprobar que funciona de manera correcta.​

docker