Docker
Запуск приложения Simple Node.js
Поиск…
Запуск приложения Basic Node.js внутри контейнера
Пример, который я собираюсь обсудить, предполагает, что у вас есть установка Docker, которая работает в вашей системе, и основное понимание того, как работать с Node.js. Если вам известно о том, как вы должны работать с Docker, должно быть очевидно, что в вашей системе не нужно устанавливать инфраструктуру Node.js, скорее мы будем использовать самую latest
версию изображения node
доступную из Docker. Следовательно, при необходимости вы можете загрузить изображение заранее с помощью docker pull node
выгрузки команды docker pull node
. (Команда автоматически pulls
последнюю версию изображения node
из докера).
Продолжайте создавать каталог, в котором будут находиться все ваши рабочие файлы приложений. Создайте файл
package.json
в этом каталоге, который описывает ваше приложение, а также зависимости. Ваш файлpackage.json
должен выглядеть примерно так:{ "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" } }
Если нам нужно работать с Node.js, мы обычно создаем файл
server
который определяет веб-приложение. В этом случае мы используем средуExpress.js
(версия4.13.3
далее). Основной файлserver.js
будет выглядеть примерно так: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);
Для тех, кто знаком с Docker, вы столкнулись с
Dockerfile
.Dockerfile
- это текстовый файл, содержащий все команды, необходимые для создания пользовательского образа, специально разработанного для вашего приложения.
Создайте пустой текстовый файл с именем Dockerfile
в текущем каталоге. Способ создания одного из них прост в Windows. В Linux вы можете выполнить touch Dockerfile
в каталоге, содержащем все файлы, необходимые для вашего приложения. Откройте Dockerfile с любым текстовым редактором и добавьте следующие строки:
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
указывает демона Docker, с какого изображения мы хотим построить. В этом случае мы используемlatest
версию официальногоnode
изображения Docker, доступную в Docker Hub .Внутри этого изображения мы перейдем к созданию рабочего каталога, который содержит все необходимые файлы, и мы даем указание демонам установить этот каталог как желаемый рабочий каталог для нашего приложения. Для этого добавим
RUN mkdir -p /usr/src/my_first_app WORKDIR /usr/src/my_first_app
Затем мы переходим к установке зависимостей приложений, сначала перемещая файл
package.json
(который указывает информацию о приложении, включая зависимости) в рабочий каталог/usr/src/my_first_app
на изображении. Мы это делаемCOPY package.json /usr/src/my_first_app/ RUN npm install
Затем мы
COPY . /usr/src/my_first_app
чтобы добавить все файлы приложений и исходный код в рабочий каталог на изображении.Затем мы используем директиву
EXPOSE
чтобы дать указание демонам отобразить порт8080
отображаемого контейнера (через сопоставление между контейнером и узлом), так как приложение привязывается к порту8080
.На последнем шаге мы инструктируем демона запустить командный
node server.js
внутри изображения, выполнив основную командуnpm start
. Для этого мы используем директивуCMD
, которая принимает команды как аргументы.CMD [ "npm", "start" ]
Затем мы создаем файл
.dockerignore
в том же каталоге, что иDockerfile
чтобы наша копияnode_modules
и журналов, используемых нашей системой установки Node.js, не копировалась на образ Docker. Файл.dockerignore
должен иметь следующий контент:node_modules npm-debug.log
Создайте свой образ
Перейдите в каталог, содержащий Dockerfile
и выполните следующую команду для создания образа Docker. Флаг -t
позволяет пометить ваше изображение, чтобы его легче было найти позже, используя команду изображений докеров:
$ docker build -t <your username>/node-web-app .
Теперь ваше изображение будет указано в Docker. Просмотр изображений с помощью команды:
$ docker images
REPOSITORY TAG ID CREATED
node latest 539c0211cd76 10 minutes ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
Запуск изображения
Теперь мы можем запустить созданный образ, используя содержимое приложения, базовое изображение node
и файл Dockerfile
. Теперь мы перейдем к созданию нового созданного образа <your username>/node-web-app
. Предоставление ключа -d
для команды docker run
запускает контейнер в отдельном режиме, так что контейнер работает в фоновом режиме. Флаг -p
перенаправляет открытый порт в частный порт внутри контейнера. Запустите изображение, которое вы ранее создали с помощью этой команды:
$ docker run -p 49160:8080 -d <your username>/node-web-app
Распечатайте вывод своего приложения, запустив
docker ps
на вашем терминале. Результат должен выглядеть примерно так.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
Получить выход приложения, введя docker logs <CONTAINER ID>
. В этом случае это docker logs 7b701693b294
.
Выход: Running on http://localhost:8080
- Из вывода
docker ps
получается полученное сопоставление портов0.0.0.0:49160->8080/tcp
. Следовательно, Docker сопоставил порт8080
внутри контейнера с портом 49160 на главной машине. В браузере теперь мы можем ввестиlocalhost:49160
.
Мы также можем вызвать наше приложение с помощью 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