Zoeken…


Een Basic Node.js-toepassing uitvoeren in een container

Het voorbeeld dat ik ga bespreken, gaat ervan uit dat u een Docker-installatie heeft die op uw systeem werkt en een basiskennis heeft van het werken met Node.js. Als u weet hoe u met Docker moet werken, moet het duidelijk zijn dat het Node.js-framework niet op uw systeem hoeft te worden geïnstalleerd. We gebruiken eerder de latest versie van de node beschikbaar is via Docker. Daarom kunt u indien nodig de afbeelding vooraf downloaden met de opdracht docker pull node . (De opdracht pulls automatisch de nieuwste versie van de node uit het koppelvenster.)

  1. Ga door met het maken van een map waarin al uw werkende applicatiebestanden zich zouden bevinden. Maak een package.json bestand in deze map waarin uw toepassing en de afhankelijkheden worden beschreven. Uw package.json bestand zou er ongeveer zo uit moeten zien:

     {
       "name": "docker_web_app",
       "version": "1.0.0",
       "description": "Node.js on Docker",
       "author": "First Last <[email protected]>",
       "main": "server.js",
       "scripts": {
         "start": "node server.js"
       },
       "dependencies": {
         "express": "^4.13.3"
       }
     }
    
  1. Als we met Node.js moeten werken, maken we meestal een server dat een webtoepassing definieert. In dit geval gebruiken we het Express.js framework (vanaf versie 4.13.3 ). Een standaard server.js bestand ziet er ongeveer zo uit:

     var express = require('express');
     var PORT = 8080;
     var app = express();
     app.get('/', function (req, res) {
       res.send('Hello world\n');
     });
     
     app.listen(PORT);
     console.log('Running on http://localhost:' + PORT);
    
  2. Voor degenen die bekend zijn met Docker, zou je een Dockerfile . Een Dockerfile is een tekstbestand dat alle opdrachten bevat die nodig zijn om een aangepaste afbeelding te maken die is afgestemd op uw toepassing.

Maak een leeg tekstbestand met de naam Dockerfile in de huidige map. De methode om er een te maken is eenvoudig in Windows. In Linux wilt u mogelijk touch Dockerfile uitvoeren in de map met alle bestanden die nodig zijn voor uw toepassing. Open het Docker-bestand met een willekeurige teksteditor en voeg de volgende regels toe:

FROM node:latest
RUN mkdir -p /usr/src/my_first_app
WORKDIR /usr/src/my_first_app
COPY package.json /usr/src/my_first_app/
RUN npm install
COPY . /usr/src/my_first_app
EXPOSE 8080
  • FROM node:latest instrueert de Docker-daemon van welke afbeelding we willen bouwen. In dit geval gebruiken we de latest versie van de officiële Docker afbeelding node verkrijgbaar bij de Docker Hub .

  • In deze afbeelding gaan we verder met het maken van een werkmap die alle vereiste bestanden bevat en we geven de daemon opdracht deze map in te stellen als de gewenste werkmap voor onze toepassing. Hiervoor voegen we toe

      RUN mkdir -p /usr/src/my_first_app
      WORKDIR /usr/src/my_first_app
    
  • Vervolgens gaan we door met het installeren van applicatie-afhankelijkheden door eerst het bestand package.json (dat app-informatie inclusief afhankelijkheden opgeeft) te verplaatsen naar de /usr/src/my_first_app in de afbeelding. We doen dit door

      COPY package.json /usr/src/my_first_app/
      RUN npm install 
    
  • We typen dan COPY . /usr/src/my_first_app om alle applicatiebestanden en broncode toe te voegen aan de werkmap in de afbeelding.

  • We gebruiken vervolgens de EXPOSE richtlijn om de daemon opdracht te geven om poort 8080 van de resulterende container zichtbaar te maken (via een container-naar-host-toewijzing) omdat de toepassing aan poort 8080 bindt.

  • In de laatste stap instrueren we de daemon om het opdrachtknooppunt node server.js in de afbeelding uit te voeren door de node server.js npm start voeren. We gebruiken hiervoor de CMD richtlijn, die de opdrachten als argumenten neemt.

      CMD [ "npm", "start" ] 
    
  1. Vervolgens maken we een .dockerignore bestand in dezelfde map als het Dockerfile om te voorkomen dat onze kopie van node_modules en logboeken die door onze Node.js-systeeminstallatie worden gebruikt, naar de Docker-afbeelding wordt gekopieerd. Het .dockerignore bestand moet de volgende inhoud hebben:

     node_modules
     npm-debug.log
    
  2. Bouw je afbeelding

Navigeer naar de map die het Dockerfile bevat en voer de volgende opdracht uit om de Docker-afbeelding te maken. Met de vlag -t kunt u uw afbeelding taggen, zodat u deze later gemakkelijker kunt terugvinden met de opdracht docker images:

    $ docker build -t <your username>/node-web-app .

Uw afbeelding wordt nu weergegeven door Docker. Bekijk afbeeldingen met de onderstaande opdracht:

$ docker images

REPOSITORY                      TAG        ID              CREATED
node                            latest     539c0211cd76    10 minutes ago
<your username>/node-web-app    latest     d64d3505b0d2    1 minute ago
  1. De afbeelding uitvoeren

We kunnen de afbeelding die we zojuist hebben gemaakt nu uitvoeren met behulp van de toepassingsinhoud, de Dockerfile het node en het Dockerfile . We gaan nu over tot het uitvoeren van onze nieuw gemaakte <your username>/node-web-app afbeelding. Als u de schakelaar -d opgeeft voor de opdracht docker run wordt de container in de ontkoppelde modus uitgevoerd, zodat de container op de achtergrond wordt uitgevoerd. De vlag -p stuurt een openbare poort door naar een particuliere poort in de container. Voer de eerder gemaakte afbeelding uit met deze opdracht:

$ docker run -p 49160:8080 -d <your username>/node-web-app
  1. Druk de uitvoer van uw app af door docker ps op uw terminal uit te voeren. De output zou er ongeveer zo uit moeten zien.

     CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                     NAMES
     7b701693b294      <your username>/node-web-app   "npm start"         20 minutes ago       Up 48 seconds       0.0.0.0:49160->8080/tcp   loving_goldstine
    

Verkrijg applicatie-output door docker logs <CONTAINER ID> . In dit geval zijn dit docker logs 7b701693b294 .

Uitgang: draait Running on http://localhost:8080

  1. Van de docker ps uitgang is de verkregen 0.0.0.0:49160->8080/tcp . Vandaar dat Docker de 8080 poort in de container heeft toegewezen aan poort 49160 op de hostmachine. In de browser kunnen we nu localhost:49160 invoeren localhost:49160 .

We kunnen onze app ook bellen met behulp van curl :

$ curl -i localhost:49160

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 08 Jan 2017 14:00:12 GMT
Connection: keep-alive

Hello world      


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow