Docker Compose voor het containeriseren van een MEAN Stack-applicatie



Docker Compose is een tool voor het definiëren en uitvoeren van meerdere containers om complexe applicaties in Docker uit te voeren, bijvoorbeeld het containeriseren van een MEAN-applicatie.

In de vorige blogs over Docker zou je hebben gelezen wat Docker-images en Docker-containers zijn en wat de noodzaak ervan is. Als je er niet over hebt gelezen, verzoek ik je om ze te lezen , alvorens verder te gaan met deze blog over Docker Compose.

hoe logger te gebruiken in java

Na het verkennen van de mogelijkheden die Docker biedt, is het zeker heel spannend om meer te leren. Is het niet? Dat was ik tenminste toen ik tegen een uitdaging aanliep.





Inleiding tot Docker Compose

Het containeriseren van een enkele servicetoepassing was gemakkelijk voor mij. Maar toen ik meerdere services in afzonderlijke containers moest containers, kwam ik een wegversperring tegen. Mijn vereiste was om een ​​MEAN-stacktoepassing te containeriseren en te hosten.

Ja, je leest het goed. Een volledige stack-applicatie. Aanvankelijk dacht ik dat het niet mogelijk was. Maar nadat ik over Docker Compose hoorde, wist ik dat al mijn problemen zouden worden opgelost.



Docker Compose kan worden gebruikt om afzonderlijke containers te maken (en te hosten) voor elk van de stapels in een MEAN-stacktoepassing. MEAN is het acroniem voor MongoDB Express Angular & NodeJs. De demo die ik in deze blog zal laten zien, gaat ook over hetzelfde onderwerp.

Door Docker Compose te gebruiken, kunnen we elk van deze technologieën in afzonderlijke containers op dezelfde host hosten en ze met elkaar laten communiceren. Elke container zal een poort blootleggen voor communicatie met andere containers.

De communicatie en up-time van deze containers wordt onderhouden door Docker Compose.



Dus je kunt je afvragen hoe je deze hele infrastructuur moet opzetten? Welnu, laat me u een meer gedetailleerde uitleg geven.

Dockerfile

Vergelijkbaar met hoe we een enkele applicatie-container draaien door een dockerfile te schrijven, zullen we een apart dockerfile moeten schrijven voor het bouwen van elk van de single-container applicaties. Bovendien zullen we ook een Docker Compose-bestand moeten schrijven dat het eigenlijke werk zal doen. Docker Compose File zal de verschillende dockerfiles uitvoeren om de verschillende containers te maken en ze met elkaar te laten communiceren.

In ons geval hebben we een volledige stack-applicatie die bestaat uit MongoDB, ExpressJS, Angular en NodeJS. MongoDB zorgt voor de back-enddatabase, NodeJS en ExpressJS zijn voor server-side rendering en Angular is voor front-end.

MEAN Stack-app - Docker Compose - Edureka

Omdat er drie componenten zijn, moeten we containers draaien voor elk van de componenten. We moeten de containers op de volgende manier laten draaien:

  1. Container 1 - Hoekig
  2. Container 2 - NodeJS en ExpressJS
  3. Container 3 - MongoDB

Docker-containers maken

Als eerste stap om de gemiddelde applicatie te koppelen, schrijven we het dockerbestand voor het bouwen van elk van de componenten, uitgaande van de container van Angular. Dit dockerbestand zal aanwezig moeten zijn in de projectdirectory, samen met het ‘package.json’ -bestand. Het ‘package.json’ bevat de details over welke versie van afhankelijkheden door ‘NPM’ moet worden gebruikt voor het bouwen van de hoekapplicatie.

1. Dockerfile voor front-end

FROM node: 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 4200 CMD EXPOSEREN ['npm', 'start']

Zoals altijd is ons eerste commando om een ​​basisimage te trekken, en we trekken een basis ‘node: 6’ -beeld.

De volgende twee opdrachten gaan over het aanmaken van een nieuwe directory ‘/ usr / src / app’ in de Docker-container voor het opslaan van Angular-codes en om dit de werkdirectory in de container te maken.

We kopiëren dan het ‘package.json’ -bestand van onze projectdirectory naar de container.

Vervolgens voeren we de opdracht ‘npm cache clean’ uit die de npm-cache opschoont.

Daarna voeren we de opdracht ‘npm install’ uit, waarmee we de boilerplaten downloaden die nodig zijn voor het hosten van de Angular-app. Het begint met het downloaden van de boilerplaten op basis van de versies van afhankelijkheden gespecificeerd in ‘package.json’.

De volgende ‘RUN’ -opdracht is om alle codes, aanwezige mappen uit de projectdirectory, naar de container te kopiëren.

De bovenstaande opdracht vraagt ​​de container om poortnummer 4200 vrij te geven voor communicatie met de back-end-server om verzoeken te verzenden van gebruikers die toegang hebben tot de front-end-client via de web-UI.

Ten slotte is het laatste commando, ‘RUN’ commando om ‘npm’ te starten. Dit begint met het uitvoeren van de codes voor het bouwen van onze Angular-app.

De Angular-app is nu klaar, maar wordt niet goed gehost vanwege de afhankelijkheid van een back-end-server en een database. Laten we dus verder gaan en een dockerfile schrijven voor het plaatsen van de back-end-server.

2. Dockerfile voor back-end

Zelfs dit dockerbestand zal aanwezig zijn in een projectdirectory. Deze directory zal ook het ‘package.json’ -bestand bevatten voor het definiëren van de afhankelijkheden van de Express-server en andere vereisten van NodeJS. Maar het belangrijkste is dat het de projectcode bevat om de back-end-server te ondersteunen.

FROM node: 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 3000 CMD EXPOSE ['npm', 'start']

Zoals u kunt zien, zijn er veel overeenkomsten tussen de twee dockerfiles. We gebruiken dezelfde ‘node: 6’ als de basisimage-laag, maken een nieuwe directory in de container, maken dit de werkdirectory en voeren onder andere de opdracht ‘npm install 'uit. Maar het enige verschil is het poortnummer dat beschikbaar is voor communicatie. In dit geval is poortnummer 3000 gedefinieerd. Dit is waar de server wordt gehost en zoekt naar verzoeken van de client.

3. Database

U vraagt ​​zich misschien af ​​waarom ik ‘dockerfile For Database’ niet in de kop heb genoemd. De reden hiervoor is dat we eigenlijk geen maatwerk hoeven te maken. We kunnen meteen een ‘MongoDB’-basisimage ophalen voor het opslaan van onze gegevens en het poortnummer weergeven waarop deze kan worden geopend.

Nu zou de vraag waar u aan denkt zijn: waar zou ik dat doen? Welnu, we kunnen dat doen in het Docker Compose-bestand.

Docker Compose-bestand

Docker Compose File is een YAML-bestand dat details bevat over de services, netwerken en volumes voor het instellen van de Docker-applicatie.

Voer de onderstaande opdracht uit om de versie van uw Docker Engine te vinden.

docker -v

Als u de opdracht uitvoert, wordt de versie geretourneerd die op uw host wordt uitgevoerd. Download een geschikte versie van Docker Compose op basis van de versie van Docker Engine bij uw host. U kunt de juiste versie zoeken om van te downloaden Docker's officiële documentatie .

Sinds ik Docker Engine versie 17.05.0-ce gebruik, heb ik Docker Compose versie 3 gebruikt.

Installeer Docker Compose

Om Compose te downloaden, voert u de onderstaande reeks opdrachten uit.

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

Merk op dat het versienummer in de opdracht zal veranderen op basis van de Docker Engine-versie die u gebruikt.

Hieronder staan ​​de opdrachten die deel uitmaken van mijn Docker Compose File.

version: '3.0' # specificeer docker-compose versie # Definieer de services / containers die moeten worden uitgevoerd services: angular: # naam van de eerste service build: angular-app # specificeer de directory van de Dockerfile-poorten: - '4200: 4200' # specificeer poorttoewijzing express: # naam van de tweede service build: express-server # specificeer de directory van de Dockerfile-poorten: - '3000: 3000' #specificeer poorten die koppelingen toewijzen: - database # koppel deze service aan de database service-database: # naam van de derde service-image: mongo # specificeer image om container van poorten te bouwen: - '27017: 27017' # specificeer port forwarding

Ik ben er vrij zeker van dat de opdrachten in het bovenstaande bestand geen betekenis voor je hebben. Dus laten we dat probleem oplossen.

In de eerste regel code heb ik de versie van Docker Compose gedefinieerd die ik gebruik. Dit is een zeer belangrijke stap als u wilt dat Compose correct functioneert zonder een fout te genereren. Zorg ervoor dat u de Docker Compose-versie downloadt volgens de versie van uw Docker Engine.

Daarna heb ik drie containers gedefinieerd met behulp van het zoekwoord ‘services’. Deze services verwijzen naar de drie componenten van mijn stack, front-end, back-end en database. Dus in dit geval is de naam van mijn containers de naam van mijn services, d.w.z. ‘hoekig’, ‘express’ en ‘database’.

Het trefwoord ‘build’ wordt gebruikt om aan te geven dat het dockerbestand voor het draaien van die container in die directory aanwezig is. Wacht, ben je in de war hoe?

Het is makkelijk. Het pad moet worden gespecificeerd na ‘build:’. In ons geval zijn ‘angular-app’ en ‘express-server’ paden naar twee mappen die kunnen worden bereikt vanuit de map waarin het Docker Compose-bestand aanwezig is. Voor onze databasecontainer heb ik simpelweg gezegd gebruik een basis ‘image: mongo’ in plaats van een pad naar dockerfile.

hoe singleton class in java te schrijven

Voor elk van deze services heb ik ook de poortnummers gespecificeerd die kunnen worden gebruikt om verzoeken van andere containers (services) te ontvangen / verzenden. 4200 in het geval van hoekig, 3000 in het geval van expres en 27017 in het geval van Mongo.

Bovendien heeft de express-container een ‘link:’ naar de databasecontainer, wat aangeeft dat alle gegevens die aan de serverzijde worden ontvangen, naar de database worden gestuurd waar ze worden opgeslagen.

Nu zijn we eindelijk aan het einde van het opzetten van een Compose. Om een ​​Docker Compose te starten en de drie containers met drie services te laten draaien, moeten we simpelweg de onderstaande twee opdrachten uitvoeren vanuit de map waar het Docker Compose-bestand (YAML-bestand) aanwezig is:

docker-compose build docker-compose up

De opdracht ‘docker-compose build’ wordt gebruikt om de services te bouwen / opnieuw samen te stellen, terwijl de opdracht ‘docker-compose up’ wordt gebruikt om de containers te maken / starten. Doe Maar! Probeer het zelf.

Hieronder staan ​​schermafbeeldingen van Docker-afbeeldingen die worden gemaakt en vervolgens worden uitgevoerd. U kunt zien dat Angular-afbeelding wordt gebouwd en vervolgens wordt getagd met de naam als ‘angular: latest’.

Er wordt ook een afbeelding voor Express gemaakt met naam en tag als ‘express: nieuwste’.

Nu de afbeelding is gemaakt, kunnen we proberen deze uit te voeren en zo een container te laten draaien. Hieronder is dat screenshot.

Hieronder ziet u de schermafbeelding met de tekst ‘webpack: succesvol samengesteld’, wat betekent dat de drie services met succes zijn gecontaineriseerd door Docker.

Nu de containers worden gehost, kunt u de services zien die actief zijn op hun respectieve poorten. Typ de volgende poortnummers in uw webbrowser om te communiceren met de GUI van de MEAN-app.

localhost: 4200 - Angular App (front-end)
localhost: 3000 - Express Server & NodeJS (Back-end / Server-side)
localhost: 27017 - MongoDB (database)

Al onder de indruk? Wacht, want Docker is nog niet klaar! We kunnen de opdracht 'docker-compose scale = ’x' '' gebruiken om het aantal implementaties eenvoudig omhoog / omlaag te schalen. Met andere woorden, we kunnen zoveel containers maken voor een dienst. Hieronder vindt u de volledige opdracht om een ​​bepaalde service te schalen naar ‘5’ containers:

docker-compose schaal = 5

De services op zo'n gemakkelijke manier opschalen, ze op zo'n kosteneffectieve manier verpakken en in containers plaatsen, dat maakt Docker tot een van de beste implementatietools en mijn persoonlijke favoriet.

Mocht je nog twijfels hebben over dit concept, dan kun je de onderstaande video bekijken waarin ik hetzelfde concept heb uitgelegd met een praktische hands-on hoe je een Docker Compose opzet.

Docker Compose | Containerisatie MEAN Stack-applicatie | DevOps-zelfstudie

Nu je meer over Docker hebt gehoord, kun je het door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. Deze Edureka Docker-certificeringstraining helpt leerlingen om expertise op te doen in het implementeren en beheersen van Docker.

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte en we nemen contact met u op.