Поиск…


Запуск приложения Basic Node.js внутри контейнера

Пример, который я собираюсь обсудить, предполагает, что у вас есть установка Docker, которая работает в вашей системе, и основное понимание того, как работать с Node.js. Если вам известно о том, как вы должны работать с Docker, должно быть очевидно, что в вашей системе не нужно устанавливать инфраструктуру Node.js, скорее мы будем использовать самую latest версию изображения node доступную из Docker. Следовательно, при необходимости вы можете загрузить изображение заранее с помощью docker pull node выгрузки команды docker pull node . (Команда автоматически pulls последнюю версию изображения node из докера).

  1. Продолжайте создавать каталог, в котором будут находиться все ваши рабочие файлы приложений. Создайте файл 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"
       }
     }
    
  1. Если нам нужно работать с 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);
    
  2. Для тех, кто знаком с 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" ] 
    
  1. Затем мы создаем файл .dockerignore в том же каталоге, что и Dockerfile чтобы наша копия node_modules и журналов, используемых нашей системой установки Node.js, не копировалась на образ Docker. Файл .dockerignore должен иметь следующий контент:

     node_modules
     npm-debug.log
    
  2. Создайте свой образ

Перейдите в каталог, содержащий 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
  1. Запуск изображения

Теперь мы можем запустить созданный образ, используя содержимое приложения, базовое изображение node и файл Dockerfile . Теперь мы перейдем к созданию нового созданного образа <your username>/node-web-app . Предоставление ключа -d для команды docker run запускает контейнер в отдельном режиме, так что контейнер работает в фоновом режиме. Флаг -p перенаправляет открытый порт в частный порт внутри контейнера. Запустите изображение, которое вы ранее создали с помощью этой команды:

$ docker run -p 49160:8080 -d <your username>/node-web-app
  1. Распечатайте вывод своего приложения, запустив 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

  1. Из вывода 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      


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow