Containerisierung bedeutet, eine Anwendung, ihre Abhängigkeiten und Bibliotheken zusammenzubündeln, sodass sie wie Plug-and-Play auf jeder Art von Infrastruktur verwendet werden können. Jedes Bündel wird als Container bezeichnet.
Warum einen Node.js-Dienst containerisieren?
Wie im letzten Abschnitt besprochen, würde die Containerisierung eines Node.js-Dienstes bedeuten, die App, ihre Abhängigkeiten, Bibliotheken und sogar die Konfiguration in einen Container zu bündeln.Containerisierung hat folgende Vorteile:
- Portabel. Da wir alle Anforderungen der App in einem Container gebündelt haben, können dieselben Images in der Entwicklungs-, Test- und Produktionsumgebung installiert werden.
- Schnell und leichtgewichtig. Container sind in der Regel viel schneller als virtuelle Maschinen (VMs) oder Bare-Metal, da sie nur die Anforderungen der App ausführen, während historisch gesehen die VMs oder Bare-Metal die gesamte Maschine und alle Apps starten würden.
- Skalierbar. Mit den oben genannten zwei Vorteilen wird die Skalierbarkeit sehr einfach, da die Container schnell, effizient und einfach bereitzustellen sind.
In diesem Artikel werden wir uns speziell auf die Containerisierung einer Node.js-App konzentrieren.
Voraussetzungen
Werkzeuge und Software
Docker (Docker Engine und Docker CLI)
Wir müssen Docker installieren um unsere Container zu verwalten. Docker Engine verwaltet die Laufzeit, und die CLI kann verwendet werden, um über die Kommandozeile zu interagieren.
Node.js und npm/yarn installiert (für die anfängliche Entwicklung/Tests)
Wir benötigen Node.js und npm, um die Abhängigkeiten der Bibliotheken zu installieren und den Dienst auszuführen.
Kubernetes oder Docker Compose zur Verwaltung mehrerer Container (optional)
Wir benötigen Kubernetes oder Docker Compose, um mehrere Container zu verwalten.
Grundlagen
Node.js-Anwendungsstruktur:
- Es wird erwartet, dass der Leser bereits die Rolle der Hauptdatei (
app.js
oderindex.js
) im Projekt versteht, zusammen mit der Rolle anderer Dateien wiepackage.json
undyarn.lock
. - Dieser Artikel wird auch nicht auf andere Aspekte des Projekts eingehen, wie Controller, Middleware und Routen.
Grundlegende Docker-Befehle und Dockerfile-Syntax
Docker-Befehle:
docker ps -> Lists all the containers running on the system
docker pull -> Pulls any image from the docker hub or official registry of Docker
docker build -> Creates an image from the docker file
docker run -> Starts a container from an exiting image
docker stop -> Stops a container if it has crashed or if you want to switch the container
Kernanweisungen für Dockerfile:
FROM -> Every DockerFile
WORKDIR -> Set the working directory inside the container
COPY (or ADD) -> Transfers the application's files to the image
RUN -> Executes commands during build time
CMD -> Sets the default command to be run when the container is started from the image
EXPOSE -> Specifies the port the container listens on
ENV -> Sets environment variables used during build and runtime
Die beiden behandelten Tabellen und die Node.js-Struktur sind ausreichend, um mit der Containerisierung zu beginnen und Ihren Node.js-Dienst bereitzustellen.
Einrichten des Node.js-Dienstes
Einrichten der Node.js-Umgebung ist ein unkomplizierter Prozess. Stellen Sie sicher, dass Node.js auf Ihrem Rechner installiert ist. Wenn Sie Zweifel haben, sehen Sie bitte im Anhang (1) nach. Sobald installiert, öffnen Sie Ihre Konsole und überprüfen Sie die Installation, indem Sie Folgendes eingeben: .
node -v
npm -v
Erstellen Sie ein Projektverzeichnis und initialisieren Sie Ihr Projekt wie folgt:
npm init -y
Installieren Sie das Express-Modul
npm install express
Erstellen Sie eine Serverdatei, nennen wir sie server.mjs, in der wir die Route und die entsprechende Logik zur Route hinzufügen können. Da dieser Artikel mehr über Containerisierung handelt, halten wir die Endpunklogik sehr einfach. Etwas in dieser Art:
import express from "express";
const app = express();
const port = 8080;
app.get('/', (req, res) => {
res.send('Welcome to my demo service!');
});
app.listen(port, () => {
console.log(`Demo Service is running on port ${port}`);
});
Jetzt ist der Dienst bereit, um gestartet zu werden, navigieren Sie zum Projektverzeichnis im Terminal und führen Sie diesen Befehl aus:
node server.mjs
Der Dienst läuft und funktioniert; wenn wir besuchen http://localhost:3000, werden wir sehen:
„Willkommen auf meinem Server“
Erstellen des Dockerfiles
Lass uns überarbeiten, was ein Dockerfile ist, es enthält die Anweisungen zum Erstellen des Docker-Images. Lass uns ein Dockerfile im Stammverzeichnis erstellen. Während dieses Schrittes, wie wir in den Dockerfile-Anweisungen besprochen haben, müssen wir die folgenden Dinge tun:
FROM node:18-alpine => Indicate the base image to use. Here we're using the official Nodejs 14 image.
WORKDIR /usr/src/app => Sets the working directory in the container.
COPY package*.json ./ => Duplicate the package.json and package-lock.json files to the working directory.
RUN npm install => Installs the app package dependencies.
COPY . . => Copies the remaining of the app to the working directory.
EXPOSE 8080 => Exposes the port our app is listening on.
CMD ["node", "app.js"] => Defines the command to start your Node.js application.
Erstellen und Ausführen des Docker-Images
Vom Stammverzeichnis des Terminals aus navigieren Sie zu Ihrem Projekt und führen Sie den folgenden Befehl aus: Befehl:
docker build -t image-name .
Wobei image-name
der Name des Docker-Images ist. Das .
am Ende setzt den Kontext auf das aktuelle Verzeichnis.
Nachdem das Image erstellt wurde, erstellen wir den Container und führen die Node.js-App mit folgendem Befehl aus:
docker run --name container-name -p 8080:8080 image-name
Nachdem das oben Genannte erfolgreich war, können Sie überprüfen, ob der Dienst läuft, indem Sie docker ps
ausführen und dann zur gleichen localhost-URL wie zuvor gehen.
Images in ein Registry pushen
Jetzt, da dein Bild bereit ist, ist es Zeit, es in ein Registry zu schieben. Für den Umfang dieses Artikels lassen Sie unsnur zum Docker Hub pushen. Docker Hub ist ein Cloud-basierter Service zum Speichern, Teilen und Verwalten von Docker-Containerbildern.
Erstellen Sie ein Konto unter https://hub.docker.com/ und melden Sie sich an mit ihrem Konto an.
docker login
Nach dem Anmelden können lokal erstellte Bilder hinzugefügt werden wie:
docker tag image-name:tag dockerhub-username/repository-name:tag
Wo:
tag
ist entwederlatest
oder eine Versionsnummer.repository-name
ist der gewünschte Repository-Name.
Als Nächstes, pushen Sie das Bild wie folgt:
docker push dockerhub-username/repository-name:tag
Fazit
Wie wir sehen können, macht Containerisierung komplexe Workflows und Services durch die Trennung der Abhängigkeiten schnell, tragbar und skalierbar. Sobald implementiert, profitiert das gesamte Team davon.Ich ermutige Sie, die fortgeschrittenen Funktionen wie Multi-Stage-Builds und Container-Netzwerke zu erkunden. Außerdem sollten Sie sich mit Orchestrierungstools (z. B. Kubernetes) vertraut machen und CI/CD-Pipelines integrieren, um Ihren Entwicklungsworkflow zu optimieren.
Anhang
Source:
https://dzone.com/articles/containerization-of-a-nodejs-service