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