Despliegue de Hotel Nest
Instalación de Docker
Para instalar Docker en el servidor (Debian, en este caso), ejecutamos los siguientes comandos:
for pkg in docker.io docker-doc docker-compose podman-docker \
containerd runc; do sudo apt-get remove $pkg; done
Crear red de Docker
Para crear una red de Docker, ejecutamos el siguiente comando:
sudo docker network create node_mongo
Comprobamos que se ha creado correctamente con el siguiente comando:
sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
d167b3cb6ed3 bridge bridge local
d407dbcf94cc host host local
885425ece5f9 node_mongo bridge local
fa4b3a84c89b none null local
Crear contenedor de MongoDB
sudo docker run -d --name hotelDB --network node_mongo --restart \
unless-stopped -p 127.0.0.1:27017:27017 -v ~/data:/data/db mongo
Con este comando, creamos un contenedor de MongoDB llamado hotelDB que se conecta a la red node_mongo, se reinicia automáticamente si se detiene y se mapea el puerto 27017 del contenedor al puerto 27017 del servidor. Además, se monta el directorio ~/data del servidor en el directorio /data/db del contenedor.
Crear el fichero Dockerfile
nano Dockerfile
# Imagen base
FROM node:latest
# Crear directorio de la aplicación
RUN mkdir -p /usr/src/app
# Establecer directorio de trabajo
WORKDIR /usr/src/app
# Copiar los ficheros package.json y package-lock.json
COPY package*json ./
# Instalar dependencias
RUN npm install
# Copiar el resto de ficheros
COPY . .
# Exponer el puerto 3000
EXPOSE 3000
# Comando de inicio
CMD ["npm", "start"]
Crear el fichero .dockerignore
nano .dockerignore
node_modules
Preparar la aplicación para Docker
cat {path-to-project}/hotel-nest/src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LimpiezaModule } from './limpieza/limpieza.module';
import { AuthModule } from './auth/auth.module';
import { UsuarioModule } from './usuario/usuario.module';
import { MongooseModule } from '@nestjs/mongoose';
import { config } from 'dotenv';
config();
const dbHost = process.env.DEV_DB_HOST || 'hotelDB';
const dbPort = process.env.DEV_DB_HOST_PORT || '27017';
const devDbName = process.env.DB_NAME || 'hotel';
@Module({
imports: [
LimpiezaModule,
MongooseModule.forRoot(`mongodb://${dbHost}:${dbPort}/${devDbName}`),
UsuarioModule,
AuthModule,
UsuarioModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Construir la imagen de Docker
sudo docker build -t hotel-nest .
Comprobamos que se ha creado correctamente con el siguiente comando:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hotel_nest latest 76ccfe099c89 2 hours ago 1.33GB
mongo Latest ff65a94ec485 2 weeks ago 795MB
Ejecutamos el contenedor con el siguiente comando:
sudo docker run -d --name HotelNest --network node_mongo --restart \
unless-stopped -p 3000:3000 hotel_nest
Compromosbar que se ha creado correctamente con el siguiente comando:
docker ps
CONTATNER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bb36a602b9c hotel_nest "docker-entrypoint. S..." 2 hours ago Up 2 hours 0.0.0.0:3000->3000/tcp, ::: 3000->3000/tcp HotelNest
187d7e16ecbf mongo "docker-entrypoint. S..." 2 hours ago Up 2 hours 127.0.0.1:27017->27017/tcp hotelDB
Comprobar que la aplicación funciona
{
"habitaciones": [
{
"_id": "1a1a1a1a1a1a1a1a1a1a1a1a",
"numero": 1,
"tipo": "doble",
"descripcion": "Habitación doble, cama XL, terraza con vistas al mar",
"ultimaLimpieza": "2023-09-20T11:24:00.000Z",
"precio": 59.9,
"incidencias": [
{
"descripcion": "No funciona el aire acondicionado",
"inicio": "2023-09-19T18:12:54.000Z",
"_id": "10011a1a1a1a1a1a1a1a1a1a"
},
{
"descripcion": "No funciona el interruptor del aseo",
"inicio": "2023-09-20T10:15:06.000Z",
"_id": "10021a1a1a1a1a1a1a1a1a1a"
}
],
"__v": 0
},
{
"_id": "2b2b2b2b2b2b2b2b2b2b2b2b",
"numero": 2,
"tipo": "familiar",
"descripcion": "Habitación familiar, cama XL y literas, aseo con bañera",
"ultimaLimpieza": "2023-08-02T10:35:15.000Z",
"precio": 65.45,
"incidencias": [],
"__v": 0
},
{
"_id": "3c3c3c3c3c3c3c3c3c3c3c3c",
"numero": 3,
"tipo": "familiar",
"descripcion": "Habitación familiar, cama XL y sofá cama, cocina con nevera",
"precio": 69.15,
"ultimaLimpieza": "2024-05-18T08:57:42.500Z",
"incidencias": [],
"__v": 0
},
{
"_id": "4d4d4d4d4d4d4d4d4d4d4d4d",
"numero": 4,
"tipo": "suite",
"descripcion": "Habitación con dos camas XL, terraza y vistas al mar",
"ultimaLimpieza": "2023-10-10T12:05:10.000Z",
"precio": 110.2,
"incidencias": [
{
"descripcion": "No funciona el jacuzzi",
"inicio": "2023-10-08T19:24:43.000Z",
"_id": "10014d4d4d4d4d4d4d4d4d4d"
}
],
"__v": 0
}
]
}
{
"habitaciones": [
{
"_id": "5e5e5e5e5e5e5e5e5e5e5e5e",
"numero": 5,
"tipo": "individual",
"descripcion": "Habitación simple, cama 150",
"precio": 34.65,
"ultimaLimpieza": "2024-05-28T08:57:42.501Z",
"incidencias": [],
"__v": 0
}
]
}
Last modified: 26 May 2024