Docker Compose за контейнериране на приложение MEAN Stack



Docker Compose е инструмент за дефиниране и изпълнение на множество контейнери за изпълнение на сложни приложения в Docker, например контейнеризиране на MEAN приложение.

В предишните блогове на Docker щяхте да прочетете какво представляват Docker изображения, контейнери на Docker и каква е необходимостта от тях. Ако не сте чели за тях, моля да прочетете , преди да продължите с този блог на Docker Compose.

След проучване на възможностите, които идва с Docker, със сигурност е много вълнуващо да научите повече. Нали? Ами поне бях, когато попаднах на предизвикателство.





Въведение в Docker Compose

Съдържането на едно приложение за услуга беше лесно за мен. Но когато трябваше да съдържам множество услуги в отделни контейнери, се натъкнах на пречка. Моето изискване беше да съдържам и хоствам MEAN стек приложение.

Да, добре сте го прочели. Пълно стек приложение. Първоначално мислех, че не е възможно. Но след като чух за Docker Compose, знаех, че всичките ми проблеми ще бъдат решени.



до силата на in java

Docker Compose може да се използва за създаване на отделни контейнери (и да ги хоства) за всеки от стековете в стек приложение MEAN. MEAN е съкращението за MongoDB Express Angular & NodeJs. Демото, което ще покажа в този блог, също е на същата тема.

Използвайки Docker Compose, можем да хостваме всяка от тези технологии в отделни контейнери на един и същи хост и да ги накараме да комуникират помежду си. Всеки контейнер ще изложи порт за комуникация с други контейнери.

Комуникацията и времето за работа на тези контейнери ще се поддържат от Docker Compose.



Така че можете да попитате как да настроите цялата тази инфраструктура? Е, тогава нека ви дам по-подробно обяснение.

Докер файл

Подобно на начина, по който въртим всеки контейнер с едно приложение, като напишем dockerfile, ще трябва да напишем отделен dockerfile за изграждане на всяко от приложенията с един контейнер. Освен това ще трябва да напишем и Docker Compose File, който ще свърши действителната работа. Docker Compose File ще изпълни различните докер файлове, за да създаде различните контейнери и ще им позволи да взаимодействат помежду си.

В нашия случай имаме приложение за пълен стек, което се състои от MongoDB, ExpressJS, Angular и NodeJS. MongoDB се грижи за базата данни отзад, NodeJS и ExpressJS са за рендиране от страна на сървъра, а Angular е за предния край.

MEAN Stack App - Docker Compose - Edureka

Тъй като има три компонента, трябва да въртим контейнери за всеки от компонентите. Трябва да завъртим контейнерите по следния начин:

  1. Контейнер 1 - ъглова
  2. Контейнер 2 - NodeJS и ExpressJS
  3. Контейнер 3 - MongoDB

Създаване на Docker контейнери

Като първата стъпка за докеризиране на средното приложение, нека напишем dockerfile за изграждане на всеки от компонентите, започвайки от контейнера на Angular. Този докер файл ще трябва да присъства в директорията на проекта заедно с файла ‘package.json’. ‘Package.json’ съдържа подробности за това коя версия на зависимостите трябва да се използва от ‘NPM’ за изграждане на ъгловото приложение.

1. Dockerfile за предния край

ОТ възел: 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY. / usr / src / app EXPOSE 4200 CMD ['npm', 'start']

Както винаги, първата ни команда е да издърпаме основно изображение, а ние издърпваме основно изображение ‘node: 6’.

Следващите две команди са за създаване на нова директория ‘/ usr / src / app’ вътре в контейнера на Docker за съхраняване на ъглови кодове и превръщането на тази в работна директория в контейнера.

След това копираме файла ‘package.json’ от нашата директория на проекта във вътрешността на контейнера.

След това изпълняваме командата ‘npm cache clean’, която почиства npm кеша.

След това изпълняваме командата ‘npm install’, която започва да изтегля котлените плочи, необходими за хостването на приложението Angular. Той започва да изтегля котлените плочи въз основа на версиите на зависимости, посочени в ‘package.json’.

Следващото изпълнение на командата „RUN“ е да копирате всички кодове, папки, присъстващи от директорията на проекта във вътрешността на контейнера.

Горната команда изисква контейнерът да изложи номер на порт 4200 за комуникация със сървъра отзад, за да изпраща заявки, направени от потребители, осъществяващи достъп до клиентския интерфейс чрез уеб потребителския интерфейс.

Накрая последната команда е „RUN“ команда за стартиране на „npm“. Това започва да изпълнява кодовете за изграждане на нашето Angular приложение.

Приложението Angular вече е готово, но няма да бъде хоствано правилно поради зависимостта му от сървъра и базата данни. Така че нека да продължим по-нататък и да напишем dockerfile за контейнеризиране на сървъра отзад.

2. Dockerfile за Back End

Дори този докер файл ще присъства в директория на проекта. Тази директория също ще съдържа файла ‘package.json’ за дефиниране на зависимостите на Express сървъра и други изисквания на NodeJS. Но най-важното е, че съдържа кода на проекта за поддръжка на сървъра отзад.

ОТ възел: 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY. / usr / src / app EXPOSE 3000 CMD ['npm', 'start']

Както можете да видите, има много прилики между двата докер файла. Използваме същия „възел: 6“ като основния слой с изображение, създаваме нова директория вътре в контейнера, превръщаме я в работна директория и изпълняваме командата „npm install“ наред с други. Но единствената разлика е номерът на порта, изложен за комуникация. В този случай е дефиниран номер на порт 3000. Тук ще бъде хостван сървърът и ще търси заявки от клиента.

3. База данни

Може да се чудите защо не съм споменал „dockerfile за база данни“ в заглавието. Причината е, че всъщност нямаме нужда от персонализиране. Веднага можем да издърпаме основно изображение на MongoDB за съхранение на нашите данни и просто да изложим номера на порта, от който може да се осъществи достъп.

Сега въпросът, който си мислите, би бил, къде да го направя? Е, можем да направим това в Docker Compose File.

Docker Compose File

Docker Compose File е YAML файл, който съдържа подробности за услугите, мрежите и обемите за настройка на приложението Docker.

Изпълнете командата по-долу, за да намерите версията на вашия Docker Engine.

докер -v

Изпълнението на командата ще върне версията, работеща на вашия хост. Въз основа на версията на Docker Engine на вашия хост, изтеглете подходяща версия Docker Compose. Можете да потърсите подходящата версия за изтегляне от Официалната документация на Docker .

Тъй като използвам Docker Engine версия 17.05.0-ce, използвах Docker Compose версия 3.

Инсталирайте Docker Compose

За да изтеглите Compose, изпълнете по-долу набор от команди.

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o / usr / local / bin / docker- compose sudo chmod + x / usr / local / bin / docker-compose

Обърнете внимание, че номерът на версията в командата ще се промени в зависимост от версията на Docker Engine, която използвате.

По-долу са командите, които са част от моя Docker Compose File.

версия: '3.0' # посочете версията на docker-compose # Определете услугите / контейнерите, които да се изпълняват услуги: angular: # име на първата компилация на услугата: angular-app # посочете директорията на портовете на Dockerfile: - '4200: 4200' # посочете експрес на картографиране на портове: # име на второто изграждане на услуга: експрес-сървър # посочете директорията на портовете на Dockerfile: - '3000: 3000' # специфицирайте връзки за картографиране на портове: - база данни # свържете тази услуга с базата данни с услуги на базата данни: # име на третото изображение на услугата: mongo # посочете изображение за изграждане на контейнер от портове: - '27017: 27017' # посочете пренасочване на портове

Сигурен съм, че командите в горния файл нямат смисъл за вас. Така че, нека решим този проблем.

В първия ред на кода дефинирах версията на Docker Compose, която използвам. Това е много важна стъпка, ако искате Compose да функционира правилно, без да извежда грешка. Не забравяйте да изтеглите версията на Docker Compose според версията на вашия Docker Engine.

След това определих три контейнера, използвайки ключовата дума „услуги“. Тези услуги се отнасят до трите компонента на моя стек, преден край, заден край и база данни. Така че в този случай името на моите контейнери ще бъде името на моите услуги, т.е. ‘angular’, ‘express’ и ‘database’.

Ключовата дума ‘build’ се използва, за да покаже, че dockerfile за въртене на този контейнер присъства в тази директория. Чакай, объркан ли си как?

Просто е. Пътят трябва да бъде посочен след ‘build:’. В нашия случай ‘angular-app’ и ‘express-server’ са пътища към две директории, до които може да се стигне от директорията, в която се намира Docker Compose File. За нашия контейнер за база данни просто казах, използвайте базово ‘image: mongo’ вместо път към dockerfile.

За всяка от тези услуги също съм посочил номерата на портовете, които могат да се използват за получаване / изпращане на заявки от други контейнери (услуги). 4200 в случай на ъглови, 3000 в случай на експрес и 27017 в случай на монго.

Освен това експресният контейнер има „връзка:“ към контейнера на базата данни, което показва, че каквито и да е данни, получени от страната на сървъра, ще бъдат изпратени в базата данни, където ще бъдат съхранявани.

Сега най-накрая стигнахме до заключението за създаване на Compose. За да стартираме Docker Compose и да завъртим трите контейнера с три услуги, трябва просто да изпълним следните две команди от директорията, в която се намира Docker Compose File (YAML файл):

docker-compose изграждане на docker-compose up

Командата ‘docker-compose build’ се използва за изграждане / възстановяване на услугите, докато командата ‘docker-compose up’ се използва за създаване / стартиране на контейнерите. Продължавай! Опитайте сами.

По-долу са скрийншотове на изображения на Docker, които се изграждат и след това се изпълняват. Можете да забележите, че се създава ъглово изображение и след това се маркира с име като „ъглово: последно“.

Също така, изображение за Express е изградено с име и етикет като ‘express: latest’.

Сега, когато изображението е изградено, нека опитаме да го стартираме и по този начин да въртим контейнер в процеса. По-долу е тази екранна снимка.

По-долу е екранна снимка, която казва „webpack: компилиран успешно“, което означава, че трите услуги са контейнеризирани успешно от Docker.

Сега, когато контейнерите са хоствани, можете да видите услугите, активни на съответните им портове. Отидете на следните номера на портове във вашия уеб браузър, за да взаимодействате с GUI на приложението MEAN.

localhost: 4200 - Ъглово приложение (отпред)
localhost: 3000 - Express Server & NodeJS (отзад / от страна на сървъра)
localhost: 27017 - MongoDB (база данни)

Впечатлени ли сте вече? Изчакайте, защото Docker все още не е свършил! Можем да използваме командата “docker-compose scale =’ x '”, за да мащабираме лесно нагоре / надолу броя на разполаганията. С други думи, можем да създадем толкова много контейнери за услуга. По-долу е дадена пълната команда за мащабиране на конкретна услуга до контейнери „5“:

скала за композиране на докер = 5

Мащабирането на услугите с такава лекота, опаковането и контейнерирането им по толкова рентабилен начин е, което прави Docker един от най-добрите инструменти за внедряване и моят личен фаворит.

Ако все още имате съмнения относно тази концепция, можете да гледате видеото по-долу, където обясних същата концепция с практически практически начини за настройка на Docker Compose.

Docker Compose | Контейнериране на MEAN Stack Application | Урок за DevOps

След като научихте за Docker, разгледайте от Edureka, доверена компания за онлайн обучение с мрежа от над 250 000 доволни учащи, разпространени по целия свят. Този курс за сертифициране на Edureka Docker помага на обучаващите се да придобият опит в прилагането на Docker и овладяването му.

Имате въпрос към нас? Моля, споменете го в раздела за коментари и ние ще се свържем с вас.