Docker Compose för behållning av en MEAN Stack-applikation



Docker Compose är ett verktyg för att definiera och köra flera behållare för att köra komplexa applikationer i Docker, till exempel att containerisera ett MEAN-program.

I de tidigare bloggarna på Docker skulle du ha läst om vad som är Docker-bilder, Docker-behållare och vad som är behovet av dem. Om du inte har läst om dem, ber jag dig läsa , innan du fortsätter med den här bloggen på Docker Compose.

Efter att ha undersökt möjligheterna med Docker är det verkligen spännande att lära sig mer. Är det inte? Det var jag åtminstone när jag stötte på en utmaning.





Introduktion till Docker Compose

Det var lätt för mig att behålla en enskild serviceapplikation. Men när jag var tvungen att containerisera flera tjänster i separata containrar, stötte jag på en spärr. Mitt krav var att containerisera och vara värd för en MEAN stack-applikation.

Yup, du läste det rätt. En full stack-applikation. Inledningsvis trodde jag att det inte var möjligt. Men efter att jag hört talas om Docker Compose visste jag att alla mina problem skulle lösas.



Docker Compose kan användas för att skapa separata behållare (och vara värd för dem) för var och en av stackarna i en MEAN-stackapplikation. MEAN är förkortningen för MongoDB Express Angular & NodeJs. Demonstrationen som jag kommer att visa i den här bloggen handlar också om samma ämne.

Genom att använda Docker Compose kan vi vara värd för var och en av dessa teknologier i separata behållare på samma värd och få dem att kommunicera med varandra. Varje container exponerar en port för kommunikation med andra containrar.

Kommunikationen och upptid för dessa containrar kommer att upprätthållas av Docker Compose.



Så du kanske frågar hur man konfigurerar hela denna infrastruktur? Låt mig ge dig en mer detaljerad förklaring.

Dockerfil

På samma sätt som hur vi snurrar en container med en applikation genom att skriva en dockerfil, måste vi skriva en separat dockerfil för att bygga var och en av applikationerna med en container. Dessutom måste vi också skriva en Docker Compose-fil som kommer att göra det verkliga arbetet. Docker Compose File kör olika dockerfiler för att skapa olika behållare och låta dem interagera med varandra.

I vårt fall har vi en full stack-applikation som består av MongoDB, ExpressJS, Angular och NodeJS. MongoDB tar hand om backend-databasen, NodeJS och ExpressJS är för rendering på serversidan och Angular är för frontend.

MEAN Stack App - Docker Compose - Edureka

Eftersom det finns tre komponenter måste vi snurra behållare för var och en av komponenterna. Vi måste snurra behållarna på följande sätt:

java scanner få nästa char
  1. Behållare 1 - Vinkel
  2. Behållare 2 - NodeJS och ExpressJS
  3. Behållare 3 - MongoDB

Skapa Docker Containers

Som det första steget att docka storleken på den genomsnittliga applikationen, låt oss skriva dockerfilen för att bygga var och en av komponenterna, från Angular's container. Denna dockerfil måste finnas i projektkatalogen tillsammans med filen 'package.json'. ”Package.json” innehåller detaljerna om vilken version av beroenden som måste användas av ”NPM” för att bygga vinkelapplikationen.

1. Dockerfil för frontend

FRÅN nod: 6 KÖR mkdir -p / usr / src / app WORKDIR / usr / src / app KOPIERA paket.json / usr / src / app KÖR npm cache ren KÖR npm installera KOPIERA. / usr / src / app EXPOSE 4200 CMD ['npm', 'start']

Som alltid är vårt första kommando att dra en basbild, och vi drar en bas-nod: 6-bild.

De kommande två kommandona handlar om att skapa en ny katalog '/ usr / src / app' inuti Docker Container för att lagra vinkelkoder och göra detta till en fungerande katalog i Container.

Vi kopierar sedan filen 'package.json' från vår projektkatalog till inne i containern.

Vi kör sedan kommandot 'npm cache clean' som rensar npm cache.

Därefter kör vi kommandot ”npm install” som börjar ladda ner de pannplattor som krävs för att vara värd för appen Angular. Det börjar ladda ner pannplattorna baserat på de versioner av beroenden som anges i 'package.json'.

Nästa ”KÖR” -kommandokörning är att kopiera alla koder, mappar som finns från projektkatalogen till inne i containern.

Ovanstående kommando ber behållaren att exponera portnummer 4200 för att kommunicera med back-server för att skicka förfrågningar från användare som har åtkomst till front-klienten via webbgränssnittet.

Slutligen är det sista kommandot, 'KÖR' -kommandot för att starta 'npm'. Detta börjar köra koder för att bygga vår Angular-app.

Angular-appen är nu redo, men den kommer inte att vara värd på grund av dess beroende av en back-end-server och en databas. Så låt oss gå längre och skriva en dockerfil för att containerisera backend-servern.

2. Dockerfil för baksidan

Även denna dockerfil kommer att finnas i en projektkatalog. Den här katalogen innehåller också filen 'package.json' för att definiera beroenden för Express-servern och andra krav för NodeJS. Men viktigast av allt, den innehåller projektkoden för att stödja backend-servern.

FRÅN nod: 6 KÖR mkdir -p / usr / src / app WORKDIR / usr / src / app KOPIERA paket.json / usr / src / app KÖR npm cache ren KÖR npm installera KOPIERA. / usr / src / app EXPOSE 3000 CMD ['npm', 'start']

Som du kan se finns det många likheter mellan de två dockerfilerna. Vi använder samma “nod: 6” som basbildlagret, skapar en ny katalog inuti behållaren, gör den till arbetskatalogen och kör bland annat kommandot ”npm install”. Men den enda skillnaden är det portnummer som exponeras för kommunikation. I detta fall definieras portnummer 3000. Det är här servern kommer att vara värd och letar efter förfrågningar från klienten.

3. Databas

Du kanske undrar varför jag inte har nämnt ”dockerfile For Database” i rubriken. Anledningen är att vi faktiskt inte behöver göra några anpassningar. Vi kan genast dra en ”MongoDB” basbild för att lagra våra data och bara exponera det portnummer som det kan nås på.

Nu kommer frågan att tänka dig, var skulle jag göra det? Det kan vi göra i Docker Compose-filen.

Docker komponera fil

Docker Compose File är en YAML-fil som innehåller information om tjänster, nätverk och volymer för att konfigurera Docker-applikationen.

Kör kommandot nedan för att hitta versionen av din Docker Engine.

hybrid ramverk i selen webdriver
docker -v

Genom att utföra kommandot returneras versionen som körs hos din värd. Baserat på versionen av Docker Engine hos din värd, ladda ner en lämplig version Docker Compose. Du kan leta efter lämplig version att ladda ner från Docker's officiella dokumentation .

Sedan jag kör Docker Engine version 17.05.0-ce har jag använt Docker Compose version 3.

Installera Docker Compose

För att ladda ner Compose, kör nedanstående uppsättning kommandon.

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

Observera att versionsnumret i kommandot ändras baserat på Docker Engine-versionen du kör.

Nedan följer kommandona som ingår i min Docker Compose-fil.

version: '3.0' # specificera docker-compose-version # Definiera de tjänster / behållare som ska köras tjänster: vinkel: # namnet på den första tjänstbyggnaden: vinkel-app # ange katalogen för Dockerfile-portarna: - '4200: 4200' # specificera portmappning express: # namn på den andra tjänstbyggnaden: expressserver # specificera katalogen för Dockerfile-portarna: - '3000: 3000' #specificera portar mappningslänkar: - databas # länka denna tjänst till databastjänstdatabasen: # namn på den tredje serviceavbilden: mongo # ange bild för att bygga container från portar: - '27017: 27017' # ange portvidarebefordran

Jag är ganska säker på att kommandona i ovanstående fil inte är vettiga för dig. Så låt oss lösa det problemet.

I den första raden kod har jag definierat den version av Docker Compose jag använder. Detta är ett mycket viktigt steg om du vill att Compose ska fungera ordentligt utan att kasta något fel. Se till att ladda ner Docker Compose-versionen enligt versionen av din Docker Engine.

Efter det definierade jag tre containrar med hjälp av nyckelordet ”tjänster”. Dessa tjänster hänvisar till de tre komponenterna i min stack, frontend, backend och databas. Så i det här fallet kommer namnet på mina containrar att vara namnet på mina tjänster, det vill säga 'vinkel', 'express' och 'databas'.

Nyckelordet ”build” används för att indikera att dockerfilen för att spinna den containern finns i den katalogen. Vänta, är du förvirrad hur?

Det är enkelt. Sökvägen måste anges efter 'build:'. I vårt fall är 'vinkel-app' och 'express-server' vägar till två kataloger som kan nås från katalogen där Docker Compose-filen finns. För vår databasbehållare har jag helt enkelt sagt att använda en bas 'image: mongo' istället för en väg till dockerfile.

För var och en av dessa tjänster har jag också angett portnumren som kan användas för att ta emot / skicka förfrågningar från andra containrar (tjänster). 4200 vid vinkel, 3000 vid express och 27017 vid mongo.

Dessutom har expressbehållaren en ”länk:” till databasbehållaren, vilket indikerar att vilken data som helst som tas emot på serversidan kommer att skickas till databasen där den kommer att lagras.

c ++ java python

Nu äntligen är vi vid slutet av att skapa en Compose. För att starta en Docker Compose och snurra de tre behållarna med tre tjänster måste vi helt enkelt utföra nedanstående två kommandon från katalogen där Docker Compose File (YAML-filen) finns:

docker-compose bygg docker-compose upp

Kommandot 'docker-compose build' används för att bygga / bygga om tjänsterna medan kommandot 'docker-compose up' används för att skapa / starta behållarna. Varsågod! Prova själv.

Nedan visas skärmdumpar av Docker-bilder som byggs och sedan körs. Du kan märka att den vinklade bilden byggs och sedan taggas med namnet som ”vinkel: senaste”.

En bild för Express är också byggd med namn och tagg som ”express: senaste”.

Nu när bilden är byggd, låt oss försöka köra den och därmed snurra en container i processen. Nedan är den skärmdumpen.

Nedan är skärmdumpen som säger 'webpack: compiled lyckad' vilket innebär att de tre tjänsterna containeriseras framgångsrikt av Docker.

Nu när behållarna är värd kan du se tjänsterna aktiva i deras respektive portar. Gå in följande portnummer i din webbläsare för att interagera med GUI-appen för MEAN-appen.

lokal värd: 4200 - Vinkelapp (Front-end)
lokal värd: 3000 - Express Server & NodeJS (Back-end / Server-side)
localhost: 27017 - MongoDB (databas)

Imponerad ännu? Vänta, för Docker är inte klar ännu! Vi kan använda kommandot “docker-compose scale =’ x ”” för att enkelt skala upp / ner antalet distributioner. Med andra ord kan vi skapa så många containrar för en tjänst. Nedan är det kompletta kommandot för att skala en viss tjänst till '5' -behållare:

docker-compose-skala = 5

Att skala upp tjänsterna så enkelt, packa och containerisera dem på ett så kostnadseffektivt sätt är det som gör Docker till ett av de bästa distributionsverktygen och min personliga favorit.

Om du fortfarande tvivlar på detta koncept, kan du titta på videon nedan där jag har förklarat samma koncept med en praktisk praktik för hur du ställer in en Docker Compose.

Docker Compose | Containerizing MEAN Stack Application | DevOps handledning

Nu när du har lärt dig om Docker, kolla in av Edureka, ett pålitligt online-lärande företag med ett nätverk av mer än 250 000 nöjda elever spridda över hela världen. Den här Edureka Docker Certification Training-kursen hjälper eleverna att få expertis i att implementera Docker och behärska den.

Har du en fråga till oss? Vänligen nämna det i kommentarfältet så återkommer vi till dig.