Docker til begyndere: Hvad er Docker og hvordan man opretter Docker-containere

Hvis du har været i kontakt med den seneste udvikling i programmeringsverdenen de sidste par år, ville du have lagt mærke til den kraftige brummer omkring Docker- og Docker-containere. Denne popularitet af docker er ikke uden grund. Introduktionen af ​​Docker har ændret meget, hvordan udviklere nærmer sig applikationsudvikling.

Hvem vil være efterladt, når en sådan revolutionerende teknologi rammer programmeringsverdenen? Så i dag starter vi en ny tutorial-serie, så du kan lære at bruge Docker til applikationsudvikling. Hvis du er en absolut nybegynder for Docker, er denne tutorial-serie det rette sted for dig at starte.

I den første artikel i vores tutorial-serie søger vi at forstå, hvad Docker er, og hvorfor udviklere elsker Docker så meget. Vi vil også dockerisere et simpelt Node.js-program for at gøre dig bekendt med de grundlæggende begreber i Docker.


Hvorfor vente længere? Lad os begynde!



Hvad er Docker

Docker er et værktøj, der bruges til at opbygge applikationer; det vil sige at oprette, implementere og køre applikationer gennem containere.


Med en container pakkes alle biblioteker og andre afhængigheder, der kræves for at køre en applikation, som en enkelt pakke til implementering.

Hovedmålet med containerisering af en applikation er at isolere dem fra andre applikationer, der kører i det samme system. Denne fremgangsmåde sikrer, at applikationer ikke forstyrrer driften af ​​hinanden og gør applikationsvedligeholdelse meget lettere.

Selvom containere, der kører i det samme system, er isoleret fra hinanden under udførelse, deler de den samme OS-kerne. Derfor er containere mere lette sammenlignet med det alternative valg til isolering af applikationsudførelse, virtuelle maskiner.

En containeriseret applikation, der kører på dit Windows OS, kører garanteret uden problemer i en anden brugers Windows-maskine på trods af miljøændring.


Selvom containere har været længe i brug før Docker, blev introduktionen af ​​Docker populær ved hjælp af containere i udviklerfællesskabet. Der er to komponenter, der bruges ved docking af et program: Dockerfil og Docker-billede . Lad os finde ud af, hvad de er.

Dockerfil

Dockerfile er en tekstfil, der indeholder et sæt kommandoer, der kræves for at opbygge et dockerbillede. Dockerfile indeholder blandt andet oplysninger om det underliggende operativsystem, sprog, filplacering og netværksporte.

Docker-billede

Når du kører Docker's build-kommando med en dockerfil på plads, oprettes et dockerbillede baseret på dockerfilen. De fungerer som skabeloner til at oprette den endelige docker-container. Når de er oprettet, er dockerbillederne statiske. Du kan påberåbe Docker's kørekommando for at oprette dockerbeholderen ved hjælp af et dockerbillede.



Dockerisering af et Node.js-program

I denne vejledning skal vi dockerize en Node.js-applikation. Vi følger en trinvis tilgang for at få Docker-containeren i gang.


1 - Opret Node.js-applikationen 2 - Opret dockerfilen 3 - Byg dockerbilledet 4 - Opret applikationsbeholderen

Før du dykker ned i docking af vores app, skal du sørge for, at Docker og Node.js er installeret i dit system

  • Installer Docker på dit system — Jeg vil ikke dække, hvordan du installerer Docker i denne vejledning, men du kan følge Docker-dokumentation og installere Docker på dit Windows- eller Ubuntu-skrivebord.
  • Download og installer Node.js fra det officielle websted

Opret Node.js-applikationen

Naviger til det nye projektmappe fra kommandolinjen, og kør følgende kommando for at oprette package.json-filen, der indeholder information om applikationens afhængigheder og start-script.

npm init -y


Installer og tilføj derefter Express som en afhængighed af din applikation ved at køre denne kommando på kommandolinjen. Vi bruger Express til at oprette appen.

npm install express --save

Dette tilføjer udtrykket som en afhængighed af vores package.json fil.

Nu kan vi oprette en Node-applikation ved hjælp af Express.


Opret en fil med navnet app.js i projektmappen, og tilføj følgende kode til filen.

const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(3000, () => {
console.log('Node server has started running') })

Ovenstående kode opretter en Node-server, der lytter til indgående anmodninger på port 3000. Du kan køre denne kommando på kommandolinjen for at starte Node-serveren.

node app.js

Gå nu til din browser og følg webadressen http://localhost:3000 og du vil se teksten Hello World! på siden.

Vi har bygget en simpel Node-applikation til vores projekt. Lad os nu gå videre til oprettelse af dockerfilen.

Opret Dockerfile

I dockerfilen leverer vi oplysninger, der er nødvendige for at opbygge og køre vores Node-app inden for Docker-miljøet.

Dette inkluderer at specificere sproget og dets version, der bruges i applikationen, indstille vores projektmappe som arbejdsmappe, kopiere alle filerne i arbejdsmappen, indstille netværksporten og specificere, hvilken fil der er indgang til applikationen. I mere komplekse applikationer skal du også indstille miljøvariabler og database-URL'en i dockerfilen.

FROM node:latest WORKDIR /dockerTutorial COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ['node', 'app.js']
  • FRA kommando henter et OS-billede til at køre vores applikation på et specifikt operativsystem fra Docker Hub. Docker Hub er et lager af dockerbilleder, som vi kan trække til det lokale miljø. Vi henter et Ubuntu-baseret billede, der har installeret Node.js. Brug af 'nyeste' som Node-version trækker et billede, hvor den nyeste Node-version er installeret.
  • WORKDIR kommando indstiller programmets arbejdskatalog.
  • KOPI kommandoen kopierer filer fra det aktuelle bibliotek (på kommandolinjen) til det arbejdsmappe, der blev indstillet i det foregående trin. Du kan enten angive et filnavn, der skal kopieres, eller bruge dobbelt punktum til at kopiere alle filerne i det aktuelle bibliotek til det arbejdsmappe.
  • LØB kommando installerer alle de afhængigheder, der kræves for at opbygge applikationen. Dette inkluderer alle afhængigheder, der er specificeret i package.json fil.
  • UDSÆTTE kommando åbner en port fra Docker-containeren til omverdenen. Denne port modtager alle de anmodninger, vi sender til Docker-containeren. Port er specifikt indstillet til 3000, fordi det er den port, vores Node-applikation inde i Docker-containeren bruger til at lytte til anmodninger.
  • INDGANG angiver, hvordan applikationen skal startes. Docker slutter sig til det array, vi leverer, til en enkelt kommando for at starte applikationen. I dette tilfælde node app.js.

Opbygning af Docker-billedet

Brug følgende kommando til at oprette Docker-billedet fra dockerfilen.

docker build -t docker-tutorial .

Docker-tutorial er navnet på Docker-billedet. Prikken angiver filstien til projektmappen, hvor vi i øjeblikket befinder os i kommandolinjen.

Hvis OS-billedet er specificeret med FRA kommando, node: seneste , ikke er i din enhed i øjeblikket, trækkes den fra Docker Hub, når du kører ovenstående kommando.

Efter at have trukket billedet, udføres hver kommando i dockerfilen en efter en.

Ved afslutningen af ​​udførelsen, hvis du ser meddelelsen vellykket bygget , dockerbilledet af applikationen er bygget med succes. Kør denne kommando for at se det indbyggede dockerbillede i det lokale billedlager.

docker images

Outputtet ser sådan ud

Oprettelse af containeren

Nu kan vi bruge det indbyggede billede til at oprette vores Docker-container. Brug kommandoen docker run til at oprette containeren.

docker run -p 8080:3000 docker-tutorial

Her angiver tallene 8080 og 3000 det ydre og indre af containeren. Ekstern port, 8080, er den port, vi bruger til at oprette forbindelse til applikationen via vores browser. Intern port, 3000, er den port, vores applikation lytter til indgående anmodninger. Docker-container kortlægger den givne eksterne port til den interne port.

Besøg webadressen http://localhost:8080 i browseren og se om du får siden med Hello World! besked, som du fik, da du besøgte http://localhost:3000 Før. Hvis ja, så er din Docker-container i gang.

Du kan bruge denne kommando til at se alle kørende Docker-containere på din enhed.

docker ps

Kommandoen giver dig en output som denne. Vi kan finde CONTAINER_ID og NAME for den kørende container her.

Tilføjelse af miljøvariabler til din applikation

Husk, hvordan jeg nævnte, at et program med miljøvariabler kræver flere instruktioner i dockerfilen? Værdien af ​​miljøvariabler ændres med det miljø, de kører i.

Bemærk, hvordan vi eksplicit nævnte porten, som vores Node-app lytter til, når serveren kører. Denne tilgang er ufleksibel og fejlbehæftet. Hvis vi kører vores applikation i et miljø, der ikke åbner port 3000 for Node-serveren, stopper vores applikation med at fungere.

Den mest hensigtsmæssige implementering er at tage portnummeret ud af applikationen. I stedet bruger vi et variabelnavn i stedet for portnummer og indstiller en værdi for den variabel i det kørende miljø. I vores tilfælde er det kørende miljø Docker-containeren. Så vi er nødt til at tilføje portnummeret til dockerfilen som en miljøvariabel.

Lad os se, hvordan vi kan gøre det.

Først skal du tilføje miljøvariablen til vores dockerfil med dens værdi. Vi er nødt til at tilføje en ny kommando til dockerfilen for at opnå dette.

FROM node:latest WORKDIR /dockerTutorial COPY . . ENV PORT=3000 RUN npm install EXPOSE $PORT ENTRYPOINT ['node', 'app.js']

Ved hjælp af ENV-kommandoen efterfulgt af variabelnavnet og værditildelingen kan vi tilføje en ny miljøvariabel til vores dockerfil. Har du bemærket, hvordan EXPOSE 3000-kommandoen er blevet ændret for ikke eksplicit at nævne portnummeret? I stedet henviser det til den oprettede PORT-variabel for at få det nøjagtige portnummer. Med denne tilgang skal vi kun ændre et sted i vores kode, hvis vi skal ændre portnummeret, hvilket gør vores applikation let at vedligeholde.

Nu har vi ændret dockerfilen, næste trin er at ændre app.js for at henvise til den oprettede miljøvariabel. Til dette erstatter vi portnummeret 3000, der bruges i lyttemetoden, med process.env.PORT.

const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(process.env.PORT, () => {
console.log('Node server has started running') })

Da vi har foretaget ændringer i vores applikationsfiler og dockerfile, er vi nødt til at oprette et nyt billede til en ny container. Men først skal vi stoppe den aktuelt kørende Docker-container for at opnå dette.

Vi kan bruge kommandoen docker stop til at stoppe containeren.

docker stop f10

Værdien, f10, der bruges i denne kommando er de første tre cifre i containerens ID.

Vi kan bruge kommandoen, docker kill, til at stoppe den kørende container.

docker kill f10

Forskellen mellem docker kill og docker stop er, at docker stop stopper containeren mere yndefuldt ved at frigive ved hjælp af ressourcer og gemme staten. docker kill stopper dog containeren mere brat uden at frigøre ressourcer korrekt eller gemme staten. For en container, der kører i et produktionsmiljø, er det bedre valg at bruge docker stop for at stoppe containeren.

Når du har stoppet en kørende container, skal du sørge for at rense den resterende rest af containeren fra værtsmiljøet ved hjælp af følgende kommando.

Kørsel af containeren i Daemon-tilstand

Når du prøver at køre ovenstående kommandoer for at stoppe containeren, vil du bemærke, at terminalfanen, vi brugte til at oprette containeren, ikke kan bruges til at køre flere kommandoer, medmindre vi dræber containeren. Vi kan finde en løsning på dette ved at bruge en separat fane til at køre nye kommandoer.

Men der er en bedre tilgang. Vi kan køre containeren i dæmontilstand. Med dæmontilstand kører containeren i baggrunden uden at bruge den aktuelle fane til at vise output.

For at starte en container i daemon-tilstand skal du blot tilføje et ekstra -d-flag til docker run-kommandoen.

docker run -d -p 8080:3000 docker-tutorial

Kørsel af containeren i interaktiv tilstand

For at køre en container i den interaktive tilstand skal containeren allerede køre. Når du er i den interaktive tilstand, kan du køre kommandoer for at tilføje eller fjerne filer til containeren, liste filer eller køre andre bash-kommandoer, som vi normalt bruger.

Brug følgende kommando til at køre containeren i den interaktive tilstand.

docker exec -it e37 bash

Her er e37 container-id'et. Spil med den interaktive tilstand ved hjælp af bash-kommandoer.



Konklusion

I den første tutorial i vores Docker-tutorial-serie lærte du, hvordan du opretter en Docker-container til en simpel Node.js-applikation. Men der er mere, du kan gøre med Docker og containere. I vores kommende tutorials vil vi se, hvordan man arbejder med databaser, volumener og arbejder med flere containere, der bruges af et program bygget med mikrotjenester.