← Zurück zur Übersicht Müll dir dein Windows nicht zu: PostgreSQL & pgAdmin isoliert in Docker

Müll dir dein Windows nicht zu: PostgreSQL & pgAdmin isoliert in Docker

[WERBUNG: CONTENT OBEN]

Schluss mit lokalen Datenbank-Installationen!

Wer kennt das nicht: Für das neue Node.js- oder Python-Projekt wird schnell eine relationale PostgreSQL-Datenbank benötigt. Der klassische Entwickler-Weg? Die Datenbank direkt nativ auf macOS oder Windows installieren. Das Resultat? Nach zwei Jahren lungern fünf verschiedene Datenbank-Versionen unkontrolliert als Hintergrunddienste auf dem System herum, verbrauchen massiv CPU-Ressourcen und verursachen fatale Port-Konflikte.

Die smarte, saubere Lösung für Webentwickler lautet: Isolierung durch Docker Compose.

In diesem praxiserprobten Guide zeige ich dir, wie du dir innerhalb von 3 Minuten eine extrem sichere, lokale Datenbank-Umgebung hochziehst – und sie am Ende deines Projekts spurlos wieder von deiner Festplatte entfernen kannst.

Vorbereitung: Isoliertes Projekt-Setup

Psychologische Sicherheit und ein sauberes File-Management beim Entwickeln beginnen mit einem aufgeräumten Dateisystem. Wir starten nicht blind auf dem Desktop, sondern isolieren unsere Datenbank-Konfiguration in einem brandneuen, absolut leeren Verzeichnis. So weißt du immer genau, wo welche Ressourcen liegen.

Öffne dein Terminal und führe diese grundlegenden Befehle aus:

mkdir pg-local-dev
cd pg-local-dev

Von nun an fügen wir Dateien nur noch in diesem Ordner hinzu!

Die perfekte Docker Compose Struktur

Um unsere Datenbankstruktur professionell aufzubauen (nach dem modernen "Infrastructure as Code" Prinzip), greifen wir auf eine einfache Konfigurationsdatei zurück. Wir integrieren zudem nicht nur den puren PostgreSQL Server, sondern als Bonus direkt das beliebte grafische Open-Source Management-Tool pgAdmin. Damit kannst du sofort bequem per Browser Tabellen bearbeiten und SQL Querys testen.

Erstelle innerhalb deines neuen Verzeichnisses diese Textdateien:

pg-local-dev/.env:

# Sichere Definition der Zugangsdaten als isolierte Variablen
POSTGRES_USER=admin
POSTGRES_PASSWORD=supergeheimespasswort
POSTGRES_DB=meine_test_db

[email protected]
PGADMIN_DEFAULT_PASSWORD=admin

pg-local-dev/package.json:

{
  "dependencies": {
    "express": "^4.18.2",
    "pg": "^8.11.3"
  }
}

pg-local-dev/server.js (Die Mini-API, die sich live mit der DB verbindet):

const express = require('express');
const { Pool } = require('pg');

const app = express();
const pool = new Pool({
  // Hier nutzen wir den internen Docker-Servicenamen "db"
  connectionString: 'postgres://admin:supergeheimespasswort@db:5432/meine_test_db'
});

app.get('/', async (req, res) => {
  try {
    const result = await pool.query('SELECT NOW() as aktuelle_zeit');
    res.json({
      status: 'Erfolg! Die Node.js API redet mit PostgreSQL!',
      db_zeit: result.rows[0].aktuelle_zeit
    });
  } catch (err) {
    res.status(500).json({ fehler: err.message });
  }
});

app.listen(3000, () => console.log('API läuft auf Port 3000'));

pg-local-dev/docker-compose.yaml:

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    container_name: local_postgres_db
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "5432:5432"
    volumes:
      # Speichert die physischen DB-Dateien auf dem Host, damit die Daten einen Container-Neustart überleben
      - pg_data:/var/lib/postgresql/data

  pgadmin:
    image: dpage/pgadmin4
    container_name: local_pgadmin
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "5050:80"
    depends_on:
      - db

  # Unsere Node.js App als Konsument
  api:
    image: node:18-alpine
    container_name: local_node_api
    working_dir: /app
    volumes:
      - ./server.js:/app/server.js
      - ./package.json:/app/package.json
    command: sh -c "npm install && node server.js"
    ports:
      - "3000:3000"
    depends_on:
      - db

volumes:
  pg_data:

Startschuss: Umgebung sicher hochfahren

Da wir alles logisch in einer docker-compose.yaml modelliert haben, entfällt das mühsame, fehleranfällige Abtippen von endlosen docker run-Ketten inkl. manuellen Netzwerkbrücken. Docker sorgt nun automatisch dafür, dass Node.js und PostgreSQL im selben Netzwerk miteinander kommunizieren können.

Befehle deinem System, deine gesamte Datenbank-Infrastruktur lautlos im Hintergrund aufzubauen:

docker compose up -d --build

⚠️ 📸 SCREENSHOT ANFRAGE: Hier einen Screenshot vom Terminal einfügen, der den erfolgreichen Start der Container (local_postgres_db, local_pgadmin, local_node_api) zeigt.

Die Datenbank erfolgreich nutzen

  1. Die Node.js API testen: Ruf einfach http://localhost:3000 in deinem Browser auf. Du siehst sofort die JSON-Antwort, dass dein Datenbank-Query (aktuelle Server-Zeit) erfolgreich war!
  2. Datenbank-Management: Wenn du dir schnell einen grafischen Überblick über deine Tabellen verschaffen oder Daten bearbeiten willst, wechsle einfach in deinen Webbrowser auf: 👉 http://localhost:5050

Logge dich dort mit der PGADMIN_DEFAULT_EMAIL und dem Passwort aus der .env Datei ein. Beim Einrichten des Servers in pgAdmin gibst du als Hostname deiner neuen Datenbank dann nicht localhost, sondern intern ganz einfach db (der Service-Name aus unserer YAML-Datei) an.

⚠️ 📸 SCREENSHOT ANFRAGE: Hier einen Screenshot von pgAdmin (Browser) einfügen, der die erfolgreiche Verbindung zur PostgreSQL-Datenbank zeigt.

Alternativ kannst du dich aus Visual Studio Code verknüpfen (z.B. mit der Erweiterung SQLTools). Gib dort einfach Server localhost und Port 5432 ein, da wir den Port nach außen freigegeben haben.

Fazit

Mit der Anlage von lediglich zwei simplen Dateien (.env und docker-compose.yaml) innerhalb deines isolierten Projektordners hast du dir das fehlerbehaftete, manuelle Installieren einer nativen Datenbank für alle Ewigkeit erspart. Du kannst diese Struktur nun für zukünftige Setups sofort kopieren, um für jedes deiner IT-Projekte in Sekunden eine komplett frische, isolierte Instanz bereitzustellen!

[WERBUNG: CONTENT UNTEN]