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:
nano package.json
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:
nano .env
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:
docker-compose up -d
Überprüfen Sie die Logs mit:
docker-compose logs
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.