Зачем использовать докер?
Давным-давно, когда бизнесу требовалось другое приложение, команда DevOps покупала сервер, не зная требований к производительности новых приложений. Это потребовало бы большого количества догадок и напрасной траты капитала и ресурсов, которые можно было бы использовать для других приложений.
Виртуальные машин позволили запускать несколько приложений на одних и тех же серверах. Но недостаток в том, что каждой виртуальной машине для работы требовалась вся ОС. Каждой ОС для работы требуются ЦП, ОЗУ и т. д. Она требует исправлений и лицензирования, что, в свою очередь, увеличивает стоимость и отказоустойчивость.
Google уже давно начал использовать модель контейнеров для устранения недостатков модели ВМ. По сути, модель контейнера означает, что несколько контейнеров на одном и том же хосте используют один и тот же хост, освобождая ЦП и оперативную память, которые можно использовать в другом месте.
Но как это помогает разработчикам?
Это гарантирует, что рабочая среда одинакова для всех разработчиков и всех серверов, т.е. для производства, подготовки и тестирования.
Любой желающий может настроить проект за секунды, не нужно возиться с конфигурацией, установкой библиотек, установочными зависимостями и т. д.
Проще говоря, докер - это платформа, которая позволяет разрабатывать, развертывать и запускать приложения с контейнерами.
Давайте сделаем шаг назад, как контейнерная система выглядит физически и чем она отличается от ВМ.
Как видите, хост и его ресурсы совместно используются в контейнерах, но не в виртуальной машине.
Как пользоваться докером?
Для этого нам необходимо ознакомиться с определенной терминологией.
Образ 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 / в своем браузере, и вы должны увидеть что-то вроде этого:
Вуаля, вы поместили свое первое приложение в контейнер.
0 комментариев
Добавить комментарий