Docker und Node.js: Vereinfachung der Entwicklung mit MongoDB

Die Entwicklung und Bereitstellung von Anwendungen kann mit Docker stark vereinfacht werden. Docker-Container bieten Entwicklern mehrere Vorteile:

  • Konsistente Umgebungen: Sie können die gewünschten Sprachen und Abhängigkeiten auswählen, ohne sich über Systemkonflikte Gedanken machen zu müssen.
  • Isolierte Umgebungen: Dies erleichtert die Fehlersuche und das Onboarding neuer Teammitglieder.
  • Portabilität: Der Code kann verpackt und einfach weitergegeben werden.

In diesem Artikel zeige ich Ihnen, wie Sie eine Entwicklungsumgebung für eine Node.js-Anwendung mit Docker einrichten. Wir werden zwei Container erstellen: einen für die Node.js-Anwendung und einen weiteren für die MongoDB-Datenbank. Unter anderem werden Sie:

  • Den Anwendungscode mit dem Code im Container synchronisieren, um Änderungen während der Entwicklung zu erleichtern.
  • Sicherstellen, dass Änderungen ohne Neustart der Anwendung übernommen werden.
  • Eine passwortgeschützte, persistente Datenbank erstellen.

Am Ende dieses Tutorials wird eine Haifisch-Informationsanwendung in Docker-Containern ausgeführt.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

  • Einen Entwicklungsserver mit Ubuntu 18.04 und einem nicht-root Benutzer mit Sudo-Rechten.
  • Docker und Docker Compose installiert.

Schritt 1 – Projekt klonen und Abhängigkeiten anpassen

Der erste Schritt ist das Klonen des Beispielcodes und das Anpassen der package.json-Datei. Wir fügen nodemon zu den Entwicklungsabhängigkeiten hinzu, sodass die Anwendung automatisch neu startet, wenn Sie Änderungen vornehmen.

Zuerst klonen Sie das Repository:

git clone https://github.com/do-community/nodejs-mongo-mongoose.git node_project
cd node_project

Öffnen Sie die package.json-Datei:

Fügen Sie nodemon unter den Abhängigkeiten hinzu:

"devDependencies": {
  "nodemon": "^1.18.10"
}

Speichern und schließen Sie die Datei.


Schritt 2 – Anwendung für Container anpassen

Nun passen wir den Code so an, dass er besser mit Containern funktioniert. Wir nutzen die process.env-Eigenschaft von Node.js, um dynamisch mit Umgebungsvariablen zu arbeiten.

Öffnen Sie app.js und ändern Sie den Port wie folgt:

const port = process.env.PORT || 8080;
app.listen(port, function () {
  console.log(`App hört auf Port ${port}`);
});

Ändern Sie auch die Datenbankverbindung in db.js, um sensible Informationen nicht im Code zu speichern:

const {
  MONGO_USERNAME,
  MONGO_PASSWORD,
  MONGO_HOSTNAME,
  MONGO_PORT,
  MONGO_DB
} = process.env;

Erstellen Sie eine .env-Datei mit den entsprechenden Umgebungsvariablen:

Fügen Sie die folgenden Zeilen hinzu (mit Ihren eigenen Werten):

MONGO_USERNAME=benutzer
MONGO_PASSWORD=ihr_passwort
MONGO_PORT=27017
MONGO_DB=sharkinfo

Stellen Sie sicher, dass .env sowohl in .gitignore als auch in .dockerignore enthalten ist, um zu verhindern, dass sensible Daten hochgeladen werden.


Schritt 3 – Verbindungseinstellungen für die Datenbank anpassen

Fügen Sie zusätzliche Optionen in db.js hinzu, um Verbindungsabbrüche zu handhaben:

const options = {
  useNewUrlParser: true,
  reconnectTries: Number.MAX_VALUE,
  reconnectInterval: 500,
  connectTimeoutMS: 10000,
};
mongoose.connect(url, options).then(() => {
  console.log('MongoDB ist verbunden');
}).catch(err => {
  console.log(err);
});


Schritt 4 – Dienste mit Docker Compose definieren

Nun erstellen wir die docker-compose.yml-Datei, um die Dienste zu definieren. Der erste Service ist für die Node.js-Anwendung:

version: '3'

services:
  nodejs:
    build:
      context: .
      dockerfile: Dockerfile
    image: nodejs
    container_name: nodejs
    restart: unless-stopped
    env_file: .env
    environment:
      - MONGO_USERNAME=$MONGO_USERNAME
      - MONGO_PASSWORD=$MONGO_PASSWORD
      - MONGO_HOSTNAME=db
      - MONGO_PORT=$MONGO_PORT
      - MONGO_DB=$MONGO_DB
    ports:
      - "80:8080"
    volumes:
      - .:/home/node/app
      - node_modules:/home/node/app/node_modules
    networks:
      - app-network
    command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js

Der zweite Service ist für die MongoDB-Datenbank:

  db:
    image: mongo:4.1.8-xenial
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
      - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
    volumes:
      - dbdata:/data/db
    networks:
      - app-network

Zum Schluss fügen Sie die Netzwerk- und Volumendefinitionen hinzu:

networks:
  app-network:
    driver: bridge

volumes:
  dbdata:
  node_modules:


Schritt 5 – Anwendung testen

Starten Sie die Anwendung mit:

Überprüfen Sie die Logs mit:

Wenn alles korrekt läuft, sollten Sie die Anwendung unter der URL Ihres Servers aufrufen können.


Fazit

Mit dieser Anleitung haben Sie gelernt, wie Sie eine Node.js-Anwendung mit MongoDB in einer Docker-Umgebung entwickeln und betreiben können. Docker erleichtert es Ihnen, Ihre Umgebung zu isolieren, Ihre Daten zu sichern und Ihre Anwendungen nahtlos zu teilen.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Textdatei in Java lesen

Docker-Management: Unbenutzte Images, Container und Volumes entfernen

Docker
Docker-Management: Unbenutzte Images, Container und Volumes entfernen Content1 Einleitung2 Docker-Management: So verwenden Sie diesen Leitfaden3 Docker-Management: Bereinigen von ungenutzten oder überflüssigen Images, Containern, Volumes und Netzwerken4 Docker-Management: Entfernen von Docker-Images5…