In dieser Anleitung werden wir eine Fullstack App mit React Frontend, NodeJS Backend und MongoDB dockerizen. Wir beginnen mit der MongoDB.
- Um deine Full-Stack-App zu starten, benötigst du zunächst einen MongoDB Docker-Container. Du kannst diesen mit folgendem Befehl starten:
docker run --name mongodb --rm -d -p 27017:27017 mongo
- Anschließend startest du das Backend im
/backend
Verzeichnis mit:
node app.js
- Als nächstes startest du das Frontend mit:
npm run start
- Nun sollte die App im Browser laufen.
-
Erstelle eine Dockerfile für das Backend im
/backend
Verzeichnis. -
Baue das Backend mit dem Befehl
docker build
. -
Starte den Backend-Container.
-
Versuche, ein
Goal
im Frontend einzugeben. -
Ändere die Mongoose-Verbindung in
app.js
zu:
mongoose.connect(
'mongodb://host.docker.internal:27017/course-goals',
Im Docker-Kontext bezieht sich "localhost" auf den Container selbst und nicht auf den Host, auf dem der Container ausgeführt wird. Daher kann ein Docker-Container unter "localhost" keine Dienste erreichen, die auf dem Hostsystem laufen, wie z. B. deine MongoDB-Instanz.
Wenn du mongoose.connect('mongodb://localhost:27017/course-goals')
verwendest, versucht dein Backend-Container, eine Verbindung zu einer MongoDB-Instanz herzustellen, die innerhalb desselben Containers läuft. Da sich die MongoDB-Instanz jedoch auf dem Host und nicht im Container befindet, schlägt diese Verbindung fehl.
Der spezielle Hostname host.docker.internal
wird verwendet, um vom Container aus auf den Docker-Host zuzugreifen. Wenn du mongoose.connect('mongodb://host.docker.internal:27017/course-goals')
verwendest, stellt der Backend-Container erfolgreich eine Verbindung zur MongoDB-Instanz her, die auf dem Docker-Host läuft.
Diese Funktion ist besonders nützlich, wenn du Dienste in separaten Containern ausführst (wie in diesem Fall MongoDB und dein Node.js-Backend) und sie miteinander kommunizieren müssen. Es ist wichtig zu beachten, dass host.docker.internal
hauptsächlich für die Entwicklungsumgebung gedacht ist und nicht in einer Produktionsumgebung verwendet werden sollte. In der Produktionsumgebung sollten die Container über ein Docker-Netzwerk miteinander kommunizieren.
- Starte den Backend-Container erneut, vergiss dabei nicht, die Ports richtig zu mappen:
-p 80:80
.
- Erstelle eine Dockerfile für das Frontend mit folgendem Inhalt:
FROM node
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
- Baue und starte das Frontend. Für React benötigst du speziell die
-it
Flag:
docker run --name goals-frontend --rm -d -p 3000:3000 -it goals-react