Tienes dos imágenes Docker disponibles en Docker Hub:
silvelo/todo-backend
silvelo/todo-client
El objetivo de este ejercicio es desplegar ambos contenedores y configurarlos para que se comuniquen entre sí utilizando una red personalizada en Docker.
-
Crea una red personalizada llamada
todo-network
que permita la comunicación entre los contenedores.Ver comandos
docker network create todo-network
-
Inicia un contenedor basado en la imagen
silvelo/todo-backend
y añádelo a la redtodo-network
(Asegúrate de exponer el puerto3000
para el backend)Ver comandos
# Cualquiera de los siguiente comandos docker run -d -p 3000:3000 --network todo-network silvelo/todo-backend docker run -d -p 3000:3000 --network todo-network --hostname backend_host --name todo-backend silvelo/todo-backend # Exponer el puerto , añadirla al todo-network, ponerle nombre al host y nombre al contenedor
Ver comandos
# Alternativa docker run -d -p 3000:3000 --hostname backend_host --name todo-backend silvelo/todo-backend # Exponer el puerto , añadirla al todo-network, ponerle nombre al host y nombre al contenedor # Gestionamos la redes para añadir la creada y eliminar la defecto docker network connect todo-network todo-backend docker network disconnect bridge todo-backend
Ver comandos
# Ver la ip asignada y los nombres docker inspect todo-backend
... "Networks": { "todo-network": { .... "Gateway": "172.18.0.1", "IPAddress": "172.18.0.2", "DNSNames": [ "todo-backend", "652cd92cd632", "backend_host" ] } }
-
Inicia un contenedor basado en la imagen
silvelo/todo-client
y conéctalo también a la redtodo-network
.Ver comandos
# Descargar y editar el fichero de nginx: backend_host, todo-backend, 172.18.0.2 ó 652cd92cd632 location /api/ { proxy_pass http://backend_host:3000; # URL de tu servidor backend proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
Ver comandos
# Alternativa docker run -d -p 8080:80 -v .\nginx\nginx.conf:/etc/nginx/nginx.conf --hostname client_host --name todo-client --network todo-network silvelo/todo-client # Exponer el puerto , añadirla al todo-network, ponerle nombre al host y nombre al contenedor. # Comando -v monta el el fichero .\nginx\nginx.conf en el contenedor, en la ruta /etc/nginx/nginx.conf. Es necesario asegurarse que el fichero .\nginx\nginx.conf existe y la ruta es correcta (Usar rutas relativas o absolutas)
-
Asegúrate de que la aplicación frontend pueda acceder al backend a través del nombre del servicio (
todo-backend
) en lugar de una dirección IP.
- Crear una nueva nota
- Ver las notas creadas
Vamos a añadir una base de datos MongoDB y configurar la red para que solo sea accesible por el backend.
- Crear un nueva red backend.
Ver comandos
docker network create todo-backend
- Añade un contenedor basado en la imagen oficial de
mongo
.
Ver comandos
docker run -it -d -p 27017:27017 --network todo-backend --name mongo --hostname mongo_host mongo
#Exponer el puerto
- El backend debe poder conectarse tanto al cliente como a MongoDB.
Ver comandos
# Paramos y borramos el actual para configurar el nuevo
docker rm -f todo-backend
# Configuramos el nuevo con la variable de entorno
docker run -d -p 3000:3000 --hostname backend_host -e USE_MEMORY_DB=false --name todo-backend --network todo-backend silvelo/todo-backend
# El contenedor después de un tiempo fallará porque no encuentra mongo en la default URL
docker rm -f todo-backend
docker run -d -p 3000:3000 --hostname backend_host -e USE_MEMORY_DB=false -e DATABASE_URI=mongodb://mongo_host:27017/notes --name todo-backend --network todo-backend silvelo/todo-backend
# Añadimos la otra red (todo-network) al container (todo-backend)
docker network connect todo-network todo-backend
# Comprobamos que están la redes asignadas
docker inspect todo-backend
"Networks": {
"todo-backend": {
....
"IPAddress": "172.19.0.3",
"DNSNames": [
"todo-backend",
"eed95a645151",
"backend_host"
]
},
"todo-network": {
...
"IPAddress": "172.18.0.2",
"DNSNames": [
"todo-backend",
"eed95a645151",
"backend_host"
]
}
}
-
Descargar mongo Compass
-
Añadir notas desde el cliente
-
Comprobamos la base de datos que existe ``notes` y su contenido
Partiendo del ejercicio de redes donde se conectan las aplicaciones todo-backend
y todo-client
, realiza lo siguiente:
- Crea un volumen nombrado para almacenar la base de datos de MongoDB y añade dicho volume al contenedor.
Ver Comandos
docker volume create mongo_db
docker run -it -d -p 27017:27017 --network todo-backend -v mongo_db:/data/db --name mongo --hostname mongo_host mongo
docker inspect mongo
"Mounts": [
{
"Type": "volume",
"Name": "mongo_db",
"Source": "/var/lib/docker/volumes/mongo_db/_data",
"Destination": "/data/db",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
},
- Inserta algunas entradas de ejemplo en la base de datos de MongoDB a través del backend.
- Elimina el contenedor de MongoDB.
Ver Comandos
docker rm -f mongo
Ver Comandos
docker run -it -d -p 27017:27017 --network todo-backend -v mongo_db:/data/db --name mongo --hostname mongo_host mongo
Partiendo del ejercicio anterior:
- Haz una copia del volumen en un directorio local.
Ver Comandos
docker cp mongo:/data/db ./mongo_db
- Creamos una nueva máquina de mongo con un volume de tipo bind.
Ver Comandos
# Tanto el nombre como el puerto(27017) estarán siendo usados por el primer mongo.
docker run -it -d -p 27018:27017 -v .\mongo_db\:/data/db --name mongo_2 mongo
- Crea una nueva instancia de mongo con un volume anónimo e inspecciona la información de los volumenes.
Ver Comandos
# Tanto el nombre como el puerto(27017) estarán siendo usados por el primer mongo.
docker run -it -d -p 27019:27017 --name mongo_3 mongo
docker inspect mongo_3
{
"Type": "volume",
"Name": "676ad7f60cc74e3c341b98d2fe8709a9d58b53910617ee43cb3c633c87ce8c08",
"Source": "/var/lib/docker/volumes/676ad7f60cc74e3c341b98d2fe8709a9d58b53910617ee43cb3c633c87ce8c08/_data",
"Destination": "/data/db",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
-
Inserta algunas entradas de ejemplo en la base de datos de MongoDB.
-
Detén y borra el contenedor.
Ver Comandos
docker stop mongo_3
docker rm mongo_3
- Recupera los datos del volume e intenta montarlos en otro contenedor.
Ver Comandos
cp -R /var/lib/docker/volumes/676ad7f60cc74e3c341b98d2fe8709a9d58b53910617ee43cb3c633c87ce8c08 mongo_backup
# ó (Windows)
\\wsl$\docker-desktop-data\data\docker\volumes\676ad7f60cc74e3c341b98d2fe8709a9d58b53910617ee43cb3c633c87ce8c08
docker run -it -d -p 27020:27017 -v ./mongo_backup:/data/db mongo