Linux containerguide: En introduktion til containere

Containere har været et buzzword i årevis... men hvad er de helt præcist?

Containere er en metode til at køre virtualiserede applikationer på din computer, svarende til virtuelle maskiner, men ved hjælp af et andet sæt underliggende teknologier. De kan være komplekse at forstå, men de er essentielle for at køre alt fra Minecraft servere til Google. Og vi vil vise dig, hvordan du sætter dem op.

Vi vil bruge Linux, et operativsystem bygget med fokus på portabilitet, modularitet og stabilitet. Linux er i alt fra servere til mikrobølger til videospilkonsoller. Containere er ikke begrænset til at køre på Linux, men teknologierne bag dem er bedst egnede til og kører bedst på Linux. Hvis du er ny til Linux, vil vi anbefale, at du tjekker vores begynderguide inden du dykker ind.

Er containere virtuelle maskiner?

Containere kan være et komplekst emne, men det er bedst at starte med ét nøglepunkt: En container er ikke en virtuel maskine. En virtuel maskine er en simuleret version af specifik hardware og dens software, der kører i det, der er kendt som en hypervisor. Hvis du nogensinde har brugt software som VirtualBox eller

multipass, så har du brugt en hypervisor.

Hypervisoren kører normalt enten som sit eget operativsystem (kendt som en type 1 hypervisor) eller inden for rammerne af et andet operativsystem som Windows eller Ubuntu (en type 2 hypervisor). Hypervisorens ansvar er at præsentere gæsteoperativsystemet med den simulerede hardware, det kræver for at køre. Det fulde operativsystem kan derefter køre ovenpå. Dette inkluderer alt fra en simuleret CPU og RAM til databusser, diskdrev eller netværksadaptere. Denne simulering er beregningsmæssigt dyr, så virtuelle maskiner har typisk betydelige omkostninger.

Så hvad er en container?

En container ligner en virtuel maskine, idet den indeholder og kører software i et isoleret miljø på et værtssystem. Containere erstatter dog traditionel hardwarevirtualisering ved at stole direkte på værtsoperativsystemet. Containere deler værtsoperativsystemets biblioteker og binære filer og har kun de ressourcer og afhængigheder, der er nødvendige for at køre den specifikke applikation, de indeholder. Dette betyder, at der ikke er behov for et fuldt operativsystem pr. container, da alle containere kører på en systemet kan dele det enkelte værtsoperativsystem, mens du bevarer den adskillelse, du får med virtuel maskiner.

Containere får adgang til værtsoperativsystemet gennem en containermotor, som styrer kørende containere og kontrollerer deres adgang til det underliggende operativsystem. Dette kan omfatte håndhævelse af sikkerhed mellem containere og tildeling eller nægtelse af adgang til operativsystemfiler eller netværksforbindelser.

Hvad er nogle afvejninger for at bruge containere?

Mens virtuelle maskiner og containere ligner hinanden, har brug af containere sine ulemper. For det første anses virtuelle maskiner for at være mere sikre, da angrebsfladen for at "undslippe" den virtuelle maskine er betydeligt mindre og sværere at trænge igennem. En container er muligvis ikke egnet til at teste malware, for eksempel.

Den største fordel ved at bruge containere er, at de er lette, og undgår behovet for at virtualisere et helt operativsystem, hvilket betyder minimale opstartstider og reducerede systemomkostninger. Det betyder, at mange flere containere kan køre på én vært, hvilket ikke ville være muligt med virtuelle maskiner.

Fordi containere ikke kræver et komplet operativsystem, kan de nemt pakkes ind i mindre billeder og distribueres. Mens et komplet virtuel maskine-billede nemt kan være på snesevis af gigabyte, kan containere komme i billeder så små som 15Kb. Dette gør det ekstremt nemt at distribuere og bruge beholdere. Vi vil demonstrere dette ved at køre nogle simple eksempelcontainere i Docker.

Installation af Docker

Det er meget teori, så lad os blive praktiske. For at vise dig, hvordan du opsætter en container, installerer vi Docker i Ubuntu 23.10 og bruger den til at køre en simpel Hello World-container. Vores trin er testet på en virtuel maskine, men du kan også dual-boote fra din Windows-pc eller bruge en fantastisk bærbar til Linux.

Docker er hurtigt blevet det de-facto containeriseringsværktøj. Mens der findes andre værktøjer, er Docker bredt udbredt og er perfekt til alle undtagen de mest krævende applikationer. Der er dokumentation om de forskellige måder at installere Docker på, men vi bruger bekvemmelighedsinstallationsscriptet. Denne kommando vil downloade et script fra get.docker.com til din lokale maskine:

$ curl -fsSL https://get.docker.com -o get-docker.sh

Du kan derefter køre dette script for at installere Docker. Du kan kontrollere, at Docker er installeret korrekt ved at tjekke versionen med:

$ sudo sh ./get-docker.sh

Efterfulgt af et versionstjek med:

$ sudo docker version

Du kan også kontrollere, at docker-tjenesten kører i baggrunden med:

$ sudo systemctl status docker

Det skal angive 'aktiv (kører)' i grøn tekst, som fremhævet på skærmbilledet nedenfor. Versionen af ​​Docker-motoren bør også udskrives uden fejl.

Kører et simpelt eksempel

Nu hvor Docker er installeret, kan du bruge det til at downloade et containerbillede. Containerbilleder minder meget om ISO'er for virtuelle maskiner, bortset fra at de normalt er mindre og nemmere at bygge. Download et simpelt hello-world containerbillede med følgende kommando:

$ sudo docker pull hello-world

Når billedet er downloadet, kan du bekræfte det ved at angive de billeder, der er downloadet på dit system, ved at bruge følgende:

$ sudo docker images

Du skulle nu se hello-world downloadet. Bemærk den meget lille størrelse (13Kb på vores testmaskine), samt dens tag. Et billedes tag er faktisk dets version. Som standard vil Docker downloade den seneste version af et billede. Kør en container baseret på dette billede ved hjælp af:

$ sudo docker run hello-world: latest

Dette vil udsende Dockers' hello-world spiel, som kører fra et meget lille C-program (som du kan tjekke ud på GitHub).

Tillykke; du har kørt din første container! I dette tilfælde har programmet udsendt sit resultat og afsluttet dets udførelse. Containeren er nu død og kører ikke længere.

Sådan holder du beholdere i live

Efter at have kørt en grundlæggende container, kan vi nu bygge et mere komplekst eksempel, der ikke afsluttes med det samme, når det har fuldført en opgave. Containere er ofte bygget op omkring en enkelt proces, som kan afføde flere processer. Når denne basisproces afsluttes, afsluttes hele beholderen med den. Dette lyder måske som en begrænsning, men det minder faktisk meget om, hvordan init-systemer i den fulde Linux-kerne fungerer.

For at køre et vedvarende eksempel kan vi trække et billede til Nginx, som er en webserver, der bruges til at hoste en betydelig procentdel af verdens websteder. Vi har valgt Nginx til dette eksempel, fordi det er enkelt, kræver ingen avanceret konfiguration og er let. Download det seneste Nginx-billede med følgende kommando:

$ sudo docker pull nginx

Vi har tilføjet -s flag her for at konfigurere portvideresendelse fra containeren til værtsoperativsystemet. Port 80 bruges til ukrypteret HTTP-trafik (dvs. web). Dette giver dig adgang til containeren fra din værtsmaskine:

$ sudo docker run -p 80:80 nginx

Denne kommando vil køre i din terminal i tilknyttet tilstand, hvilket betyder, at containeren bogstaveligt talt er knyttet til din terminal, så alle logfiler fra containeren vil blive udskrevet der. Når beholderen er startet op, åbnes den http://localhost i din webbrowser. Du vil se en Nginx-velkomstskærm, der ligner nedenfor:

Nginx-containeren kører nu inde i din containermotor. Mens Nginx kører i tilknyttet tilstand, fortsætter den kun med at køre, så længe den er åben. Du kan afslutte Nginx-beholderen ved at trykke på Ctrl + C i din terminal.

Sådan kører du containere i baggrunden

For at køre Nginx i baggrunden tilføjer vi endnu et flag, -d, til frakoblet tilstand. Dette vil starte containeren løsrevet fra din terminal, hvilket betyder, at den er i baggrunden. For eksempel:

$ sudo docker run -d -p 80:80 nginx

Du kan angive kørende containere på et system. Bemærk, hvordan din Nginx-beholder nu kører i baggrunden og er blevet tildelt et ID.

$ sudo docker ps

En kørende baggrundsbeholder kan dræbes ved hjælp af dens ID. Du bemærker måske også, at beholderen har fået et navn. Når en ikke er specificeret, vil Docker give hver container et tilfældigt, unikt navn.

$ sudo docker kill 

Du kan dog teste dette med nogle mere interessante billeder. Der er masser ledige på Docker hub, der fungerer som et centralt lager for offentlige containerbilleder.

Dykning dybere med containere

Dette har været en kort introduktion til containere. Containere kan være ubegrænset komplekse, men de er en grundlæggende byggesten i de højt distribuerede systemer, der kører meget af vores moderne internet. Den kraft tager dog ikke væk fra deres brug i mindre skala. Kendskab til det grundlæggende i containere og Docker kan være indgangen til at køre nyttige lokale tjenester som en Minecraft server eller Plex på en gammel pc.