Докер для фронтенд-разработчиков. Создание контейнера для простого приложения Node.js

  • 21 октября, 08:33
  • 3757
  • 0

Зачем использовать докер?

Давным-давно, когда бизнесу требовалось другое приложение, команда DevOps покупала сервер, не зная требований к производительности новых приложений. Это потребовало бы большого количества догадок и напрасной траты капитала и ресурсов, которые можно было бы использовать для других приложений.

Виртуальные машин позволили  запускать несколько приложений на одних и тех же серверах. Но  недостаток в том, что каждой виртуальной машине для работы требовалась вся ОС. Каждой ОС для работы требуются ЦП, ОЗУ и т. д. Она требует исправлений и лицензирования, что, в свою очередь, увеличивает стоимость и отказоустойчивость.

Google уже давно начал использовать модель контейнеров для устранения недостатков модели ВМ. По сути, модель контейнера означает, что несколько контейнеров на одном и том же хосте используют один и тот же хост, освобождая ЦП и оперативную память, которые можно использовать в другом месте.

Но как это помогает разработчикам?

Это гарантирует, что рабочая среда одинакова для всех разработчиков и всех серверов, т.е. для производства, подготовки и тестирования.

Любой желающий может настроить проект за секунды, не нужно возиться с конфигурацией, установкой библиотек, установочными зависимостями и т. д.

Проще говоря, докер - это платформа, которая позволяет  разрабатывать, развертывать и запускать приложения с контейнерами.

Давайте сделаем шаг назад, как контейнерная система выглядит физически и чем она отличается от ВМ.

1.1 Разница между виртуальной машиной и докером

1.1 Разница между ВМ и докером.

Как видите, хост и его ресурсы совместно используются в контейнерах, но не в виртуальной машине.

Как пользоваться докером?

Для этого нам необходимо ознакомиться с определенной терминологией.

1.2 Визуализация docker-образов и docker-контейнера

1.2 Визуализация docker-образов и docker-контейнера

Образ Docker : это исполняемый файл, который содержит урезанную операционную систему, а также все библиотеки и конфигурацию, необходимые для запуска приложения. Он состоит из нескольких слоев, уложенных друг на друга и представленных как один объект. Образ докера создается с помощью файла докера , мы скоро к этому вернемся.

Контейнер Docker: это работающий экземпляр образа докера. может быть много контейнеров, запущенных из одного и того же образа докера.

Создание контейнера для простого приложения Node.js

Мы  попытались поместить в контейнер очень простое приложение node.js и создать изображение:

Ваше приложение Node.js

Начнем с создания папки my-node-app ,

mkdir my-node-app  
cd my-node-app

давайте создадим простой сервер узла index.jsи добавим туда следующий код:

//Load express module with `require` directive

var express = require('express')

var app = express()

//Define request response in root URL (/)  
app.get('/', function (req, res) {   res.send('Hello World!')  
})

//Launch listening server on port 8081  
app.listen(8081, function () {    console.log('app listening on port 8081!')  
})

и сохраните этот файл в своей my-node-appпапке.

Теперь создаем package.jsonфайл и добавляем туда следующий код:

 {
    "name": "helloworld",      "version": "1.0.0",      "description": "Dockerized node.js app",      "main": "index.js",      "author": "",      "license": "ISC",      "dependencies": {        "express": "^4.16.4"      }
 }

На этом этапе вам не нужно устанавливать express или npm на хосте, потому что помните, что dockerfile обрабатывает настройку всех зависимостей, библиотек и конфигураций.

DockerFile

Создадим dockerfile и сохраним его в нашем my-node-app folder. Этот файл не имеет расширения и называется Dockerfile . Давайте продолжим и добавим следующий код в наш файл докеров.

    # Dockerfile      FROM node:8      WORKDIR /app      COPY package.json /app      RUN npm install      COPY . /app      EXPOSE 8081      CMD node index.js

Что мы здесь делаем:

FROM node:8 - извлекает образ докера node.js из хаба докеров, который можно найти здесь https://hub.docker.com/_/node/

WORKDIR /app-это устанавливает рабочий каталог для нашего кода на изображении, он используется всеми последующими командами, такими как COPY , RUNиCMD

COPY package.json /app-это копирует наш package.json из my-node-appпапки хоста в наше изображение в /appпапке.

RUN npm install - мы запускаем эту команду внутри нашего образа, чтобы установить зависимости (node_modules) для нашего приложения.

COPY . /app - мы говорим докеру, что нужно скопировать наши файлы из папки my-node-app и вставить их /appв образ докера.

EXPOSE 8081 - мы выставляем порт на контейнере с помощью этой команды. Почему именно этот порт? потому что на нашем сервере в index.js прослушивается 8081. По умолчанию контейнеры, созданные из этого образа, игнорируют все запросы к нему.

Создать образ Docker

Время для шоу. Откройте терминал, перейдите в свою папку my-node-appи введите следующую команду:

     # Build a image docker build -t <image-name> <relative-path-to-your-dockerfile>
    docker build -t hello-world .

Эта команда создает hello-worldобраз на нашем хосте.

-tиспользуется, чтобы дать имя нашему изображению, которое здесь hello-world .

.- относительный путь к файлу докера, поскольку мы находимся в папке, где my-node-appмы использовали точку для обозначения пути к файлу докера.

В командной строке вы увидите что-то вроде этого:

    Sending build context to Docker daemon  4.096kB      Step 1/7 : FROM node:8       ---> 4f01e5319662      Step 2/7 : WORKDIR /app       ---> Using cache       ---> 5c173b2c7b76      Step 3/7 : COPY package.json /app       ---> Using cache       ---> ceb27a57f18e      Step 4/7 : RUN npm install       ---> Using cache       ---> c1baaf16812a      Step 5/7 : COPY . /app       ---> 4a770927e8e8      Step 6/7 : EXPOSE 8081       ---> Running in 2b3f11daff5e      Removing intermediate container 2b3f11daff5e       ---> 81a7ce14340a      Step 7/7 : CMD node index.js       ---> Running in 3791dd7f5149      Removing intermediate container 3791dd7f5149       ---> c80301fa07b2      Successfully built c80301fa07b2      Successfully tagged hello-world:latest

Как видите, он выполнил шаги из нашего файла докера и вывел образ докера. Когда вы попробуете его в первый раз, это займет несколько минут, но со следующего раза он начнет использовать кеш и строить намного быстрее, а результат будет таким, как показано выше. Теперь попробуйте следующую команду в своем терминале, чтобы узнать, есть ли ваше изображение или нет:

    # Get a list of images on your host     docker images

у него должен быть список изображений на вашем хосте. что-то вроде этого

    REPOSITORY    TAG      IMAGE ID      CREATED         SIZE      hello-world   latest   c80301fa07b2  22 minutes ago  896MB

Запустить Docker Container

Создав наши изображения, мы можем развернуть контейнер из этого изображения.

    # Default command for this is docker container run <image-name>      docker container run -p 4000:8081  hello-world

Эта команда используется для создания и запуска контейнера докеров.

-p 4000:8081- это флаг публикации, он сопоставляет порт хоста 4000 с портом контейнера 8081, который мы открыли с помощью команды expose в файле dockerfile. Теперь все запросы к хост-порту 4000 будут прослушиваться контейнерным портом 8081.

hello-world - это имя, которое мы дали нашему образу ранее, когда запускали команду docker-build.

Вы получите такой вывод:

    app listening on port 8081!

Если вы хотите войти в свой контейнер и подключить к нему терминал bash, вы можете запустить

    # Enter the container    docker exec -ti <container id> /bin/bash

Чтобы проверить, запущен ли контейнер или нет, откройте другой терминал и введите

    docker ps

Вы должны увидеть свой работающий контейнер следующим образом

     CONTAINER ID    IMAGE        COMMAND                  CREATED        `<container id>`  hello-world  "/bin/sh -c 'node in…"   11 seconds ago
    STATUS              PORTS                    NAMES      Up 11 seconds       0.0.0.0:4000->8081/tcp   some-random-name

Это означает, что наш контейнер с идентификатором, <container id>созданным из образа hello-world, запущен, работает и прослушивает порт 8081.

Теперь наше небольшое приложение Node.js полностью контейнеризовано. Вы можете запустить http: // localhost: 4000 / в своем браузере, и вы должны увидеть что-то вроде этого:

1.3 Контейнерное приложение Node.js

1.3 Контейнерное приложение Node.js

Вуаля, вы поместили свое первое приложение в контейнер.


Теги: docker

Похожие материалы

0 комментариев
Сортировка:
Добавить комментарий