In de loop der jaren zijn applicaties en tools complexer geworden om te voldoen aan veranderende eisen en verwachtingen van mensen. Maar dit kan problemen veroorzaken met codecompatibiliteit en externe toegang. Bijvoorbeeld, een codebase die goed functioneert op Windows kan compatibiliteitsfouten ontwikkelen wanneer geïnstalleerd op Linux.
Gelukkig komt Docker te hulp. Maar je vraagt je misschien af – wat is Docker en hoe helpt het? Dat en meer leer je in deze tutorial.
Maar voordat we beginnen, zijn hier enkele vereisten:
-
Kennis van Linux-commando’s
-
Kennis van terminalgebruik
-
Kennis van Node.js en Express.js
Inhoudsopgave
Wat is Docker?
Docker is een open-source tool die het eenvoudig maakt om software op een consistente manier uit te voeren, ongeacht waar je bent. Dit doet het door jouw toepassing en alles wat het nodig heeft (zoals bibliotheken en instellingen) in een container te plaatsen (waar ik zo meteen meer over zal bespreken).
Zie een container als een doos: het bevat jouw app en alle onderdelen ervan, zodat het precies hetzelfde werkt op jouw laptop, een server of in de cloud. Docker helpt ontwikkelaars het probleem van “het werkt op mijn machine” te vermijden door ervoor te zorgen dat alles samen wordt verpakt op een betrouwbare en draagbare manier.
Docker is gemaakt door Solomon Hykes in 2013. In de loop der jaren heeft het zich ontwikkeld om een breed scala aan tools te bestrijken. Het is een onmisbaar instrument geworden voor het verbeteren van de toepassingsimplementatie- en netwerkprocessen.
Voordat we verder gaan, zijn hier enkele belangrijke termen die je zult tegenkomen terwijl we deze tutorial doornemen:
Docker Engine
De Docker-engine, zoals de naam al aangeeft, is de krachtbron voor Docker-toepassingen. Het heeft een client- en een servercomponent. De Docker-client is in ons geval de opdrachtregelinterface-tool of Docker-terminal die we zullen gebruiken om relevante opdrachten voor projectuitvoering te verzenden. De Docker-server, algemeen bekend als de daemon, is de server die het uitvoeren van de verschillende Docker-images en containers afhandelt.
Docker Image
Docker-images zijn vooraf gemaakte sjablonen van uitvoerbare software en systemen. Docker biedt een breed scala aan images, variërend van besturingssysteemsjablonen tot serversjablonen, softwaresjablonen, enzovoort. Je kunt al deze vinden op het Docker-hub-register waar deze images zijn opgeslagen.
Je kunt ook een specifieke image bouwen en deze openbaar hosten op de Docker-hub of in een privéregister.
Docker Containers
Docker-containers zijn uitvoerbare compacte instanties gebouwd op het gegenereerde sjabloon dat de Docker-image is. Ze zijn lichtgewicht, draagbare pakketten die alles bevatten wat nodig is om een softwarestuk uit te voeren – code, runtime, bibliotheken en systeemtools. Een container zorgt ervoor dat de applicatie consistent draait ongeacht de omgeving.
Voordelen van het gebruik van Docker
Hier zijn enkele voordelen van het gebruik van Docker als backend-ontwikkelaar:
-
Docker is een geweldig hulpmiddel voor het creëren van een solide DevOps-cultuur voor applicatieontwikkeling, omdat het de functies van de ontwikkelings- en operationele teams verduidelijkt.
-
Het is ook behoorlijk flexibel, waardoor eenvoudige implementatie van microservices en gedistribueerde monolithische backend-applicaties mogelijk is.
-
Het minimaliseert ook fouten door afhankelijkheidsmisconfiguraties tijdens installaties, aangezien het de app met al zijn benodigde afhankelijkheden in één keer overbrengt.
We gaan verder met hoe je een Node.JS Express-applicatie kunt Dockerizen. Maar daarvoor moet je eerst Docker op je computer installeren. Je kunt dit overslaan als je het al hebt geïnstalleerd.
Hoe Docker te installeren
Docker is een cross-platform tool die op alle populaire besturingssystemen kan worden geïnstalleerd (Windows, Mac OS en Linux-distributies). Voor deze zelfstudie zal ik alleen laten zien hoe je Docker op Windows kunt instellen.
Als je momenteel een ander besturingssysteem dan Windows gebruikt, kun je Docker eenvoudig instellen door de stappen in de Docker-documentatie hier te volgen.
Voor Windows-gebruikers is het essentieel dat je pc voldoet aan de minimale specificaties – anders zal de installatie niet succesvol zijn. De minimale vereisten zijn als volgt:
-
Een Windows OS-versie niet lager dan Windows 10 home
-
Een pc met WSL-2 geïnstalleerd of Hypervisor ingeschakeld.
Latem we doorgaan met het downloaden van het Docker-installatieprogramma. U kunt het nieuwste Docker-installatieprogramma downloaden van hier. Voer na het downloaden de software uit en accepteer de voorwaarden. Na succesvolle voltooiing, start de toepassing. Dit is wat je zou moeten zien:
Om te bevestigen dat je de toepassing succesvol hebt geïnstalleerd, navigeer je naar de opdrachtprompt en voer je Docker --version
uit. Je zou de exacte versie van de Docker-engine tool die je hebt geïnstalleerd moeten zien als het succesvol was.
We zullen nu doorgaan naar het eigenlijke project.
Demo Project: Hoe een Node.js-toepassing te containeriseren
In dit gedeelte zullen we een eenvoudige op Node.js gebaseerde back-endservice containeriseren met minimale afhankelijkheden. Dit zal je laten zien hoe je een toepassing containeriseert en migreert met behulp van een Docker-toepassingscontainerisatietechniek die bekend staat als het Dockerfile. Houd er rekening mee dat als je een complexere toepassing hebt, het wellicht beter is om de Docker compose YAML-tool te gebruiken.
Om te beginnen zullen we de voorbeeld Node.js-toepassing opzetten. Ik zal de volledige codeopstelling in dit artikel hieronder verstrekken. Maar laten we eerst begrijpen wat een dockerfile is.
Wat is een Dockerfile?
Een Dockerfile is in feite een templatesysteem waarmee de gebruiker opdrachten kan invoeren die, wanneer uitgevoerd, een functionele afbeelding van de toepassing kunnen produceren. Deze afbeelding kan vervolgens worden omgezet in een container.
Hier zijn enkele opdrachten die zijn opgenomen in de basisstructuur van een Dockerfile:
-
CMD
: stelt de standaardopdracht in om uit te voeren als er geen opdracht is gespecificeerd wanneer de container wordt gestart. Het kan worden overschreven door een opdracht op te geven bij het uitvoeren van de container (docker run ...
). -
ENTRYPOINT
: Specificeert de hoofdopdracht die altijd wordt uitgevoerd wanneer de container wordt gestart. Het kan niet eenvoudig worden overschreven, maar argumenten kunnen worden toegevoegd.
Merk op datCMD
enENTRYPOINT
beide specificeren welke opdracht of proces de container moet uitvoeren bij het opstarten. Maar ze worden op verschillende manieren gebruikt en hebben verschillende doeleinden. GebruikCMD
voor standaardgedrag dat kan worden overschreven. GebruikENTRYPOINT
voor een vaste opdracht die het primaire doel van de container definieert. -
FROM
: Dit is meestal de openingsverklaring in een Dockerfile. Dit commando haalt een basisimage op dat de fundering vormt voor het bouwen van het image van de betreffende applicatie. Bijvoorbeeld, in onze applicatie is het basisimage voor een Node.js-applicatie om de basis Node.js-engine geïnstalleerd te hebben. -
WORKDIR
: Deze syntaxis definieert de actieve werkmap waar de applicatiebestanden zullen worden geplaatst binnen de gedefinieerde container. Er wordt automatisch een map aangemaakt als deze nog niet beschikbaar is. -
KOPIËREN
: Deze syntaxis wordt gebruikt om ervoor te zorgen dat de bestanden die nodig zijn om de Docker-image van het projectbestand van de codebasis te maken, worden gekopieerd naar de nieuw gecreëerde Docker-container. De mappen van deze bestanden worden zorgvuldig gemarkeerd. -
RUN
: Deze syntaxis specificeert het script dat moet worden uitgevoerd voordat de containerisatie van de applicatie is voltooid. -
ENV
: Deze syntaxis wordt gebruikt om omgevingsvariabelen en geheimen te markeren die zullen worden aangeroepen tijdens het proces van het uitvoeren van de applicatie. -
EXPOSE
: Deze syntaxis koppelt de browsepoort waar de applicatie wordt gebruikt om te communiceren met het externe internet. BijvoorbeeldEXPOSE: 3000
koppelt de webinterface van de applicatie aanlocalhost:3000
.
Als we dieper ingaan op Docker, laten we snel enkele belangrijke Docker-opdrachten doornemen die we gedurende deze tutorial zullen gebruiken:
-
Docker ps
: Deze opdracht toont alle actieve containers in uw Docker-terminal. -
Docker run
: Deze opdracht voert een Docker-image uit om een instantie van een container te starten. -
Docker build
: Deze opdracht werkt op basis van het Docker-bestand om een image van een service of applicatie te genereren. -
Docker rm
: Deze opdracht kan worden gebruikt om een image te verwijderen met behulp van de image-identificatiedetails.
Hoe de app containeriseren
Nu kunnen we onze eenvoudige Node/Express-toepassing containeriseren. Om de tutorial te volgen, kun je de basiscode hier krijgen.
Bij lokaal testen geeft het een CRUD API terug waar je producten kunt maken, ophalen, bijwerken en verwijderen wanneer het wordt uitgevoerd. We zullen de toepassing verpakken voor eenvoudige implementatie in de cloud met behulp van onze Docker-engine. We zullen dit kunnen doen met behulp van de Dockerfile-tool die we hierboven hebben besproken.
Stap 1: Maak de dockerfile
In je projectmap, maak een bestand met de naam Dockerfile
. Zorg ervoor dat de naam exact “Dockerfile” is (zonder extensie, en hoofdlettergevoelig in sommige systemen – dus zorg ervoor dat het met een hoofdletter is).
Als je een code-editor gebruikt, maak dan eenvoudig een nieuw bestand met de naam Dockerfile
. Als je een basis tekstverwerker gebruikt, sla het bestand dan op met de naam Dockerfile
en zorg ervoor dat het niet per ongeluk wordt opgeslagen met een extensie zoals .txt
.
Voer vervolgens de eerste regel in:
FROM Node:18-alpine
Dit commando haalt het basisimage op dat we zullen gebruiken om onze Express-toepassing van stroom te voorzien, wat de Node-engine zelf is.
Je vraagt je misschien af waarvoor de alpine
is. Alpine is een lichtgewicht, veel meer gecomprimeerde versie van een Docker-image. Het sluit het opnemen van extra pakketten uit die niet direct essentieel zijn voor het basissysteem. Het wordt aangeraden als een standaard goede codepraktijk om lichtgewicht distributies te gebruiken voor snellere uitvoering en gemakkelijk gebruik.
Stap 2: Stel de werkmap in
WORKDIR /app
Dit stelt de werkmap van de afbeelding in op de /app
map van de container. Het zorgt ervoor dat alle bestandsacties hier plaatsvinden en dat alle bestanden in deze map worden gekopieerd.
Stap 3: Kopieer de benodigde bestanden
COPY package.json
Deze opdracht kopieert de package.json
bestanden die een lijst van afhankelijkheden en pakketten bevatten die moeten worden geïnstalleerd om onze toepassing te ondersteunen.
Stap 4: Voer een installatiescript uit
RUN npm install
Deze opdracht zorgt ervoor dat alle nodige afhankelijkheden om onze Node.js-toepassingen te ondersteunen, worden geïnstalleerd op de container.
Stap 5: Kopieer de codebestanden
COPY . .
Deze opdracht zorgt ervoor dat alle bestanden binnen de lokale map worden gekopieerd naar het bestandssysteem van de container binnen de vastgestelde werkmap.
Stap 6: Maak de serverpoort openbaar
EXPOSE 3000
Deze opdracht maakt de serverpoort openbaar die we van plan zijn te gebruiken om toegang te krijgen tot de container. In dit geval is het poort 3000.
Stap 7: Voeg het commando toe om de container tot leven te brengen
CMD ["npm", "run", "dev"]4
Deze opdracht wordt aan het einde uitgevoerd om de Node.js-toepassing in te schakelen. Het voert eenvoudigweg het npm run dev
commando uit, wat je zou gebruiken voor een ontwikkelomgeving. Om het in een productieomgeving uit te voeren, zou je in plaats daarvan het npm start
commando gebruiken.
Nadat dit proces is voltooid, zo zou de uiteindelijke structuur van het Docker-bestand eruit moeten zien:
FROM Node:18-alpine
WORKDIR /app
COPY package.json
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
Het testen van de Docker-container
Om het af te ronden, zullen we een Docker-image maken van onze Node.js-toepassing. Voer hiervoor het commando docker build -t nodeapp .
uit. Het docker build
-commando bouwt het image, terwijl de -t
dient om de details van de image-tag te specificeren.
In ons geval wijzen we de naam nodeapp
toe aan het image dat we gaan maken en het image zal worden gemaakt binnen de werkdirectory.
Gefeliciteerd! Je hebt succesvol je eerste Docker-image gebouwd. Om alle images in je lokale repository te bekijken, voer het commando docker images
uit.
Om een werkende instantie van je image voor testdoeleinden te maken, voer het commando docker run nodeapp
uit.
We gebruiken Mongo DB als onze database voor deze tutorial, dus we moeten de MongoDB-URL doorgeven als een omgevingsvariabele aan de Docker-container. Omgevingsvariabelen helpen bij het beschermen van bepaalde belangrijke variabelen die niet aan het publiek blootgesteld mogen worden. Andere variabelen die als omgevingsvariabelen kunnen worden doorgegeven zijn onder andere API-sleutels en versleutelingscodes.
Om de MongoDB-URL door te geven aan de Docker-container, gebruiken we de -e
-tag om ervoor te zorgen dat Docker de overeenkomstige ingevoerde waarde herkent als een omgevingsvariabele.
docker run -e JWT_SECRETS={voer de waarde van jouw keuze in} -e MONGO_URL={De mongo-url van jouw keuze} nodeapp
.
Om de container ook in de achtergrond te gebruiken, voeg gewoon de -d
-tag toe die de detach-optie vertegenwoordigt. Deze optie zorgt ervoor dat de container in de achtergrond blijft draaien ondanks het afsluiten van de opdrachtregelterminal.
In het geval van geen fouten, zou het navigeren naar localhost:5000
ook iets soortgelijks als de onderstaande afbeelding moeten produceren.
Samenvatting
In dit artikel heb je geleerd wat Docker is en hoe het werkt, samen met de gebruikelijke commando’s en hoe je het kunt gebruiken om een backend-applicatie te containeriseren. Als je verder gaat dan de basis, kun je ook andere toepassingen van Docker verkennen in continue integratie en ontwikkeling. Om meer te leren over Docker, kun je de documentatie hier bekijken.
Ik zou ook aanbevelen om je nieuwe kennis te gebruiken om projecten met praktijktoepassingen te implementeren, en het verkennen van netwerken in Docker-applicaties. Om je app live te maken, kun je gemakkelijk het Docker-image implementeren dat je hebt gemaakt bij een van de populaire cloudserviceproviders zoals AWS, GCP, Azure, enzovoort.
Voel je vrij om me vragen te stellen! Je kunt ook mijn andere artikelen hier bekijken. Tot de volgende keer, blijf coderen!
Source:
https://www.freecodecamp.org/news/containerize-a-nodejs-application-using-docker/