Sök…


Kör en Basic Node.js-applikation i en behållare

Exemplet jag ska diskutera antar att du har en Docker-installation som fungerar i ditt system och en grundläggande förståelse för hur du arbetar med Node.js. Om du är medveten om hur du måste arbeta med Docker bör det vara uppenbart att Node.js-ramverket inte behöver installeras på ditt system, snarare skulle vi använda den latest versionen av node som finns tillgänglig från Docker. Därför om det behövs kan du ladda ner bilden i förväg med kommandot docker pull node . (Kommandot automatiskt pulls den senaste versionen av node bilden från hamnarbetare.)

  1. Fortsätt för att skapa en katalog där alla dina fungerande applikationsfiler finns. Skapa en package.json fil i den här katalogen som beskriver din applikation och beroenden. Din package.json fil ska se ut så här:

     {
       "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. Om vi behöver arbeta med Node.js skapar vi vanligtvis en server som definierar en webbapplikation. I det här fallet använder vi Express.js ramverket (version 4.13.3 framåt). En grundläggande server.js fil ser ut så här:

     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. För dem som är bekanta med Docker skulle du ha stött på en Dockerfile . En Dockerfile är en textfil som innehåller alla kommandon som krävs för att skapa en anpassad bild som är skräddarsydd för din applikation.

Skapa en tom textfil med namnet Dockerfile i den aktuella katalogen. Metoden för att skapa en är enkel i Windows. I Linux kanske du vill köra touch Dockerfile i katalogen som innehåller alla filer som krävs för din applikation. Öppna Dockerfile med valfri textredigerare och lägg till följande rader:

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 instruerar Docker-demonen vilken bild vi vill bygga från. I det här fallet använder vi den latest versionen av den officiella Docker- node finns tillgänglig från Docker Hub .

  • Inuti den här bilden fortsätter vi att skapa en fungerande katalog som innehåller alla nödvändiga filer och vi instruerar demonen att ställa in den här katalogen som önskad arbetskatalog för vår applikation. För detta lägger vi till

      RUN mkdir -p /usr/src/my_first_app
      WORKDIR /usr/src/my_first_app
    
  • Vi fortsätter sedan med att installera applikationsberoenden genom att först flytta package.json filen (som specificerar appinformation inklusive beroenden) till /usr/src/my_first_app arbetskatalogen i bilden. Vi gör det här

      COPY package.json /usr/src/my_first_app/
      RUN npm install 
    
  • Vi skriver sedan COPY . /usr/src/my_first_app att lägga till alla applikationsfiler och källkod till arbetskatalogen i bilden.

  • Vi använder sedan EXPOSE direktivet för att instruera demonen att synliggöra port 8080 för den resulterande behållaren (via en container-till-värd-mappning) eftersom applikationen binds till port 8080 .

  • I det sista steget instruerar vi demonet att köra kommandonoden node server.js inuti bilden genom att utföra det grundläggande npm start . Vi använder CMD direktivet för detta, som tar kommandona som argument.

      CMD [ "npm", "start" ] 
    
  1. Vi skapar sedan en .dockerignore fil i samma katalog som Dockerfile att förhindra att vår kopia av node_modules och loggar som används av vår Node.js-systeminstallation kopieras till Docker-bilden. .dockerignore filen måste ha följande innehåll:

     node_modules
     npm-debug.log
    
  2. Bygg din bild

Navigera till katalogen som innehåller Dockerfile och kör följande kommando för att bygga Docker-bilden. Flaggan -t låter dig märka din bild så att det är lättare att hitta senare med kommandot docker images:

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

Din bild kommer nu att listas av Docker. Visa bilder med kommandot nedan:

$ docker images

REPOSITORY                      TAG        ID              CREATED
node                            latest     539c0211cd76    10 minutes ago
<your username>/node-web-app    latest     d64d3505b0d2    1 minute ago
  1. Kör bilden

Vi kan nu köra den bild vi just skapade med hjälp av applikationsinnehållet, Dockerfile node och Dockerfile . Vi fortsätter nu med att köra vår nyskapade <your username>/node-web-app bild. Att tillhandahålla -d omkopplare till docker run kör behållaren i fristående läge, så att behållaren körs i bakgrunden. Flaggan -p omdirigerar en offentlig hamn till en privat hamn inne i behållaren. Kör den bild du tidigare byggde med det här kommandot:

$ docker run -p 49160:8080 -d <your username>/node-web-app
  1. Skriv ut produktionen från din app genom att köra docker ps på din terminal. Utgången ska se ut så här.

     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
    

Få applikationsutmatning genom att ange docker logs <CONTAINER ID> . I detta fall är det docker logs 7b701693b294 .

Utgång: Running on http://localhost:8080

  1. Från docker ps utgång är den erhållna 0.0.0.0:49160->8080/tcp . Därför kartlade Docker 8080 porten inuti behållaren till porten 49160 på värdmaskinen. I webbläsaren kan vi nu ange localhost:49160 .

Vi kan också ringa vår app med hjälp av 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow