Linux containere guide: En introduksjon til containere

Containere har vært et buzzword i årevis... men hva er de egentlig?

Beholdere er en metode for å kjøre virtualiserte applikasjoner på datamaskinen din, som ligner på virtuelle maskiner, men som bruker et annet sett med underliggende teknologier. De kan være komplekse å forstå, men de er avgjørende for å kunne kjøre alt fra Minecraft servere til Google. Og vi skal vise deg hvordan du setter dem opp.

Vi skal bruke Linux, et operativsystem bygget med fokus på portabilitet, modularitet og stabilitet. Linux er i alt fra servere til mikrobølger til videospillkonsoller. Beholdere er ikke begrenset til å kjøre på Linux, men teknologiene bak dem er best egnet og kjører best på Linux. Hvis du er ny på Linux, anbefaler vi at du sjekker ut vår nybegynnerguide før du dykker inn.

Er containere virtuelle maskiner?

Beholdere kan være et komplekst emne, men det er best å starte med ett nøkkelpunkt: En beholder er ikke en virtuell maskin. En virtuell maskin er en simulert versjon av spesifikk maskinvare og dens programvare som kjører i det som er kjent som en hypervisor. Hvis du noen gang har brukt programvare som VirtualBox eller

multipass, så har du brukt en hypervisor.

Hypervisoren kjører vanligvis enten som sitt eget operativsystem (kjent som en type 1 hypervisor) eller innenfor rammen av et annet operativsystem som Windows eller Ubuntu (en type 2 hypervisor). Hypervisors ansvar er å presentere gjesteoperativsystemet med den simulerte maskinvaren det krever for å kjøre. Hele operativsystemet kan da kjøres på toppen. Dette inkluderer alt fra en simulert CPU og RAM til databusser, diskstasjoner eller nettverkskort. Denne simuleringen er beregningsmessig dyr, så virtuelle maskiner har vanligvis betydelige kostnader.

Så, hva er en beholder?

En beholder ligner på en virtuell maskin ved at den inneholder og kjører programvare i et isolert miljø på et vertssystem. Imidlertid erstatter beholdere tradisjonell maskinvarevirtualisering ved å stole på vertsoperativsystemet direkte. Beholdere deler bibliotekene og binærfilene til vertsoperativsystemet og har bare ressursene og avhengighetene som trengs for å kjøre den spesifikke applikasjonen de inneholder. Dette betyr at det ikke er behov for et fullstendig operativsystem per container, siden alle containere kjører på en systemet kan dele det enkelte vertsoperativsystemet mens du beholder segregeringen du får med virtuelle maskiner.

Containere får tilgang til vertsoperativsystemet gjennom en containermotor, som administrerer kjørende containere og kontrollerer deres tilgang til det underliggende operativsystemet. Dette kan inkludere å håndheve sikkerhet mellom containere og gi eller nekte tilgang til operativsystemfiler eller nettverkstilkoblinger.

Hva er noen avveininger for bruk av containere?

Mens virtuelle maskiner og containere er like, har bruk av containere sine ulemper. For det første anses virtuelle maskiner som sikrere, ettersom angrepsflaten for å "unnslippe" den virtuelle maskinen er betydelig mindre og vanskeligere å trenge gjennom. En beholder er kanskje ikke egnet for å teste ut skadelig programvare, for eksempel.

Den største fordelen med å bruke containere er at de er lette, og unngår behovet for å virtualisere et helt operativsystem betyr minimale oppstartstider og reduserte systemkostnader. Dette betyr at mange flere containere kan kjøres på én vert, noe som ikke ville vært mulig med virtuelle maskiner.

Fordi beholdere ikke krever et fullstendig operativsystem, kan de enkelt pakkes inn i mindre bilder og distribueres. Mens et fullstendig virtuell maskinbilde lett kan være på titalls gigabyte, kan beholdere komme i bilder så små som 15Kb. Dette gjør det ekstremt enkelt å distribuere og bruke beholdere. Vi vil demonstrere dette ved å kjøre noen enkle eksempelbeholdere i Docker.

Installerer Docker

Det er mye teori, så la oss bli praktiske. For å vise deg hvordan du setter opp en beholder, installerer vi Docker i Ubuntu 23.10 og bruker den til å kjøre en enkel Hello World-beholder. Trinnene våre er testet på en virtuell maskin, men du kan også dual-boote fra din Windows-PC eller bruke en flott bærbar PC for Linux.

Docker har raskt blitt det de-facto containeriseringsverktøyet. Mens andre verktøy eksisterer, er Docker mye brukt og er perfekt for alle unntatt de mest krevende applikasjonene. Det er dokumentasjon om de forskjellige måtene å installere Docker på, men vi bruker det enkle installasjonsskriptet. Denne kommandoen vil laste ned et skript fra get.docker.com til din lokale maskin:

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

Du kan deretter kjøre dette skriptet for å installere Docker. Du kan bekrefte at Docker er riktig installert ved å sjekke versjonen med:

$ sudo sh ./get-docker.sh

Etterfulgt av en versjonssjekk med:

$ sudo docker version

Du kan også bekrefte at docker-tjenesten kjører i bakgrunnen med:

$ sudo systemctl status docker

Det skal indikere "aktiv (løper)" i grønn tekst, som uthevet i skjermbildet nedenfor. Versjonen av Docker-motoren bør også skrives ut uten feil.

Kjører et enkelt eksempel

Nå som Docker er installert, kan du bruke den til å laste ned et containerbilde. Containerbilder ligner mye på ISO-er for virtuelle maskiner, bortsett fra at de vanligvis er mindre og enklere å bygge. Last ned et enkelt hello-world-beholderbilde med følgende kommando:

$ sudo docker pull hello-world

Når bildet er lastet ned, kan du bekrefte ved å liste bildene som er lastet ned på systemet ditt ved å bruke følgende:

$ sudo docker images

Du bør nå se hello-world lastet ned. Legg merke til den svært lille størrelsen (13Kb på testmaskinen vår), så vel som taggen. Taggen til et bilde er faktisk versjonen. Som standard vil Docker laste ned den nyeste versjonen av et bilde. Kjør en beholder basert på dette bildet ved å bruke:

$ sudo docker run hello-world: latest

Dette vil sende ut Dockers' hello-world-spill, som kjører fra et veldig lite C-program (som du kan sjekke ut på GitHub).

Gratulerer; du har kjørt din første container! I dette tilfellet har programmet levert resultatet og fullført kjøringen. Containeren er nå død og går ikke lenger.

Hvordan holde beholdere i live

Etter å ha kjørt en grunnleggende beholder, kan vi nå bygge et mer komplekst eksempel som ikke avsluttes umiddelbart når det er fullført en oppgave. Beholdere er ofte bygget rundt en enkelt prosess, som kan skape flere prosesser. Når denne basisprosessen avsluttes, vil hele beholderen avsluttes med den. Dette kan høres ut som en begrensning, men det er faktisk veldig likt hvordan init-systemer i hele Linux-kjernen fungerer.

For å kjøre et vedvarende eksempel, kan vi trekke et bilde for Nginx, som er en webserver som brukes til å være vert for en betydelig prosentandel av verdens nettsteder. Vi har valgt Nginx for dette eksemplet fordi det er enkelt, krever ingen avansert konfigurasjon og er lett. Last ned det siste Nginx-bildet med følgende kommando:

$ sudo docker pull nginx

Vi har lagt til -s flagg her for å konfigurere portvideresending fra containeren til vertsoperativsystemet. Port 80 brukes for ukryptert HTTP-trafikk (dvs. web). Dette vil tillate deg å få tilgang til beholderen fra vertsmaskinen din:

$ sudo docker run -p 80:80 nginx

Denne kommandoen vil kjøre i terminalen din i tilkoblet modus, noe som betyr at beholderen bokstavelig talt er koblet til terminalen din, så alle logger fra beholderen vil bli skrevet ut der. Når beholderen har startet opp, åpne http://localhost i nettleseren din. Du vil se en Nginx-velkomstskjerm som ligner på nedenfor:

Nginx-beholderen kjører nå inne i beholdermotoren din. Mens Nginx kjører i tilkoblet modus, vil den bare fortsette å kjøre så lenge den er åpen. Du kan gå ut av Nginx-beholderen ved å trykke Ctrl + C i terminalen din.

Hvordan kjøre containere i bakgrunnen

For å kjøre Nginx i bakgrunnen, legger vi til et nytt flagg, -d, for frakoblet modus. Dette vil starte beholderen løsrevet fra terminalen din, noe som betyr at den er i bakgrunnen. For eksempel:

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

Du kan liste kjørende beholdere på et system. Legg merke til hvordan Nginx-beholderen din nå kjører i bakgrunnen og har blitt tildelt en ID.

$ sudo docker ps

En kjørende bakgrunnsbeholder kan drepes ved å bruke IDen. Du kan også legge merke til at beholderen har fått et navn. Når en ikke er spesifisert, vil Docker gi hver container et tilfeldig, unikt navn.

$ sudo docker kill 

Du kan imidlertid teste dette med noen mer interessante bilder. Det er mange tilgjengelige over på Docker-hub, som fungerer som et sentralt depot for offentlige containerbilder.

Dykke dypere med containere

Dette har vært en kort introduksjon til containere. Beholdere kan være grenseløst komplekse, men de er en grunnleggende byggestein i de høyt distribuerte systemene som kjører mye av vårt moderne internett. Den kraften tar imidlertid ikke bort fra bruken deres i mindre skala. Kjennskap til det grunnleggende om containere og Docker kan være inngangsporten til å kjøre nyttige lokale tjenester som en Minecraft server eller Plex på en gammel PC.