Docker
Eenvoudige Node.js-toepassing uitvoeren
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.)
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. Uwpackage.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" } }
Als we met Node.js moeten werken, maken we meestal een
server
dat een webtoepassing definieert. In dit geval gebruiken we hetExpress.js
framework (vanaf versie4.13.3
). Een standaardserver.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);
Voor degenen die bekend zijn met Docker, zou je een
Dockerfile
. EenDockerfile
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 delatest
versie van de officiële Docker afbeeldingnode
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 doorCOPY 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 poort8080
van de resulterende container zichtbaar te maken (via een container-naar-host-toewijzing) omdat de toepassing aan poort8080
bindt.In de laatste stap instrueren we de daemon om het opdrachtknooppunt
node server.js
in de afbeelding uit te voeren door denode server.js
npm start
voeren. We gebruiken hiervoor deCMD
richtlijn, die de opdrachten als argumenten neemt.CMD [ "npm", "start" ]
Vervolgens maken we een
.dockerignore
bestand in dezelfde map als hetDockerfile
om te voorkomen dat onze kopie vannode_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
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
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
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
- Van de
docker ps
uitgang is de verkregen0.0.0.0:49160->8080/tcp
. Vandaar dat Docker de8080
poort in de container heeft toegewezen aan poort 49160 op de hostmachine. In de browser kunnen we nulocalhost:49160
invoerenlocalhost: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