Docker Compose For Containerizing A MEAN Stack Application



Docker Compose er et verktøy for å definere og kjøre flere containere for å kjøre komplekse applikasjoner i Docker, for eksempel å containerisere et MEAN-program.

I de forrige bloggene på Docker ville du ha lest om hva som er Docker-bilder, Docker-containere og hva som er behovet for dem. Hvis du ikke har lest om dem, ber jeg deg om å lese , før du fortsetter med denne bloggen på Docker Compose.

Etter å ha utforsket mulighetene som følger med Docker, er det absolutt veldig spennende å lære mer. Er det ikke? Vel, i det minste var jeg da jeg snublet inn i en utfordring.





Introduksjon til Docker Compose

Det var enkelt for meg å beholde en enkelt tjenesteapplikasjon. Men da jeg måtte containerisere flere tjenester i separate containere, kom jeg inn i en veisperring. Mitt krav var å containerisere og være vert for en MEAN stack-applikasjon.

Yup, du leste det riktig. En full stack applikasjon. I utgangspunktet trodde jeg det ikke var mulig. Men etter at jeg hørte om Docker Compose, visste jeg at alle problemene mine ville bli løst.



Docker Compose kan brukes til å lage separate containere (og være vert for dem) for hver av stablene i et MEAN stack-program. MEAN er forkortelsen for MongoDB Express Angular & NodeJs. Demoen jeg skal vise i denne bloggen er også om samme emne.

Ved å bruke Docker Compose kan vi være vert for hver av disse teknologiene i separate containere på samme vert og få dem til å kommunisere med hverandre. Hver container vil utsette en port for kommunikasjon med andre containere.

Kommunikasjonen og oppetid for disse containerne vil bli opprettholdt av Docker Compose.



Så du kan spørre, hvordan du setter opp hele infrastrukturen? Vel, la meg gi deg en mer detaljert forklaring.

Dockerfil

I likhet med hvordan vi spinner en enkelt applikasjonsbeholder ved å skrive en dockerfil, må vi skrive en egen dockerfil for å bygge hver av applikasjonene med en enkelt container. I tillegg må vi også skrive en Docker Compose-fil som vil gjøre det faktiske arbeidet. Docker Compose File vil utføre de forskjellige dockerfilene for å lage de forskjellige beholderne og la dem samhandle med hverandre.

I vårt tilfelle har vi en full stack-applikasjon som består av MongoDB, ExpressJS, Angular og NodeJS. MongoDB tar seg av backend-databasen, NodeJS og ExpressJS er for gjengivelse på serversiden, og Angular er for frontend.

MEAN Stack App - Docker Compose - Edureka

Siden det er tre komponenter, må vi spinne beholdere for hver av komponentene. Vi må spinne beholderne på følgende måte:

  1. Beholder 1 - kantet
  2. Container 2 - NodeJS og ExpressJS
  3. Beholder 3 - MongoDB

Opprette Docker Containers

Som det første trinnet for å dokkere den gjennomsnittlige applikasjonen, la oss skrive dockerfilen for å bygge hver av komponentene, med utgangspunkt i Angular's container. Denne dockerfilen må være tilstede i prosjektkatalogen sammen med filen 'package.json'. ‘Package.json’ inneholder detaljene om hvilken versjon av avhengigheter som må brukes av ‘NPM’ for å bygge vinkelapplikasjonen.

1. Dockerfil for frontend

FRA node: 6 KJØR mkdir -p / usr / src / app WORKDIR / usr / src / app KOPIER pakke.json / usr / src / app KJØR npm cache ren KJØR npm installer KOPIER. / usr / src / app EXPOSE 4200 CMD ['npm', 'start']

Som alltid er vår første kommando å trekke et basisbilde, og vi trekker et basis ‘node: 6’ bilde.

De to neste kommandoene handler om å lage en ny katalog ‘/ usr / src / app’ inne i Docker Container for lagring av kantede koder og gjøre dette til arbeidskatalogen i Container.

Vi kopierer deretter 'package.json'-filen fra prosjektkatalogen vår inn i containeren.

Vi kjører deretter kommandoen ‘npm cache clean’ som renser npm-cachen.

Etter det kjører vi kommandoen ‘npm install’ som begynner å laste ned kjeleplatene som kreves for å være vert for Angular-appen. Det begynner å laste ned kjeleplatene basert på versjonene av avhengigheter spesifisert i 'package.json'.

Neste kommando 'RUN' er å kopiere alle koder, mapper som er tilstede fra prosjektkatalogen til inne i containeren.

Ovennevnte kommando ber containeren eksponere portnummer 4200 for å kommunisere med back-end-serveren for å sende forespørsler fra brukere som får tilgang til front-klienten via webgrensesnittet.

Endelig er den siste kommandoen, 'RUN' kommando for å starte 'npm'. Dette begynner å utføre kodene for å bygge vår Angular-app.

Angular-appen er nå klar, men den blir ikke vert riktig på grunn av dens avhengighet av en back-end-server og en database. Så la oss gå videre og skrive en dockerfil for containerisering av back-serveren.

2. Dockerfil for baksiden

Selv denne dockerfilen vil være tilstede i en prosjektkatalog. Denne katalogen inneholder også 'package.json'-filen for å definere avhengighetene til Express-serveren og andre krav til NodeJS. Men viktigst av alt, den inneholder prosjektkoden for å støtte back-end-serveren.

FRA node: 6 KJØR mkdir -p / usr / src / app WORKDIR / usr / src / app KOPIER pakke.json / usr / src / app KJØR npm cache ren KJØR npm installer KOPIER. / usr / src / app EXPOSE 3000 CMD ['npm', 'start']

Som du kan se, er det mange likheter mellom de to dockerfilene. Vi bruker samme ‘node: 6’ som grunnbildelaget, lager en ny katalog inne i containeren, gjør den til arbeidskatalogen og kjører kommandoen ‘npm install’ blant andre. Men den eneste forskjellen er portnummeret som er eksponert for kommunikasjon. I dette tilfellet er portnummer 3000 definert. Dette er hvor serveren vil være vert og vil se etter forespørsler fra klienten.

3. Database

Du lurer kanskje på hvorfor jeg ikke har nevnt ‘dockerfile For Database’ i overskriften. Årsaken er at vi faktisk ikke har behov for å lage tilpasning. Vi kan straks trekke et 'MongoDB' basisbilde for lagring av dataene våre og bare avsløre portnummeret som det er tilgjengelig på.

Nå ville spørsmålet ditt være, hvor skulle jeg gjøre det? Vel, vi kan gjøre det i Docker Compose File.

Docker komponere fil

Docker Compose File er en YAML-fil som inneholder detaljer om tjenester, nettverk og volumer for konfigurering av Docker-applikasjonen.

Kjør kommandoen nedenfor for å finne versjonen av Docker Engine.

docker -v

Å utføre kommandoen vil returnere versjonen som kjører hos verten din. Basert på versjonen av Docker Engine hos verten din, last ned en passende versjon Docker Compose. Du kan se etter riktig versjon å laste ned fra Docker sin offisielle dokumentasjon .

Siden jeg kjører Docker Engine versjon 17.05.0-ce, har jeg brukt Docker Compose versjon 3.

Installer Docker Compose

For å laste ned Compose, kjør settet nedenfor med kommandoer.

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

Merk at versjonsnummeret i kommandoen vil endres basert på Docker Engine-versjonen du kjører.

Nedenfor er kommandoene som er en del av Docker Compose-filen min.

versjon: '3.0' # spesifiser docker-compose versjon # Definer tjenestene / beholderne som skal kjøres tjenester: vinkel: # navn på den første tjenestebyggingen: vinkel-app # spesifiser katalogen til Dockerfile-porter: - '4200: 4200' # spesifiser portmapping express: # navn på den andre tjenestebyggingen: express-server # spesifiser katalogen til Dockerfile-porter: - '3000: 3000' # spesifiser porter mappingkoblinger: - database # lenker denne tjenesten til databasetjenestedatabasen: # navn på det tredje tjenestebildet: mongo # spesifiser bilde for å bygge container fra porter: - '27017: 27017' # spesifiser videresending av port

Jeg er ganske sikker på at kommandoene i filen ovenfor ikke gir mening for deg. Så la oss få løst problemet.

I den første kodelinjen har jeg definert versjonen av Docker Compose jeg bruker. Dette er et veldig viktig trinn hvis du vil at Compose skal fungere skikkelig uten å kaste feil. Sørg for å laste ned Docker Compose-versjonen i henhold til versjonen av Docker Engine.

Etter det definerte jeg tre containere ved å bruke nøkkelordet ‘tjenester’. Disse tjenestene refererer til de tre komponentene i min stack, frontend, back end og database. Så i dette tilfellet vil navnet på containerne være navnet på tjenestene mine, dvs. 'kantet', 'ekspress' og 'database'.

Nøkkelordet 'build' brukes til å indikere at dockerfilen for spinning av containeren er tilstede i den katalogen. Vent, er du forvirret hvordan?

Det er enkelt. Banen må spesifiseres etter ‘build:’. I vårt tilfelle er 'angular-app' og 'express-server' stier til to kataloger som kan nås fra katalogen der Docker Compose-filen er tilstede. For databasebeholderen vår har jeg ganske enkelt sagt bruk en base ‘image: mongo’ i stedet for en vei til dockerfile.

For hver av disse tjenestene har jeg også spesifisert portnumrene som kan brukes til å motta / sende forespørsler fra andre containere (tjenester). 4200 i tilfelle vinkel, 3000 i tilfelle ekspress og 27017 i tilfelle mongo.

I tillegg har ekspresbeholderen en 'link:' til databasebeholder, noe som indikerer at alle data som mottas på serversiden vil bli sendt til databasen der de vil bli lagret.

Nå endelig er vi på slutten av å sette opp en komponere. For å starte en Docker Compose og spinne de tre beholderne med tre tjenester, trenger vi bare å utføre de to kommandoene nedenfor fra katalogen der Docker Compose File (YAML-filen) er til stede:

docker-compose bygge docker-compose opp

Kommandoen 'docker-compose build' brukes til å bygge / gjenoppbygge tjenestene, mens kommandoen 'docker-compose up' brukes til å lage / starte containerne. Gå videre! Prøv det selv.

Nedenfor er skjermbilder av Docker-bilder som bygges og deretter utføres. Du kan legge merke til at kantet bilde bygges og deretter merkes med navnet som “kantet: siste”.

gå til funksjon i python

Dessuten er et bilde for Express bygget med navn og tag som ‘express: latest’.

Nå som bildet er bygget, la oss prøve å kjøre det og dermed spinne en container i prosessen. Nedenfor er skjermbildet.

Nedenfor er skjermbildet som sier 'webpack: compiled heldigvis', noe som betyr at de tre tjenestene blir containerisert med hell av Docker.

Nå som containerne er vert, kan du se tjenestene aktive i deres respektive porter. Gå og skriv inn følgende portnumre i nettleseren din for å samhandle med GUI for MEAN-appen.

lokal vert: 4200 - Vinkelapp (Front-end)
lokal vert: 3000 - Express Server & NodeJS (Back-end / Server-side)
localhost: 27017 - MongoDB (database)

Imponert ennå? Vent, for Docker er ikke ferdig ennå! Vi kan bruke kommandoen 'docker-compose scale =’ x ''for å enkelt skalere opp / ned antall distribusjoner. Med andre ord kan vi lage så mange containere for en tjeneste. Nedenfor er den komplette kommandoen for å skalere en bestemt tjeneste til '5' containere:

docker-compose-skala = 5

Å skalere opp tjenestene så enkelt, pakke og containerisere dem på en så kostnadseffektiv måte er det som gjør Docker til et av de beste distribusjonsverktøyene og min personlige favoritt.

Hvis du fortsatt er i tvil om dette konseptet, kan du se videoen nedenfor der jeg har forklart det samme konseptet med en praktisk hands-on om hvordan du konfigurerer en Docker Compose.

Docker komponere | Containerizing MEAN Stack Application | DevOps-veiledning

Nå som du har lært om Docker, sjekk ut av Edureka, et pålitelig online læringsfirma med et nettverk av mer enn 250 000 fornøyde elever spredt over hele verden. Dette Edureka Docker-sertifiseringskurset hjelper elever å få ekspertise i å implementere Docker og mestre det.

Har du et spørsmål til oss? Vennligst nevn det i kommentarfeltet, så kommer vi tilbake til deg.