En este tutoriar crearemos la típica aplicación web que hace un recuento de visitas.
Construiremos esta aplicación con node js y redis.
Node js será la parte que servirá la aplicación web y redis lo utilizaremos como base de datos para hacer el recuento de vistitas.
Aplicación web
Primero vamos a construir la aplicación web.
Para ello crearemos el directori visistas con mkdir visitas y abriremos una instancia de visual studio code en este directorio para empezar a trabajar.
package.json
Creamos el ficher package.json con el siguiente contenido.
{
"dependencies": {
"express":"*",
"redis": "2.8.0"
},
"scripts": {
"start": "node index.js"
}
}
index.js
Crearemos ahora el fichero con el que iniciarà nuestro servidor.
const express = require("express");
const redis = require("redis");
const app = express();
const client=redis.createClient();
client.set('visits',0);
app.get('/',(req,res)=>{
client.get('visits',(err,visits)=>{
res.send('Number of visits is'+visits);
client.set('visits',parseInt(visits)+1);
});
});
app.listen(8081,()=>{
console.log('Escuchado puerto 8081');
});
Creando Dockerfile
Vamos a crear un dockerfile para la aplicación web, de momento no estará relacionado con redis.
FROM node:alpine
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
CMD ["npm","start"]
Como podéis ver es muy similar al de los tutoriales anteriores.
Constuir la imagen
Para construir la imagen ejecutamos docker build .

No olvidemos que podemos etiquetar esta imagen con
dooker build -t enguillem/visitas:latest . (usad vuestro usuario de dockerhub)

Ahora tendremos que pensar de que forma podemos poner en marcha todo esto con otro contenedor que funcione con redis
Contenedor para redi
Si tratamos de arrancar la imagen así como está recibiremos un error de conexión al servidor redis.

Podríamos pensar que ejecutando un contendor con redis descargado de dockerhub ya podríamo funcionar.
Si lo hacemos en otro terminal tendríamos un servidor de redis corriendo

Si ahora volvemos a la imagen montada con Dockerfile y la volvemos a ejectuar seguiremos teniendo el mismo error, no hay una conexión con este contenedor redis.

Estos dos contenedores están totalmente aislados, debemos realizar algún tipo de conexión entre ellos.
Para ello utilizaremos una herramienta para este tipo de conexiones, docker-compose
Que es docker compose
Es un cliente instalado juntamente con docker
Sirve para ejecutar múltiples contenedores al mismo tiempo
Nos permite automatizar la ejecución de ‘docker run’
Lo que haremos es coger las instrucciones de build i run:
docker build -t enguillem/visits:latest
docker tun -p 8080:8080 enguillem/visits
-----------------------------------------
Las integramos en un --->> docker-compose.yml (sintaxis especial) i el cliente docker-compose se encargará de empaquetarlo todo
Que incluirá nuestro docker-compose.yml
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"

Docker compose creará dos contenedore en una misma red, la relación de puertos solamente es para nuestra máquina principal.
Ahora tenemos que modificar el fichero index.js para indicar donde ir a buscar el servidor de redis.
const express = require("express");
const redis = require("redis");
const app = express();
const client=redis.createClient({
host: 'redis-server',
port: 6379
});
client.set('visits',0);
app.get('/',(req,res)=>{
client.get('visits',(err,visits)=>{
res.send('Number of visits is'+visits);
client.set('visits',parseInt(visits)+1);
});
});
app.listen(8081,()=>{
console.log('Escuchado puerto 8081');
});
Ejecutar todos los contenedores
construir los contenedore
docker-compose up

Lo primero que hace docker-compose es crear una red
Podemos ver todo lo que crea docker-compose, y el mesaje final parece que todo está funcionando
Como hemos cambiado el puerto del cliente debemos ir a la siguiente url

Si actualizamos varias veces se incrementa el número de visitas

Detener contenedores
Ejecutar en background
docker-compose up -d
Parar contenedores
docker-compose down