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.jsonbestand in deze map waarin uw toepassing en de afhankelijkheden worden beschreven. Uwpackage.jsonbestand 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
serverdat een webtoepassing definieert. In dit geval gebruiken we hetExpress.jsframework (vanaf versie4.13.3). Een standaardserver.jsbestand 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. EenDockerfileis 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:latestinstrueert de Docker-daemon van welke afbeelding we willen bouwen. In dit geval gebruiken we delatestversie van de officiële Docker afbeeldingnodeverkrijgbaar 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_appVervolgens 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_appin de afbeelding. We doen dit doorCOPY package.json /usr/src/my_first_app/ RUN npm installWe typen dan
COPY . /usr/src/my_first_appom alle applicatiebestanden en broncode toe te voegen aan de werkmap in de afbeelding.We gebruiken vervolgens de
EXPOSErichtlijn om de daemon opdracht te geven om poort8080van de resulterende container zichtbaar te maken (via een container-naar-host-toewijzing) omdat de toepassing aan poort8080bindt.In de laatste stap instrueren we de daemon om het opdrachtknooppunt
node server.jsin de afbeelding uit te voeren door denode server.jsnpm startvoeren. We gebruiken hiervoor deCMDrichtlijn, die de opdrachten als argumenten neemt.CMD [ "npm", "start" ]
Vervolgens maken we een
.dockerignorebestand in dezelfde map als hetDockerfileom te voorkomen dat onze kopie vannode_modulesen logboeken die door onze Node.js-systeeminstallatie worden gebruikt, naar de Docker-afbeelding wordt gekopieerd. Het.dockerignorebestand moet de volgende inhoud hebben:node_modules npm-debug.logBouw 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 psop 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 psuitgang is de verkregen0.0.0.0:49160->8080/tcp. Vandaar dat Docker de8080poort in de container heeft toegewezen aan poort 49160 op de hostmachine. In de browser kunnen we nulocalhost:49160invoerenlocalhost: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