Crear un contenedor Docker que incluye Node.js, MongoDB, Adminer y NGINX Proxy Manager para SSL utilizando Docker Compose.

Tiempo de lectura: 3 minutos

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:

  1. nodejs: utiliza la imagen de Node.js 14 y expone el puerto 3000. También define una variable de entorno MONGO_URI para que la aplicación Node.js pueda conectarse a la base de datos MongoDB.
  2. mongo: utiliza la imagen de MongoDB y crea un volumen para almacenar los datos de la base de datos.
  3. adminer: utiliza la imagen de Adminer y expone el puerto 8080.
  4. 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 Manager
  • letsencrypt: para almacenar los certificados SSL generados por Let’s Encrypt
  • var: 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

Deja un comentario