Saltar al contenido principal

Despliegue

Este laboratorio nos permitirá explorar el uso de tecnologías para el despliegue.

Es importante mencionar que la tecnología que usaremos será en sustituto de un servidor real o una máquina virtual, no es alcance de este laboratorio ahondar en profundidad sobre el uso de docker pero sirve como una introducción básica a las capacidades del mismo.

Objetivo general

Este tutorial está diseñado con el objetivo de simular un entorno de servidor utilizando Docker. Aprenderás a configurar manualmente un servidor web Nginx y desplegar una aplicación Node.js desde un repositorio.

Objetivos específicos

  • Utilizar Docker como simulador de máquina virtual.
  • Acceder al contenedor y ejecutar comandos como en un servidor real.
  • Clonar manualmente un repositorio de GitHub.
  • Configurar manualmente Nginx como servidor web.
  • Desplegar una aplicación Node.js con Express.
  • Verificar el despliegue a través de una URL.

Requisitos Previos

  • Docker instalado. Instala Docker Compose por facilidad.
  • Acceso a Internet para descargar imágenes y repositorios
  • Conocimientos básicos de comandos Linux
  • Repositorio de ejemplo o propio con el código a desplegar.

Nota si tienes problemas en Mac abriendo docker compose consulta el siguiente link.

Para que el proceso de docker se ejecute deberás abrir docker compose y dejarlo ejecutando.

Paso 1 - Crea una la imagen del docker

Crea un archivo Dockerfiley agrega lo siguiente:

FROM ubuntu:22.04

# Evitar interacciones durante la instalación de paquetes
ENV DEBIAN_FRONTEND=noninteractive

# Actualizar e instalar paquetes necesarios
RUN apt-get update && apt-get install -y \
curl \
git \
nano \
vim \
nginx \
gnupg \
ca-certificates \
sudo \
&& apt-get clean

# Configurar Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y nodejs

# Crear usuario para simular experiencia normal de servidor
RUN useradd -m -s /bin/bash estudiante \
&& echo "estudiante:password" | chpasswd \
&& usermod -aG sudo estudiante

# Exponer puertos
EXPOSE 80 3000

# Mantener el contenedor ejecutándose
CMD ["tail", "-f", "/dev/null"]

Ahora construye la imagen ejecutando el siguiente comando:

docker build -t servidor-virtual .

Espera a que se genere la nueva imagen

De manera resumida estamos creando una imagen como crearíamos un servidor para AWS, Google Cloud, Azure o cualquier proveedor en la nube de un servidor, la diferencia de hacerlo directamente en nuestra máquina es que simularemos un entorno virgen para poder modificarlo a nuestro antojo.

Docker no es lo mismo que una máquina virtual pero nos permite configurar un contenedor como una para poder realizar experimentos como este.

Para saber que la imagen se creó correctamente, abre docker compose y deberías ver la imagen que acabamos de crear.

deploy

Para iniciar el contenedor y mantenerlo en ejecución:

docker run -d --name mi-servidor -p 80:80 -p 3000:3000 servidor-virtual

Esto dejará corriendo el servidor, ahora para asegurarte que está corriendo ejecuta

docker ps

Esto te mostrará una tabla como la siguiente:

CONTAINER ID   IMAGE              COMMAND               CREATED         STATUS         PORTS                                        NAMES
3a7fa64f27c8 servidor-virtual "tail -f /dev/null" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:3000->3000/tcp mi-servidor

El CONTAINER IDes único y es el process id que identifica que tu contenedor está corriendo, cuando quieras detenerlo deberás usar este identificador.

Paso 2 - Accede al servidor virtual

Para acceder al contenedor como si fuera una máquina virtual:

docker exec -it mi-servidor bash

Una vez dentro, puede cambiar al usuario estudiante:

su estudiante

La contraseña es password.

Paso 3 - Despliegue Manual de la aplicación

Ahora vamos a clonar el repositorio de ejemplo. Crea un directorio aplicacion

# Crea directorio de la aplicación
mkdir aplicacion
cd aplicacion

#Clona el repositorio
git clone https://github.com/black4ninja/deploy-react-node-2025

Instala y ejecuta la aplicación, si usas el repositorio ejemplo que ya tenemos podrás construirlo todo desde el package.json que ya está configurado.

npm run deploy

Si tienes problemas construyendo solo ejecuta desde la carpeta del frontend:

npm i
npm run build

Y después desde la carpeta del `server``

# Instalar dependencias
npm install

# Instalar pm2
sudo npm i -g pm2

# Verificar que la aplicación está ejecutándose
pm2 start server.js

Paso 4 - Configuración de NGINX

Cambia de carpeta a la siguiente:

cd /etc/nginx/sites-available

Y ahora crea un archivo al que llamaremos nodejs-app, estos archivos por lo general llevan el nombre del dominio que vamos a utilizar.

sudo nano nodejs-app

Agrega el siguiente contenido

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

Ahora activa la configuración y reinicia NGINX

# Crear enlace simbólico para activar el sitio
sudo ln -s /etc/nginx/sites-available/nodejs-app /etc/nginx/sites-enabled/

# Eliminar la configuración por defecto (opcional)
sudo rm /etc/nginx/sites-enabled/default

# Verificar la configuración
sudo nginx -t

# Reiniciar Nginx
sudo systemctl restart nginx

Paso 5 - Verifica el despliegue

Abre un navegador y accede a

Si todo está configurado correctamente, debería ver la aplicación Node.js funcionando a través de Nginx.

Paso 6 - Ejercicios para continuar

Parte 6: Ejercicios Prácticos para Estudiantes

  • Modificar la aplicación: Hacer un cambio en el código, detener la aplicación actual y reiniciarla.
  • Consultar los logs: Verificar los logs de Nginx (/var/log/nginx/access.log y /var/log/nginx/error.log).
  • Configurar un dominio local: Modificar el archivo /etc/hosts dentro del contenedor para simular un dominio.
  • Implementar HTTPS: Configurar certificados autofirmados y habilitar HTTPS en Nginx.
  • Crear un script de inicio: Desarrollar un script que inicie automáticamente la aplicación cuando se reinicie el servidor.

Terminar la sesión actual

Deberás cerrar sesión en estudiantey en root.

Ejecuta el comando hasta que regreses a tu terminal.

exit

Guardar imagen actual

Si detienes el contenedor y lo borras perderás tu configuración actual del servidor, para ello deberás crear una nueva imagen

docker commit mi-servidor mi-servidor-configurado

deploy

Gestiona tu contenedor

Detener el contenedor

docker stop mi-servidor

Iniciar el contenedor detenido

docker start mi-servidor

Eliminar el contenedor

docker rm mi-servidor

Ver los logs del contenedor

docker logs mi-servidor

Crea nuevamente tu servidor configurado

docker run -d --name mi-servidor -p 80:80 -p 3000:3000 mi-servidor-configurado
docker exec -it mi-servidor bash

Una vez dentro, puede cambiar al usuario estudiante:

su estudiante

No olvides iniciar la aplicación

pm2 start server.js

Y lo mismo con NGINX

sudo service nginx start

Conclusión

Este laboratorio proporciona una experiencia práctica de despliegue manual similar a la que encontrarían en un entorno de servidor real, pero utilizando Docker como una herramienta de virtualización ligera. Al finalizar, habrás aprendido:

  • Cómo trabajar en un entorno Linux
  • Los pasos para desplegar manualmente una aplicación Node.js
  • Cómo configurar Nginx como servidor web y proxy inverso
  • Técnicas básicas de solución de problemas en entornos de servidor

Esta experiencia te dará una base sólida antes de avanzar hacia métodos más automatizados de despliegue y contenedorización.