Docker
Uruchamianie prostej aplikacji Node.js
Szukaj…
Uruchamianie aplikacji Basic Node.js w kontenerze
Przykład, który omówię, zakłada, że masz instalację Dockera, która działa w twoim systemie, i podstawową wiedzę na temat pracy z Node.js. Jeśli wiesz, jak musisz pracować z Dockerem, powinno być oczywiste, że framework Node.js nie musi być zainstalowany w twoim systemie, raczej użyjemy latest
wersji obrazu node
dostępnej z Dockera. Dlatego w razie potrzeby możesz wcześniej pobrać obraz za pomocą docker pull node
poleceń. (Polecenie automatycznie pulls
najnowszą wersję obrazu node
z okna dokowanego).
Przejdź do utworzenia katalogu, w którym będą się znajdować wszystkie działające pliki aplikacji. Utwórz plik
package.json
w tym katalogu, który opisuje twoją aplikację, a także zależności. Twój plikpackage.json
powinien wyglądać mniej więcej tak:{ "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" } }
Jeśli musimy pracować z Node.js, zwykle tworzymy plik
server
, który definiuje aplikację internetową. W tym przypadku używamy frameworkaExpress.js
(wersja4.13.3
nowsze). Podstawowy plikserver.js
wyglądałby mniej więcej tak: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);
Dla osób zaznajomionych z Docker, można spotkać plik
Dockerfile
. PlikDockerfile
to plik tekstowy zawierający wszystkie polecenia wymagane do zbudowania niestandardowego obrazu dostosowanego do Twojej aplikacji.
Utwórz pusty plik tekstowy o nazwie Dockerfile
w bieżącym katalogu. Metoda jego utworzenia jest prosta w systemie Windows. W systemie Linux możesz wykonać touch Dockerfile
w katalogu zawierającym wszystkie pliki wymagane dla twojej aplikacji. Otwórz plik Docker w dowolnym edytorze tekstu i dodaj następujące wiersze:
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
instruuje demona Docker z jakiego obrazu chcemy zbudować. W tym przypadku korzystamy zlatest
wersji oficjalnegonode
obrazu Docker dostępnego w Docker Hub .Wewnątrz tego obrazu kontynuujemy tworzenie katalogu roboczego zawierającego wszystkie wymagane pliki i instruujemy demona, aby ustawił ten katalog jako żądany katalog roboczy dla naszej aplikacji. W tym celu dodajemy
RUN mkdir -p /usr/src/my_first_app WORKDIR /usr/src/my_first_app
Następnie przystępujemy do instalowania zależności aplikacji, najpierw przenosząc plik
package.json
(który określa informacje o aplikacji, w tym zależności) do katalogu roboczego/usr/src/my_first_app
na obrazie. Robimy to przezCOPY package.json /usr/src/my_first_app/ RUN npm install
Następnie wpisujemy
COPY . /usr/src/my_first_app
aby dodać wszystkie pliki aplikacji i kod źródłowy do katalogu roboczego na obrazie.Następnie używamy dyrektywy
EXPOSE
aby poinstruować demona, aby port8080
wynikowego kontenera był widoczny (poprzez mapowanie kontenera na hosta), ponieważ aplikacja wiąże się z portem8080
.W ostatnim kroku instruujemy demona, aby uruchomił
node server.js
komendnode server.js
wewnątrz obrazu, wykonując podstawowe polecenienpm start
. Wykorzystujemy do tego dyrektywęCMD
, która przyjmuje komendy jako argumenty.CMD [ "npm", "start" ]
Następnie tworzymy plik
.dockerignore
w tym samym katalogu, coDockerfile
aby zapobiec kopiowaniu naszych kopiinode_modules
i dziennikównode_modules
używanych przez instalację systemu Node.js do obrazu Docker. Plik.dockerignore
musi mieć następującą treść:node_modules npm-debug.log
Zbuduj swój wizerunek
Przejdź do katalogu zawierającego Dockerfile
i uruchom następujące polecenie, aby zbudować obraz Docker. Flaga -t
pozwala oznaczyć obraz, dzięki czemu łatwiej go później znaleźć za pomocą polecenia docker images:
$ docker build -t <your username>/node-web-app .
Twoje zdjęcie będzie teraz wyświetlane przez Docker. Przeglądaj obrazy za pomocą poniższego polecenia:
$ docker images
REPOSITORY TAG ID CREATED
node latest 539c0211cd76 10 minutes ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
Uruchamianie obrazu
Możemy teraz uruchomić obraz, który właśnie utworzyliśmy, używając zawartości aplikacji, obrazu podstawowego node
i pliku Dockerfile
. Teraz przystępujemy do uruchamiania naszego nowo utworzonego obrazu <your username>/node-web-app
. Zapewnienie przełącznika -d
komendy docker run
kontener w trybie odłączonym, dzięki czemu kontener działa w tle. Flaga -p
przekierowuje port publiczny do portu prywatnego w kontenerze. Uruchom wcześniej utworzony obraz za pomocą tego polecenia:
$ docker run -p 49160:8080 -d <your username>/node-web-app
Wydrukuj dane wyjściowe aplikacji, uruchamiając
docker ps
na swoim terminalu. Wynik powinien wyglądać mniej więcej tak.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
Uzyskaj dane wyjściowe aplikacji, wprowadzając docker logs <CONTAINER ID>
. W tym przypadku są to docker logs 7b701693b294
.
Dane wyjściowe: Running on http://localhost:8080
- Z danych wyjściowych
docker ps
0.0.0.0:49160->8080/tcp
uzyskane mapowanie portów to0.0.0.0:49160->8080/tcp
. Dlatego Docker zamapował port8080
wewnątrz kontenera na port 49160 na komputerze-hoście. W przeglądarce możemy teraz wpisaćlocalhost:49160
.
Możemy również zadzwonić do naszej aplikacji za pomocą 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