En este tutorial, aprenderás cómo crear un contenedor Docker que incluye Node.js, MongoDB, Adminer y NGINX Proxy Manager para SSL utilizando Docker Compose.
Paso 1: Crear el archivo docker-compose.yml
Primero, crea un nuevo directorio en tu computadora para el proyecto y luego crea un archivo docker-compose.yml
en el directorio raíz. Este archivo definirá los servicios de Docker que vamos a utilizar.
Agrega lo siguiente al archivo docker-compose.yml
:
version: '3.9' services: nodejs: image: node:14 restart: always ports: - "3000:3000" volumes: - ./app:/app working_dir: /app command: npm run start environment: - NODE_ENV=production - MONGO_URI=mongodb://mongo:27017/mydatabase mongo: image: mongo:latest restart: always volumes: - mongo-data:/data/db adminer: image: adminer:latest restart: always ports: - "8080:8080" nginx-proxy-manager: image: jlesage/nginx-proxy-manager container_name: nginx-proxy-manager ports: - "80:80" - "443:443" environment: - UID=1000 - GID=1000 volumes: - ./nginx-proxy-manager/data:/config - ./nginx-proxy-manager/letsencrypt:/etc/letsencrypt - ./nginx-proxy-manager/var:/var
Este archivo define cuatro servicios de Docker:
nodejs
: utiliza la imagen de Node.js 14 y expone el puerto 3000. También define una variable de entornoMONGO_URI
para que la aplicación Node.js pueda conectarse a la base de datos MongoDB.mongo
: utiliza la imagen de MongoDB y crea un volumen para almacenar los datos de la base de datos.adminer
: utiliza la imagen de Adminer y expone el puerto 8080.nginx-proxy-manager
: utiliza la imagen de NGINX Proxy Manager y expone los puertos 80 y 443 para HTTPS. También define volúmenes para almacenar la configuración, los certificados SSL y los registros de NGINX.
Paso 2: Crear la aplicación Node.js
Ahora necesitamos crear la aplicación Node.js. En este tutorial, utilizaremos un ejemplo simple que muestra cómo conectarse a la base de datos MongoDB.
Primero, crea un nuevo directorio app
dentro del directorio raíz. Luego, crea un archivo app/index.js
con el siguiente contenido:
const express = require('express'); const mongoose = require('mongoose'); const app = express(); mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true }); const db = mongoose.connection; db.on('error', console.error.bind(console, 'MongoDB connection error:')); app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(3000, () => { console.log('Example app listening on port 3000!'); });
Este archivo define una aplicación Node.js básica con una ruta raíz que devuelve un mensaje de saludo y se conecta a la base de datos MongoDB utilizando la variable de entorno MONGO_URI
.
Luego, crea un archivo app/package.json
con el siguiente contenido:
Luego, crea un archivo app/package.json
con el siguiente contenido:
json
{ "name": "nodejs-mongodb-docker", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "node index.js" }, "author": "", "license": "ISC", "dependencies": { "express": "^4.17.1", "mongoose": "^5.13.8" } }
Este archivo define las dependencias de la aplicación y un script de inicio que ejecuta el archivo index.js
.
Paso 3: Crear los directorios y archivos necesarios
Ahora necesitamos crear algunos directorios y archivos adicionales para la configuración de NGINX Proxy Manager y para almacenar los certificados SSL.
Crea un nuevo directorio nginx-proxy-manager
dentro del directorio raíz. Luego, dentro del directorio nginx-proxy-manager
, crea los siguientes directorios:
data
: para almacenar la configuración de NGINX Proxy Managerletsencrypt
: para almacenar los certificados SSL generados por Let’s Encryptvar
: para almacenar los registros de NGINX
Dentro del directorio nginx-proxy-manager/data
, crea un archivo default.conf
con el siguiente contenido:
server { listen 80; listen [::]:80; server_name localhost; location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name localhost; ssl_certificate /etc/letsencrypt/live/nginx-proxy-manager/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/nginx-proxy-manager/privkey.pem; location / { proxy_pass http://nodejs:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; } location /adminer/ { proxy_pass http://adminer:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; } }
Este archivo define dos servidores NGINX: uno que redirige todas las solicitudes HTTP a HTTPS, y otro que maneja las solicitudes HTTPS y las redirige a la aplicación Node.js y a Adminer.
Paso 4: Ejecutar el contenedor
Finalmente, podemos ejecutar el contenedor utilizando Docker Compose.
Abre una terminal en el directorio raíz del proyecto y ejecuta el siguiente comando:
docker-compose up -d
Este comando descargará las imágenes de Docker necesarias y creará los contenedores. Una vez que se complete la ejecución, podrás acceder a la aplicación Node.js en tu navegador en la dirección http://localhost:3000
y a Adminer en http://localhost:8080
. Además, NGINX Proxy Manager estará disponible en http://localhost
.
Para generar los certificados SSL con Let’s Encrypt, inicia sesión en NGINX Proxy Manager utilizando las credenciales predeterminadas (correo electrónico admin@example.com
y contraseña changeme
) y sigue las instrucciones en la interfaz web.
Conclusión
En este tutorial, aprendiste cómo crear un contenedor Docker que incluye Node.js, MongoDB, Adminer y NGINX Proxy Manager para SSL
Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.