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

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.

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!

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.

Als u een bestaand Node.js-project heeft dat u met Docker wilt integreren, volg dan deze stappen:

  1. Maak een nieuwe map genaamd my-app in uw project.

  2. Verplaats al uw projectbestanden naar de map my-app, met uitzondering van de .gitignore en .git bestanden.

  3. Kopieer de docker, secrets, en Makefile van de boilerplate naar de hoofdmap van uw project.

  4. Bewerk het .gitignore-bestand in uw project en voeg de volgende regels toe:

    node_modules/
    secrets/*.production
    secrets/*.staging
    

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.

Als u een andere Node.js-versie wilt specificeren, volg dan deze stappen:

  1. Open het bestand docker/my-app.dockerfile, dat de Docker-image voor uw app definieert.
  2. Zoek de eerste regel die leest FROM node:<version>-alpine.
  3. 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 naar FROM node:22-alpine. Als u een specifiek versienummer verkiest, kunt u iets als FROM node:22.13.0-alpine gebruiken.
  4. Sla uw wijzigingen op in het Dockerfile.

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.production niet in bij uw Git-repository! Dit bestand bevat gevoelige informatie en wordt standaard genegeerd in de .gitignore van de boilerplate om onbedoeld delen te voorkomen.

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 /persistent tenzij u aangepaste volumes heeft gemaakt en zeker bent van de configuratie. Bestanden opslaan buiten /persistent zal leiden tot gegevensverlies!

U kunt deze boilerplate eenvoudig aanpassen om een staging-omgeving toe te voegen. Om dit te doen:

  1. Maak een kopie van docker/docker-compose.production.yml en noem het docker/docker-compose.staging.yml. Dit bestand definieert de containers en configuratie voor uw staging-omgeving.
  2. Maak het secrets-bestand secrets/my-app.staging aan met alle gevoelige informatie die nodig is voor staging, zoals databasewachtwoorden of API-sleutels.
  3. Zoek in het Makefile de 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.

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.

Voordat u uw app naar productie implementeert, moet u enkele configuratiebestanden voorbereiden:

  1. Kopieer secrets/global.production.example naar secrets/global.production.
  2. Bewerk secrets/global.production en vervang <XXXXXX>.stackhero-network.com door uw Docker-service-hostnaam vanuit uw Stackhero-dashboard.
  3. Kopieer secrets/my-app.production.example naar secrets/my-app.production.
  4. Bewerk secrets/my-app.production en voeg uw inloggegevens in.
  5. Werk docker/docker-compose.production.yml bij door <XXXXXX>.stackhero-network.com te vervangen door uw Docker-service-hostnaam.

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 production gebruiken, dat uw containers implementeert en realtime logs weergeeft.

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-DD door de gewenste datum), voert u uit: make production-logs | grep "YYYY-MM-DD"

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.com te bedienen via uw container my-app op poort 5000 met TLS-versleuteling, werkt u het bestand docker/docker-compose.production.yml bij door de sectie labels te 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.com te bedienen via uw container my-app op poort 5000 en alle verzoeken van www.my-company.com naar my-company.com te leiden, werkt u de sectie labels in 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.com en www.my-company.com te configureren zodat elk als een CNAME naar uw Docker-service wijst op https://<XXXXXX>.stackhero-network.com.