Docker: Node.js
Hoe een Node.js-app te gebruiken en te implementeren met Docker
👋 Welkom bij de documentatie van Stackhero!
Stackhero biedt een kant-en-klare Docker cloud CaaS (Containers as a Service) oplossing die tal van voordelen biedt, waaronder:
- Zet eenvoudig uw containers in productie met slechts een
docker-compose up.- Aanpasbare domeinnaam beveiligd met HTTPS (bijvoorbeeld, https://api.uw-bedrijf.com, https://www.uw-bedrijf.com, https://backoffice.uw-bedrijf.com).
- Optimale prestaties en robuuste beveiliging aangedreven door een privé en toegewijde VM.
- Moeiteloze updates met slechts één klik.
Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de Docker CaaS cloud hosting oplossing van Stackhero te proberen en uw containers in productie te zetten!
Deze gids biedt een solide basis voor het ontwikkelen van een Node.js-app en het snel en eenvoudig implementeren ervan in productie.
Er is geen voorkennis van Docker vereist. Alles is ingesteld om een soepele ervaring te garanderen; u hoeft alleen Docker op uw computer te hebben geïnstalleerd.
Deze documentatie is ontworpen voor zowel beginners als ervaren gebruikers die een Node.js-applicatie willen implementeren met moderne, schaalbare technologieën zonder onnodige complicaties.
Belangrijke kenmerken van deze oplossing zijn onder andere:
- 💪 Eenvoudige installatie met minimale inspanning
- 🐳 Gebruik van Docker voor zowel ontwikkel- als productieomgevingen
- 🔄 Automatisch herladen van Node.js bij codewijzigingen met nodemon
- 🚀 Implementatie naar productie met één enkele opdracht
- 🔒 Beheer van TLS-certificaten voor veilige HTTPS-versleuteling
- 🚧 Ondersteuning voor staging- en preproductieplatforms
- 🧱 Modulaire en schaalbare architectuur
Aan de slag
Als Docker nog niet op uw computer is geïnstalleerd, kunt u het downloaden van de officiële Docker-website. Om te controleren of Docker correct functioneert, opent u een terminal en voert u docker version uit. U zou versleutelingsinformatie moeten zien zonder fouten.
Na het installeren van Docker, kloon de volgende boilerplate-repository:
git clone https://github.com/stackhero-io/nodejsWithDockerGettingStarted/
cd nodejsWithDockerGettingStarted
Start vervolgens het ontwikkelplatform door make development-start uit te voeren of bekijk alle beschikbare opdrachten met make help.
Ontwikkelplatform
Om het ontwikkelplatform te starten, voert u uit:
make development-start
Deze opdracht bouwt de Docker-image, voert deze uit en start het dev-script dat is gedefinieerd in my-app/package.json (wat gelijk staat aan het uitvoeren van npm run dev).
In dit voorbeeld wordt een eenvoudige REST API met Express gemaakt. U kunt de API bekijken door naar http://localhost:5000 te navigeren. De pagina zou "Hello World" moeten weergeven.
Open vervolgens het bestand my-app/src/app.js in uw favoriete IDE en wijzig de volgende regel:
res.send('Hello World');
Wijzig dit in:
res.send('Updated!');
Sla het bestand op. De Node.js-code wordt automatisch herladen en een verversing van http://localhost:5000 zal de bijgewerkte API-respons weergeven.
Gefeliciteerd - u heeft nu een volledig operationeel ontwikkelplatform!
Pakketten installeren
Als u extra pakketten moet installeren, kunt u make development-shell uitvoeren om toegang te krijgen tot de container-shell. Eenmaal binnen, gebruik NPM met npm install <package> of Yarn met yarn add <package> om de gewenste pakketten te installeren.
Een bestaand Node.js-project gebruiken
Als u een bestaand Node.js-project heeft dat u met Docker wilt integreren, volg dan deze stappen:
-
Maak een nieuwe map genaamd
my-appin uw project. -
Verplaats al uw projectbestanden naar de map
my-app, met uitzondering van de.gitignoreen.gitbestanden. -
Kopieer de
docker,secrets, enMakefilevan de boilerplate naar de hoofdmap van uw project. -
Bewerk het
.gitignore-bestand in uw project en voeg de volgende regels toe:node_modules/ secrets/*.production secrets/*.staging
Geopende poort
Deze boilerplate gaat ervan uit dat uw app luistert op poort 5000. Als u een andere poort verkiest, kunt u het bestand docker/docker-compose.development.yml bewerken en vervolgens de omgeving opnieuw starten met make development-start.
Een specifieke Node.js-versie kiezen
Als u een andere Node.js-versie wilt specificeren, volg dan deze stappen:
- Open het bestand
docker/my-app.dockerfile, dat de Docker-image voor uw app definieert. - Zoek de eerste regel die leest
FROM node:<version>-alpine. - Vervang
<version>door de gewenste Node.js-versie. Het wordt aanbevolen om de Long-Term Support (LTS) versie te gebruiken. U kunt de nieuwste LTS-versie controleren op de Node.js-website. Bijvoorbeeld, om de nieuwste LTS-versie te gebruiken (momenteel 22), update de regel naarFROM node:22-alpine. Als u een specifiek versienummer verkiest, kunt u iets alsFROM node:22.13.0-alpinegebruiken. - Sla uw wijzigingen op in het Dockerfile.
Omgevingsvariabelen
Stel omgevingsvariabelen in voor het ontwikkelplatform in het bestand secrets/my-app.development.
Voor productie, gebruik het bestand secrets/my-app.production.
Dien het bestand
secrets/my-app.productionniet in bij uw Git-repository! Dit bestand bevat gevoelige informatie en wordt standaard genegeerd in de.gitignorevan de boilerplate om onbedoeld delen te voorkomen.
Lokale bestanden opslaan
Als uw Node.js-app bestanden moet opslaan (bijvoorbeeld gebruikersuploads), overweeg dan het gebruik van een objectopslagdienst zoals MinIO. Een objectopslagdienst helpt uw applicatie naadloos te schalen en vermindert potentiële problemen.
Als u liever bestanden lokaal opslaat, zorg er dan voor dat u altijd een Docker-volume gebruikt. Bestanden direct in een container opslaan kan leiden tot gegevensverlies. Deze boilerplate biedt een volume gemonteerd op /persistent voor het veilig opslaan van bestanden.
Sla nooit persistente gegevens op buiten de map
/persistenttenzij u aangepaste volumes heeft gemaakt en zeker bent van de configuratie. Bestanden opslaan buiten/persistentzal leiden tot gegevensverlies!
Een staging-omgeving toevoegen
U kunt deze boilerplate eenvoudig aanpassen om een staging-omgeving toe te voegen. Om dit te doen:
- Maak een kopie van
docker/docker-compose.production.ymlen noem hetdocker/docker-compose.staging.yml. Dit bestand definieert de containers en configuratie voor uw staging-omgeving. - Maak het secrets-bestand
secrets/my-app.stagingaan met alle gevoelige informatie die nodig is voor staging, zoals databasewachtwoorden of API-sleutels. - Zoek in het
Makefilede sectie met de naam "Staging platform" en verwijder het commentaar.
Voer ten slotte make help uit om de nieuwe staging-opdrachten te bekijken die nu beschikbaar zijn.
Productieplatform
Als u nog geen Stackhero for Docker service heeft, kunt u er eenvoudig een maken vanuit uw Stackhero-dashboard. Het wordt binnen ongeveer 2 minuten geactiveerd.
Als u nieuw bent bij Stackhero, kunt u de Docker-container cloud hosting een maand gratis proberen.
Bereid uw eerste implementatie naar productie voor
Voordat u uw app naar productie implementeert, moet u enkele configuratiebestanden voorbereiden:
- Kopieer
secrets/global.production.examplenaarsecrets/global.production. - Bewerk
secrets/global.productionen vervang<XXXXXX>.stackhero-network.comdoor uw Docker-service-hostnaam vanuit uw Stackhero-dashboard. - Kopieer
secrets/my-app.production.examplenaarsecrets/my-app.production. - Bewerk
secrets/my-app.productionen voeg uw inloggegevens in. - Werk
docker/docker-compose.production.ymlbij door<XXXXXX>.stackhero-network.comte vervangen door uw Docker-service-hostnaam.
Implementeren naar productie
Implementeren naar productie is eenvoudig: voer uit:
make production-deploy
Deze opdracht maakt een Docker-container, verplaatst uw projectgegevens en stuurt deze naar uw Docker-service in productie. Open uw browser en navigeer naar uw Docker-service-hostnaam (bijvoorbeeld, https://<XXXXXX>.stackhero-network.com). U zou uw REST API "Hello World" moeten zien antwoorden.
U kunt ook
make productiongebruiken, dat uw containers implementeert en realtime logs weergeeft.
Logs weergeven
Om uw productieomgeving te monitoren of problemen op te lossen, kunt u uw logs bekijken met deze opdrachten:
- Om live logs te streamen, voert u uit:
make production-logs-live - Om alle opgeslagen logs op te halen, voert u uit:
make production-logs - Om logs voor een specifieke dag op te halen (vervang
YYYY-MM-DDdoor de gewenste datum), voert u uit:make production-logs | grep "YYYY-MM-DD"
Domeinnamen aanpassen
Als u een andere domeinnaam wilt gebruiken in plaats van https://<XXXXXX>.stackhero-network.com, integreert Stackhero for Docker Traefik om domeinbeheer te vereenvoudigen. Traefik beheert HTTP-routing en TLS-versleuteling (HTTPS) voor u.
Hier zijn een paar voorbeelden om uw domeinnamen aan te passen:
-
Om
api.my-company.comte bedienen via uw containermy-appop poort 5000 met TLS-versleuteling, werkt u het bestanddocker/docker-compose.production.ymlbij door de sectielabelste vervangen door:labels: - "traefik.enable=true" # Traefik inschakelen om verkeer naar deze container te routeren - "traefik.http.routers.my-app.rule=Host(`api.my-company.com`)" # Definieer de host - "traefik.http.routers.my-app.tls.certresolver=letsencrypt" # Gebruik letsencrypt voor TLS-certificaten - "traefik.http.services.my-app.loadbalancer.server.port=5000" # Specificeer poort 5000 -
Om
my-company.comte bedienen via uw containermy-appop poort 5000 en alle verzoeken vanwww.my-company.comnaarmy-company.comte leiden, werkt u de sectielabelsin hetzelfde bestand bij met:labels: - "traefik.enable=true" - "traefik.http.routers.my-app.rule=Host(`my-company.com`) || Host(`www.my-company.com`)" # Beide domeinen opnemen - "traefik.http.routers.my-app.tls.certresolver=letsencrypt" - "traefik.http.services.my-app.loadbalancer.server.port=5000" # Specificeer poort 5000 # www.my-company.com omleiden naar my-company.com: - "traefik.http.routers.my-app.middlewares=redirect-www" - "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)" - "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}" - "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
Vergeet niet de DNS voor
my-company.comenwww.my-company.comte configureren zodat elk als een CNAME naar uw Docker-service wijst ophttps://<XXXXXX>.stackhero-network.com.