I vores Docker-vej­led­ning giver vi dig en in­tro­duk­tion til Docker-vir­tu­a­li­se­rings­plat­for­men og viser dig, hvordan du bruger Docker på dit Ubuntu 22.04-system ved hjælp af enkle, let­for­stå­e­li­ge in­struk­tio­ner.

Dockers opbygning og funk­tio­ner

»Byg, di­stri­bu­er og kør enhver app, hvor som helst« – det er Dockers motto. Den open source-baserede con­tai­ner­p­lat­form tilbyder et flek­si­belt og res­sour­ce­be­spa­ren­de al­ter­na­tiv til emulering af hardwa­re­kom­po­nen­ter baseret på virtuelle maskiner (VM’er).

Mens tra­di­tio­nel hardwa­re­vir­tu­a­li­se­ring bygger på, at der kører flere gæ­ste­sy­ste­mer på et fælles vært­sy­stem, kører Docker-ap­pli­ka­tio­ner som isolerede processer på det samme system ved hjælp af con­tai­ne­re. Dette kaldes con­tai­ner­ba­se­ret vir­tu­a­li­se­ring, også kendt som vir­tu­a­li­se­ring på ope­ra­tiv­sy­stem­ni­veau.

Billede: Virtual machines and software containers in comparison
While each virtual machine launches its own operating system, Docker con­tai­ners share the core of the host system

En stor fordel ved con­tai­ner­ba­se­ret vir­tu­a­li­se­ring er, at ap­pli­ka­tio­ner med for­skel­li­ge krav kan køre adskilt fra hinanden uden at kræve den ekstra be­last­ning, som et separat gæ­ste­sy­stem medfører. Derudover kan ap­pli­ka­tio­ner med con­tai­ne­re im­ple­men­te­res på tværs af platforme og i for­skel­li­ge in­fra­struk­tu­rer uden at skulle tilpasses vært­sy­ste­mets hardware- eller softwa­re­kon­fi­gu­ra­tio­ner.

Docker er det mest populære softwa­re­pro­jekt, der giver brugerne adgang til con­tai­ner­ba­se­ret vir­tu­a­li­se­rings­tek­no­lo­gi. Den open source-baserede platform bygger på tre grund­læg­gen­de kom­po­nen­ter. For at kunne køre con­tai­ne­re behøver brugerne blot Docker-motoren samt specielle Docker-images, som kan hentes via Docker Hub eller oprettes selv.

Docker-billeder

Ligesom virtuelle maskiner er Docker-con­tai­ne­re baseret på Docker-images. Et image er en skri­ve­be­skyt­tet skabelon, der in­de­hol­der alle de in­struk­tio­ner, som Docker-motoren har brug for til at oprette en container. Et Docker-image beskrives som et bærbart billede af en container i form af en tekstfil, også kaldet en Do­ck­er­fi­le. Hvis en container skal startes på et system, indlæses der først en pakke med det på­gæl­den­de image, såfremt det ikke findes lokalt. Det indlæste billede leverer det nød­ven­di­ge filsystem inklusive alle parametre til kør­sels­ti­den. En container kan betragtes som en kørende proces af et billede.

Docker Hub

Docker Hub er et cloud­ba­se­ret register for softwa­rear­ki­ver, en slags bibliotek for Docker-billeder. On­li­ne­tje­ne­sten er opdelt i en offentlig og en privat sektion. Den of­fent­li­ge sektion giver brugerne mulighed for at uploade deres egne udviklede billeder og dele dem med fæl­les­ska­bet. Her findes der en række of­fi­ci­el­le billeder fra Docker-ud­vik­ler­tea­met og etab­le­re­de open source-projekter. Billeder, der uploades til den private del af registret, er ikke of­fent­ligt til­gæn­ge­li­ge og kan derfor deles, for eksempel inden for en virk­som­heds interne kreds eller med venner eller bekendte. Docker Hub kan tilgås på hub.docker.com.

Docker-motoren

Kernen i Docker-projektet er Docker-motoren. Det er et open source-klient-server-program, som i den aktuelle version er til­gæn­ge­ligt for alle brugere på alle gængse platforme.

Docker-motorens grund­læg­gen­de ar­ki­tek­tur er opdelt i tre kom­po­nen­ter: En daemon med ser­ver­funk­tio­ner, et pro­gram­me­rings­græn­se­fla­de (API) baseret på REST-pa­ra­dig­met (Re­p­re­sen­ta­tio­nal State Transfer) og ope­ra­tiv­sy­ste­mets terminal (kom­man­do­linje­græn­se­fla­de, CLI) som bru­ger­græn­se­fla­de (klient).

  • Docker-daemon: Som server for Docker-motoren anvendes en daemon-proces. Docker-daemonen kører i bag­grun­den på vært­sy­ste­met og bruges til den centrale styring af Docker-motoren. Denne funktion opretter og ad­mi­ni­stre­rer alle billeder, con­tai­ne­re og netværk.
  • REST-API: REST-API’en spe­ci­fi­ce­rer et sæt græn­se­fla­der, der gør det muligt for andre pro­gram­mer at kom­mu­ni­ke­re med Docker-daemonen og give den in­struk­tio­ner. Et af disse pro­gram­mer er ope­ra­tiv­sy­ste­mets terminal.
  • Terminal: Som kli­ent­pro­gram bruger Docker ope­ra­tiv­sy­ste­mets terminal. Dette, in­te­gre­ret med Docker-daemonen via REST-API’en, gør det muligt for brugere at styre den via scripts eller bru­ger­in­put.
Tip

I 2017 blev Docker-motoren omdøbt til Docker Community Edition (forkortet til Docker CE), men den of­fi­ci­el­le do­ku­men­ta­tion og Docker-repo­si­to­ri­er­ne bruger for det meste stadig det gamle navn. Ud over Docker CE findes der også Docker En­ter­pri­se Edition (Docker EE), som in­de­hol­der en række avan­ce­re­de funk­tio­ner. Den er dog ikke gratis og er derfor mere velegnet til virk­som­he­der.

Med Docker-kom­man­do­er kan brugerens softwa­recon­tai­ne­re startes, stoppes og ad­mi­ni­stre­res direkte fra ter­mi­na­len. Daemonen tilkaldes via kom­man­do­en docker og kom­man­do­er som build, pull eller run. Klient og server kan befinde sig på samme system. Brugere har også mulighed for at få adgang til en Docker-daemon på et andet system. Afhængigt af den type for­bin­del­se, der oprettes, foregår kom­mu­ni­ka­tio­nen mellem klienten og serveren via REST-API, via UNIX-sockets eller via en net­værks­græn­se­fla­de.

Følgende figur il­lu­stre­rer sam­spil­let mellem de enkelte Docker-kom­po­nen­ter ved hjælp af ek­sem­pel­kom­man­do­er­ne docker build, docker pull og docker run:

Billede: Schematic representation of the Docker architecture
'The Docker ar­chi­tec­tu­re is based on the coo­pe­ra­tion of the client (terminal'), server (Docker-daemon) og register (Docker Hub).“

Kom­man­do­en docker build in­stru­e­rer Docker-daemonen om at oprette et image (stiplet linje). Til dette skal der foreligge en til­hø­ren­de Do­ck­er­fi­le. Hvis imaget ikke skal oprettes, men i stedet hentes fra et repo­si­tory i Docker Hub, anvendes kom­man­do­en docker pull (streg­linje). Hvis Docker-daemonen via docker run får besked på at starte en container, kon­trol­le­rer bag­grund­spro­gram­met, om det til­sva­ren­de con­tai­ner­bil­le­de er til­gæn­ge­ligt lokalt. Hvis det er tilfældet, køres con­tai­ne­ren (hel linje). Hvis daemonen ikke kan finde billedet, initierer den au­to­ma­tisk en pull fra repo­si­to­ri­et.

Arbejde med Docker

Nu er det tid til at stifte be­kendt­skab med con­tai­ner­p­lat­for­mens ap­pli­ka­tio­ner. Hvis du endnu ikke har in­stal­le­ret Docker-motoren, kan du gøre det via Linux-ter­mi­na­len. Du kan finde vej­led­ning i, hvordan du gør dette, i vores artikel med titlen»Installer Docker på Ubuntu 22.04«. Læs nedenfor, hvordan du styrer Docker-motoren fra ter­mi­na­len, hvad Docker Hub kan gøre for dig, og hvorfor Docker-con­tai­ne­re kan re­vo­lu­tio­ne­re den måde, du arbejder med ap­pli­ka­tio­ner på.

Sådan styrer du Docker-motoren

Siden version 16.04 har Ubuntu brugt bag­grund­spro­gram­met systemd(for­kor­tel­se for »system daemon«) til at styre processer.Systemd eren init-proces, der også bruges i andre Linux-di­stri­bu­tio­ner som RHEL, CentOS eller Fedora.Systemd tildelestypisk proces-ID 1. Som systemets første proces har daemonen til opgave at starte, overvåge og afslutte alle ef­ter­føl­gen­de processer. I tidligere Ubuntu-versioner (14.10 og ældre) varetager bag­grund­spro­gram­metupstart denne funktion.

Docker-daemonen kan også styres via systemd. I stan­dar­din­stal­la­tio­nen er con­tai­ner­p­lat­for­men kon­fi­gu­re­ret således, at daemonen starter au­to­ma­tisk, når systemet startes op. Denne stan­dar­dindstil­ling kan tilpasses via kom­man­do­linje­værk­tø­jet systemctl.

Med systemctl sender du kom­man­do­er til systemd for at styre en proces eller hente dens status. Syntaksen for en sådan kommando er som følger:

systemctl [OPTION] [COMMAND]
bash

Nogle kom­man­do­er henviser til bestemte res­sour­cer (for eksempel Docker). I systemd-ter­mi­no­lo­gi­en kaldes disse for enheder. I dette tilfælde består kom­man­do­en af den på­gæl­den­de in­struk­tion og navnet på den enhed, der skal adres­se­res.

Hvis du vil aktivere (enable) eller de­ak­ti­ve­re (disable) autostart af Docker-daemonen, skal du bruge kom­man­do­linje­værk­tø­jet systemctl med følgende kom­man­do­er:

sudo systemctl enable docker
sudo systemctl disable docker
bash

Kom­man­do­linje­værk­tø­jet systemctl giver dig mulighed for at tjekke status for en enhed:

sudo systemctl status docker
bash

Hvis Docker-motoren på dit Ubuntu-system er aktiv, bør ud­skrif­ten i ter­mi­na­len se ud som på ne­den­stå­en­de skærm­bil­le­de:

Billede: The status query via systemctl shows: The Docker engine is active (running)
Status query via systemctl: The Docker Engine is active (running)

Hvis din Docker-motor i øje­blik­ket er de­ak­ti­ve­ret, vil du se sta­tus­an­gi­vel­sen »inaktiv (død)«. I dette tilfælde skal du manuelt starte Docker-daemonen for at kunne køre con­tai­ne­re.

Billede: The status query via systemctl shows: The Docker engine is inactive (dead)
Status query via systemctl: The Docker engine is inactive (dead)

Hvis du vil starte, stoppe eller genstarte din Docker-motor manuelt, skal du bruge en af følgende kom­man­do­er i systemd.

For at starte den de­ak­ti­ve­re­de daemon skal du bruge systemctl sammen med kom­man­do­en start:

sudo systemctl start docker
bash

Hvis Docker-daemonen skal afsluttes, skal du i stedet bruge kom­man­do­en stop:

sudo systemctl stop docker
bash

Der anmodes om en genstart af motoren med kom­man­do­en restart:

sudo systemctl restart docker
bash

Sådan bruger du Docker Hub

Hvis Docker-motoren udgør hjertet i con­tai­ner­p­lat­for­men, så er Docker Hub sjælen i open source-projektet. Det er her, fæl­les­ska­bet mødes. I det cloud­ba­se­re­de register kan brugerne finde alt, hvad de har brug for, for at få liv i deres Docker-in­stal­la­tion.

On­li­ne­tje­ne­sten tilbyder en række of­fi­ci­el­le arkiver med over 100.000 gratis apps. Brugerne har mulighed for at oprette et bil­le­d­ar­kiv og dele det med ar­bejds­grup­per. Ud over den pro­fes­sio­nel­le support, som ud­vik­ler­tea­met tilbyder, kan begyndere her finde kontakt til bru­ger­fæl­les­ska­bet. Der findes et forum for bru­ger­støt­te på GitHub.

Billede: The Docker hub: Registration
Create your personal Docker ID for free by re­gi­ste­ring / Source: hub.docker.com

Re­gi­stre­ring på Docker Hub

Det er gratis at oprette en konto på Docker Hub. Brugere skal blot have en e-mailadres­se og deres valgte Docker-ID. Dette fungerer senere som et per­son­ligt repo­si­tory-nav­ne­om­rå­de og giver brugerne adgang til alle Docker-tjenester. I øje­blik­ket omfatter dette tilbud Docker Cloud, Docker Store og udvalgte be­tapro­gram­mer ud over Docker Hub. Det gør det også muligt at bruge Docker-ID’et som login til Docker Support Center samt Docker Success Portal og Docker Forum.

Re­gi­stre­rings­pro­ces­sen består af fem trin:

  1. Vælg dit Docker-ID: Som det første trin i til­mel­din­gen skal du vælge et bru­ger­navn, der senere vil blive brugt som dit per­son­li­ge Docker-ID.
  2. Indtast en e-mailadres­se: Indtast din nuværende e-mailadres­se. Bemærk, at du skal bekræfte din re­gi­stre­ring hos Docker Hub via e-mail.
  3. Vælg en ad­gangs­ko­de: Vælg en hemmelig ad­gangs­ko­de.
  4. Indsend din re­gi­stre­ring: Klik på ‘Tilmeld’ for at indsende din re­gi­stre­ring. Når dataene er blevet overført, sender Docker et link til din angivne indbakke, hvor du kan bekræfte din e-mailadres­se.
  5. Bekræft din e-mailadres­se: Bekræft din e-mailadres­se ved at klikke på be­kræf­tel­ses­lin­ket.

Docker-pro­jek­tets on­li­ne­tje­ne­ster er til­gæn­ge­li­ge med det samme, når du har tilmeldt dig i browseren. Her kan du oprette repo­si­to­ri­er og ar­bejds­grup­per eller søge efter of­fent­li­ge res­sour­cer på Docker Hub ved hjælp af funk­tio­nen »Explore«.

Billede: Dashboard of the Docker hub
Select and set repo­si­to­ri­es and wor­k­groups via the Docker hub dashboard / Source: hub.docker.com

Du kan også logge ind direkte i dit ope­ra­tiv­sy­stems terminal ved hjælp af kom­man­do­en docker login. Du finder en de­tal­je­ret be­skri­vel­se af kom­man­do­en i Docker-do­ku­men­ta­tio­nen.

I prin­cip­pet er Docker Hub også til­gæn­ge­lig for brugere uden en konto eller et Docker-ID. I dette tilfælde kan man dog kun hente billeder fra of­fent­li­ge repo­si­to­ri­er. Det er ikke muligt at uploade (push) egne billeder uden et Docker-ID.

Opret repo­si­to­ri­er i Docker Hub

Den gratis Docker Hub-konto in­de­hol­der ét privat repo­si­tory og giver mulighed for at oprette et ube­græn­set antal of­fent­li­ge repo­si­to­ri­er. Hvis du har brug for flere private repo­si­to­ri­er, kan du få adgang til disse ved at opgradere til en betalt version.

Gør følgende for at oprette et arkiv:

  1. Vælg et nav­ne­om­rå­de: Nyligt oprettede repo­si­to­ri­er tildeles au­to­ma­tisk nav­ne­om­rå­det for dit Docker-ID. Du har også mulighed for at indtaste ID’et for en or­ga­ni­sa­tion, som du er medlem af.
  2. Navngiv repo­si­to­ri­et: Indtast et navn til det ny­op­ret­te­de repo­si­tory.
  3. Tilføj en be­skri­vel­se: Tilføj en kort be­skri­vel­se af dit repo­si­tory.
  4. Indstil synlighed: Vælg, om repo­si­to­ri­et skal være of­fent­ligt synligt (of­fent­ligt) eller kun til­gæn­ge­ligt for dig eller din or­ga­ni­sa­tion (privat).

Bekræft dine ind­tast­nin­ger ved at klikke på »Opret«.

Billede: The Docker hub: Input screen for creating a repository
Your repo­si­to­ri­es are au­to­ma­ti­cal­ly created in the namespace of your Docker ID / Source: hub.docker.com

Opret teams og or­ga­ni­sa­tio­ner

Med hubben tilbyder Docker en cloud­ba­se­ret platform, hvor bru­ger­de­fi­ne­re­de billeder ad­mi­ni­stre­res centralt og nemt kan deles med ar­bejds­grup­per. I Docker-ter­mi­no­lo­gi­en kaldes disse for or­ga­ni­sa­tio­ner. Ligesom bru­ger­kon­ti tildeles or­ga­ni­sa­tio­ner in­di­vi­du­el­le ID’er, som bruges til at stille billeder til rådighed og downloade dem. Ret­tig­he­der og roller inden for en or­ga­ni­sa­tion kan tildeles via teams. For eksempel har brugere, der er til­knyt­tet teamet »Owners«, beføjelse til at oprette private eller of­fent­li­ge repo­si­to­ri­er og tildele ad­gangs­ret­tig­he­der.

Ar­bejds­grup­per kan også oprettes og ad­mi­ni­stre­res direkte via kon­trol­pa­ne­let. Du kan finde yder­li­ge­re op­lys­nin­ger om or­ga­ni­sa­tio­ner og teams i Docker-do­ku­men­ta­tio­nen.

Arbejde med billeder og con­tai­ne­re

Som det første kon­takt­punkt for of­fi­ci­el­le Docker-res­sour­cer er Docker Hub vores ud­gangs­punkt for denne in­tro­duk­tion til hånd­te­ring af billeder og con­tai­ne­re. Ud­vik­ler­tea­met har stillet demo-billedet »whalesay« til rådighed, som vil danne grundlag for den følgende Docker-vej­led­ning.

Download Docker-billeder

Du kan finde billedet »whalesay« ved at gå ind på Docker Hub-webstedet og skrive »whalesay« i sø­ge­fel­tet ved siden af Docker-logoet.

Billede: The search function in Docker hub
Search the Docker hub using the search bar or the ‘Explore’ button / Source: hub.docker.com

Klik på res­sour­cen med titlen docker/whalesay i sø­ge­re­sul­ta­ter­ne for at få adgang til det of­fent­li­ge repo­si­tory for dette billede.

Docker-arkiver er altid opbygget efter det samme mønster. Øverst på siden kan brugerne se billedets titel, arkivets kategori og tids­punk­tet for den seneste upload (sidste push).

Billede: Web view of a Docker repository
In the repo­si­tory, users generally find all in­for­ma­tion that is needed to use an image / Source: hub.docker.com

Hvert Docker-repo­si­tory in­de­hol­der desuden følgende infobokse:

  1. Be­skri­vel­se: De­tal­je­ret be­skri­vel­se, som normalt in­de­hol­der brugs­an­vis­nin­ger
  2. Docker pull-kommando: Kom­man­do­linje­di­rek­tiv, der bruges til at downloade billedet fra repo­si­to­ri­et (pull)
  3. Ejer: Op­lys­nin­ger om op­havs­man­den til repo­si­to­ri­et
  4. Kom­men­ta­rer: Kom­men­tar­felt nederst på siden

Op­lys­nin­ger­ne i arkivets in­for­ma­tions­fel­ter viser, at whalesay er en vi­de­re­ud­vik­ling af open source-Perl-scriptet cowsay. Pro­gram­met, der blev udviklet af Tony Monroe i 1999, genererer en ASCII-grafik i form af en ko, som vises sammen med en besked på brugerens terminal.

For at downloade docker/whalesay skal du bruge kom­man­do­en docker pull:

docker pull [OPTIONS] NAME [:TAG|@DIGEST]
bash

Kom­man­do­en docker pull in­stru­e­rer daemonen om at hente et image fra repo­si­to­ri­et. Du angiver, hvilket image der er tale om, ved at indtaste image-titlen (NAME). Du kan også angive over for Docker, hvordan den ønskede kommando skal udføres (OPTIONS). Valgfri ind­tast­ning omfatter tags (:TAG) og in­di­vi­du­el­le iden­ti­fi­ka­tions­num­re (@DIGEST), som giver dig mulighed for at downloade en bestemt version af et image.

Man henter en lokal kopi af docker/whalesay-billedet med følgende kommando:

docker pull docker/whalesay
bash

Som ud­gangs­punkt kan du springe dette trin over. Hvis du vil starte en container, henter Docker-daemonen au­to­ma­tisk de billeder fra arkivet, som den ikke kan finde på det lokale system.

Start Docker-billeder som con­tai­ne­re

For at starte et Docker-billede skal du bruge kom­man­do­en docker run:

docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG...]
bash

Den eneste ob­liga­to­ri­ske del af kom­man­do­en docker run er navnet på det ønskede Docker-billede. Men når du starter en container, har du også mulighed for at angive ekstra indstil­lin­ger, TAG’er og DIGEST’er. Derudover kan kom­man­do­en docker run kom­bi­ne­res med andre kom­man­do­er, der udføres, så snart con­tai­ne­ren starter. I dette tilfælde over­skri­ves CMD (COMMAND, defineret af bil­led­ska­be­ren og udført au­to­ma­tisk, når con­tai­ne­ren startes). Andre valgfri kon­fi­gu­ra­tio­ner kan defineres gennem yder­li­ge­re ar­gu­men­ter (ARG…). Dette gør det for eksempel muligt at tilføje brugere eller overføre mil­jøva­ri­ab­ler.

Brug kom­man­do­linje­di­rek­ti­vet

docker run docker/whalesay cowsay boo
bash

for at downloade det ek­si­ste­ren­de Perl-script som et billede og køre det i en container. Du vil se, at whalesay adskiller sig markant fra kil­descrip­tet.

Billede: Terminal output of the container docker/whalesay: The whale says ‘boo’
If docker/whalesay is run with the standard command, the Docker whale is limited to a short ‘boo’

Hvis billedet docker/whalesay køres, viser scriptet en ASCII-grafik i form af en hval samt tekst­be­ske­den »boo«, som sendes via kom­man­do­en cowsay i ter­mi­na­len.

Ligesom ved test­kørs­len søger daemonen først efter det ønskede billede i det lokale filmappe. Da der ikke findes en pakke med samme navn, igang­sæt­tes en hentning fra Docker-arkivet. Derefter starter daemonen det ændrede cowsay-program. Når dette er kørt færdigt, lukkes con­tai­ne­ren au­to­ma­tisk.

Ligesom cowsay giver Dockers whalesay også mulighed for at gribe ind i pro­gram­for­lø­bet for at påvirke den tekst, der vises i ter­mi­na­len. Prøv denne funktion ved at erstatte »boo« i kom­man­do­en output med en vilkårlig tekst­streng eller f.eks. en dårlig hval-vits.

sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
bash
Billede: Terminal output of the container docker/whalesay: A whale with an individual message
Make your Docker whale say whatever you want by placing words in his speech bubble

Vis alle Docker-billeder på det lokale system

Hvis du ikke er sikker på, om du allerede har down­lo­a­det et bestemt billede, kan du få vist en oversigt over alle bil­le­der­ne på din lokale computer. Brug følgende kom­man­do­linje­kom­man­do:

sudo docker image
bash

Kom­man­do­en docker images (al­ter­na­tiv docker image ls) viser alle lokale billeder, herunder fil­stør­rel­se, tag og billed-ID.

Billede: Overview of all images on the local system
The overview displays the images hello-world and docker/whalesay

Når du starter en container, down­lo­a­des det un­der­lig­gen­de billede som en kopi fra arkivet og gemmes permanent på din computer. Det sparer dig tid, hvis du senere vil bruge billedet. Der iværk­sæt­tes kun en ny download, hvis bil­led­kil­den ændres, for eksempel hvis der er en nyere version til­gæn­ge­lig i arkivet.

Vis alle con­tai­ne­re på det lokale system

Hvis du vil få vist en oversigt over alle con­tai­ne­re, der kører på dit system eller har kørt tidligere, skal du bruge kom­man­do­linje­kom­man­do­en docker ps sammen med indstil­lin­gen --all (forkortet: -a):

sudo docker ps -a
bash
Billede: Overview of all containers on the local system
The overview shows all con­tai­ners that have been launched on the Docker engine

Ter­mi­na­lud­skrif­ten in­de­hol­der op­lys­nin­ger som den på­gæl­den­de con­tai­ners ID, det un­der­lig­gen­de billede, den kommando, der blev kørt, da con­tai­ne­ren blev startet, tids­punk­tet for con­tai­ne­rens opstart samt status.

Hvis du kun vil vise de con­tai­ne­re, der i øje­blik­ket kører på dit system, skal du bruge kom­man­do­linje­di­rek­ti­vet docker ps uden yder­li­ge­re indstil­lin­ger:

sudo docker ps
bash

I øje­blik­ket bør der dog ikke køre nogen con­tai­ne­re på dit system.

Opret Docker-billeder

Som vores Docker-vej­led­ning har vist, kan du finde billeder i Docker Hub, downloade dem og køre dem på ethvert system, hvor Docker-motoren er in­stal­le­ret. Men med Docker får du ikke kun adgang til det om­fat­ten­de udvalg af apps, der findes i registret. Plat­for­men byder også på en lang række mu­lig­he­der for at oprette dine egne billeder og dele dem med andre udviklere.

I de ind­le­den­de kapitler af denne Docker-vej­led­ning har du allerede lært, at hvert Docker-billede er baseret på en Do­ck­er­fi­le. Du kan fo­re­stil­le dig Do­ck­er­fi­les som en slags skabelon til opbygning af billeder. Det er enkle tekst­fi­ler, der in­de­hol­der alle de in­struk­tio­ner, Docker har brug for til at oprette et billede. I de følgende trin lærer du, hvordan du skriver en sådan Do­ck­er­fi­le og in­stru­e­rer Docker i at bruge den som grundlag for dit eget billede.

  1. Opret en ny mappe: Docker-ud­vik­ler­tea­met anbefaler, at der oprettes en ny mappe til hver Do­ck­er­fi­le. Under Linux kan man nemt oprette mapper i ter­mi­na­len. Brug følgende kom­man­do­linje­kom­man­do til at oprette en mappe med navnet my­do­ck­er­bu­ild:
mkdir mydockerbuild
bash
Billede: Ubuntu terminal: The command mkdir
Create new di­recto­ri­es with the command mkdir
  1. Naviger i det nye bibliotek: Brug kom­man­do­en cd til at navigere i det ny­op­ret­te­de ar­bejds­bi­bli­o­tek.
cd mydockerbuild
bash
Billede: Ubuntu terminal: The command cd
With the help of the cd command, switch to another working directory
  1. Opret en ny tekstfil: Du kan også nemt oprette tekst­fi­ler via ter­mi­na­len i Ubuntu. Brug til dette en editor som f.eks. Nano eller Vim. Opret en tekstfil med navnet Do­ck­er­fi­le i mappen my­do­ck­er­bu­ild.
nano Dockerfile
bash
Billede: Ubuntu terminal: Create text files with Nano
The text editor Nano is pre­in­stal­led on all Ubuntu versions
  1. Skriv en Do­ck­er­fi­le: Den ny­op­ret­te­de tekstfil fungerer som en byg­ge­vej­led­ning til dit ege­n­ud­vik­le­de image. I stedet for at pro­gram­me­re imaget fra bunden vil vi i denne Docker-vej­led­ning bruge demo-imaget docker/whalesay som skabelon. Dette in­te­gre­res ved hjælp af kom­man­do­en FROM i din Do­ck­er­fi­le. Brug tagget :latest for at henvise til den nyeste version af imaget.
FROM docker/whalesay:latest

Indtil videre fungerer docker/whalesay sådan, at du selv skriver teksten. I ter­mi­na­len vises den nøjagtige tekst, du har indtastet, sammen med kom­man­do­en til at starte con­tai­ne­ren. Men det ville være mere in­ter­es­sant, hvis scriptet au­to­ma­tisk ge­ne­re­re­de ny tekst. Dette kan f.eks. gøres ved at bruge pro­gram­met fortunes, som findes på alle Linux-systemer. Den grund­læg­gen­de funktion af fortunes er at generere citater fra lyk­ke­ka­ger og hu­mo­ri­sti­ske aforismer. Brug følgende kommando til at opdatere dit nuværende lokale pak­ke­in­deks og in­stal­le­re fortunes:

RUN apt-get -y update && apt-get install -y fortunes

Definer derefter en CMD-sætning. Denne udføres efter RUN-kom­man­do­en, medmindre den er blevet over­skre­vet af call (docker run image CMD). Brug følgende kommando til at køre pro­gram­met fortunes med optionen -a (‘Vælg fra alle databaser’) og vise re­sul­ta­tet via pro­gram­met cowsay i ter­mi­na­len:

CMD /usr/games/fortune -a | cowsay

Din Do­ck­er­fi­le skal se således ud:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

Bemærk: Kom­man­do­er i en Do­ck­er­fi­le skrives altid med enkelt linje­af­stand og begynder altid med et nøgleord. Den un­der­lig­gen­de syntaks er ikke skelnen mellem store og små bogstaver, så det er li­ge­gyl­digt, om du skriver med store eller små bogstaver. Der er dog fastlagt en ensartet brug af store bogstaver i nøg­le­or­de­ne.

Billede: The text editor Nano in the Ubuntu terminal
Control the text editor Nano via the key com­bi­na­tions given in the footer
  1. Gem tekstfil: Gem din ind­tast­ning. Hvis du bruger Nano-editoren, skal du gemme med tast­kom­bi­na­tio­nen [CTRL] + [O] og bekræfte med [ENTER]. Nano viser en med­del­el­se om, at der er skrevet tre linjer til den valgte fil. Luk tek­ste­di­to­ren med tast­kom­bi­na­tio­nen [CTRL] + [X].
  2. Opret billede som Do­ck­er­fi­le: For at oprette et billede fra en Do­ck­er­fi­le skal du først navigere til det bibliotek, hvor tekst­fi­len er placeret. Start op­ret­tel­sen af billedet med kom­man­do­linje­di­rek­ti­vet docker build. Hvis du vil navngive billedet in­di­vi­du­elt eller give det et tag, skal du bruge indstil­lin­gen -t ef­ter­fulgt af den ønskede kom­bi­na­tion af label og tag. Stan­dard­for­ma­tet er name:tag.

I dette eksempel skal der oprettes et billede med navnet docker-whale:

docker build -t docker-whale .
bash

Det sidste punkt angiver, at den un­der­lig­gen­de Do­ck­er­fi­le findes i det valgte bibliotek. Du har også mulighed for at angive en filsti eller en URL til kil­de­fi­ler­ne.

Kom­pi­le­rings­pro­ces­sen starter, så snart kom­man­do­en bekræftes med [ENTER]. Først kon­trol­le­rer Docker-daemonen, om den har alle de filer, der skal til for at oprette billedet. I Docker-ter­mi­no­lo­gi samles dette under be­teg­nel­sen »kontekst«.

Derefter findes Docker-billedet »whalesay« med mærket :latest:

Hvis den nød­ven­di­ge kontekst til op­ret­tel­sen af billedet allerede findes i sin helhed, starter Docker-daemonen det bil­led­ska­be­lon, der er angivet via FROM, i en mid­ler­ti­dig container og går videre til den næste kommando i Do­ck­er­fi­len. I det aktuelle eksempel er dette RUN-kommando en, som sørger for, at pro­gram­met fortunes in­stal­le­res.

Ved af­slut­nin­gen af hvert trin i bil­ledop­ret­tel­ses­pro­ces­sen tildeler Docker et ID til det på­gæl­den­de lag, der oprettes i det på­gæl­den­de trin. Det betyder, at hver linje i den un­der­lig­gen­de Do­ck­er­fi­le svarer til et lag i det billede, der bygges på baggrund af den.

Når RUN-kom­man­do­en er afsluttet, stopper Docker-daemonen den container, der er oprettet til den, sletter den og starter en ny mid­ler­ti­dig container til laget fra CMD-sætningen. Ved af­slut­nin­gen af op­ret­tel­ses­pro­ces­sen lukkes og slettes denne mid­ler­ti­di­ge container også. Docker viser ID’et for det nye billede:

Successfully built a8f2048c9ab8
Billede: Ubuntu terminal: Status message during image creation
Docker images are created in multiple layers

Dit ny­op­ret­te­de billede kan findes under navnet docker-whale i over­sig­ten over dine lokalt gemte billeder.

sudo docker images
bash
Billede: Ubuntu terminal: Overview of all images
The newly created image in the image overview

For at starte en container ud fra dit ny­op­ret­te­de image skal du bruge kom­man­do­linje­pa­ra­me­te­ren sudo docker run sammen med navnet på imaget:

sudo docker run docker-whale
bash

Hvis billedet er blevet oprettet korrekt ud fra Do­ck­er­fi­len, bør din hval nu inspirere dig med mere eller mindre vise ord. Bemærk: Hver gang du gen­star­ter con­tai­ne­ren, genereres der en ny sætning.

Billede: Container based on docker-whale: Text output in the terminal
Thanks to fortunes, the ASCII whale now provides witty or wise phrases

Mærk Docker-billeder, og upload dem til Docker Hub

Hvis du vil uploade dit bru­ger­de­fi­ne­re­de docker-whale-billede til hubben og gøre det til­gæn­ge­ligt for enten fæl­les­ska­bet eller en ar­bejds­grup­pe, skal du først knytte det til et repo­si­tory med samme navn i dit eget per­son­li­ge nav­ne­om­rå­de. I Docker-ter­mi­no­lo­gi­en kaldes dette trin for tagging.

Gør følgende for at of­fent­lig­gø­re et billede på Docker Hub:

  1. Opret et repo­si­tory: Log ind på Docker Hub med dit Docker-ID og din per­son­li­ge ad­gangs­ko­de, og opret et of­fent­ligt repo­si­tory med navnet docker-whale.
Billede: The Docker hub: Entry form for creating a repository
Create a repo­si­tory for your custom image / Source: hub.docker.com
  1. Find billed-ID’et: Find ID’et for dit bru­ger­de­fi­ne­re­de billede »docker-whale« ved hjælp af kom­man­do­linje­pa­ra­me­te­ren docker images.
Billede: Overview of all local images in the Ubuntu terminal
The command docker images lists all images that are saved on your system

I vores tilfælde er billed-id’et a8f2048c9ab8. Det skal vi bruge til mærkning i næste trin.

  1. Mærk billedet: Mærk billedet »docker-whale« ved hjælp af kom­man­do­linje­pro­gram­met docker tag som beskrevet nedenfor:
sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
bash

I dette eksempel lyder kom­man­do­linje­di­rek­ti­vet til mærkning således:

sudo docker tag a8f2048c9ab8 [Namespace]/docker-whale:latest
bash

Du kan kon­trol­le­re, om du har tagget dit billede korrekt, ved hjælp af over­sig­ten docker images. Navnet på repo­si­to­ri­et bør nu indeholde dit Docker-ID.

Billede: Ubuntu terminal: Image overview before and after tagging
Link images with your Docker ID using the command docker tag
  1. Upload billedet: For at uploade billedet skal du først logge ind på Docker Hub. Dette gøres ved hjælp af kom­man­do­en docker login.
sudo docker login
bash

Ter­mi­na­len beder dig derefter om at indtaste dit bru­ger­navn (Docker-ID) og din ad­gangs­ko­de.

Billede: Log in to the Docker hub via the Ubuntu terminal
Before you can upload an image to the Docker hub, you first need to log in

Hvis loginet lykkedes, skal du bruge kom­man­do­linje­pa­ra­me­te­ren docker push til at uploade dit billede til det ny­op­ret­te­de arkiv.

sudo docker push [Namespace]/docker-whale
bash

Over­førs­len tager kun et par sekunder. Den aktuelle status vises i ter­mi­na­len.

Billede: Ubuntu terminal: Status message of the image upload
After uploading, the image is available under the set tag latest in the Docker hub

Log ind på Docker Hub via browseren for at se det uploadede billede.

Billede: Docker hub: The repository [Namespace]/docker-whale in the detailed view
The latest update of your repo­si­tory is shown in the detailed view / Source: hub.docker.com

Hvis du vil uploade mere end ét billede pr. repo­si­tory, skal du bruge for­skel­li­ge tags for at tilbyde dine billeder i for­skel­li­ge versioner. For eksempel:

[Namespace]/docker-whale:latest
[Namespace]/docker-whale:version1
[Namespace]/docker-whale:version2

Du kan finde en oversigt over de for­skel­li­ge bil­led­ver­sio­ner i Docker Hub-repo­si­to­ri­et under fanen »Tags«.

Billede: Docker hub: The ‘Tags’ tab
In the ‘Tags’ tab, you’ll find all versions of an image / Source: hub.docker.com

Billeder fra de for­skel­li­ge projekter bør dog lægges i separate arkiver.

Hvis over­førs­len lykkedes, vil dit bru­ger­de­fi­ne­re­de billede nu være til­gæn­ge­ligt i det of­fent­li­ge arkiv for alle Docker-brugere verden over.

  1. Test­kør­sel: Test, om uploaden er lykkedes, ved at forsøge at downloade billedet.

Bemærk, at den lokale version af billedet først skal slettes, før du kan downloade en ny kopi med samme tag. Ellers vil Docker meddele, at det ønskede billede allerede findes i den aktuelle version.

Billede: The Image is up to date
If an image exists locally, the pull command is cancelled

For at slette det lokale Docker-billede skal du bruge kom­man­do­linje­kom­man­do­en docker rmi sammen med det til­hø­ren­de billed-ID. Dette fast­læg­ges som sædvanlig via docker images. Hvis Docker melder en konflikt, f.eks. fordi et billed-ID bruges i flere repo­si­to­ri­er eller i en container, skal du gentage kom­man­do­en med pa­ra­me­te­ren --force (forkortet*-f* ) for at tvinge slet­nin­gen igennem.

sudo docker rmi -f a8f2048c9ab8
bash
Billede: Command docker rmi in combination with the option -f (force)
Use the command docker rmi in com­bi­na­tion with the option -f to force a deletion

Vis en oversigt over alle lokale billeder igen:

sudo docker Images
bash

De slettede elementer bør ikke længere vises i ter­mi­na­lud­skrif­ten. Brug nu kom­man­do­en »pull« fra repo­si­to­ri­et til at hente en ny kopi af billedet fra Docker Hub.

sudo docker pull [Namespace]/docker-whale
bash
Billede: Ubuntu terminal: Download from the Docker hub
The pre­vious­ly published image is suc­ces­sful­ly down­lo­a­ded

Yder­li­ge­re emner og vej­led­nin­ger om Docker

Docker-universet er stort, og med tiden er der opstået et levende økosystem omkring Docker-værk­tø­jer­ne. Docker er særligt nyttigt for sy­stemad­mi­ni­stra­to­rer, især hvis de ad­mi­ni­stre­rer komplekse ap­pli­ka­tio­ner med flere con­tai­ne­re, der kører si­de­lø­ben­de på for­skel­li­ge systemer. Docker tilbyder en række funk­tio­ner til or­ke­stre­ring af netop sådanne klynger. Du kan finde mere in­for­ma­tion om dette i vores artikel om Docker-or­ke­stre­ring med Swarm og Compose.

Den digitale guide in­de­hol­der yder­li­ge­re vej­led­nin­ger til brug af Docker:

  • Opsætning af et Docker-repo­si­tory
  • Docker-container-volumener
  • Docker: Sik­ker­heds­ko­pi­e­ring og gen­dan­nel­se
  • In­stal­la­tion og kørsel af Docker på en Linux-server
  • Vej­led­ning i Docker Compose

Docker egner sig til mange for­skel­li­ge an­ven­del­ses­sce­na­ri­er. I den digitale guide finder du følgende vej­led­nin­ger:

Docker er ikke altid det bedste valg til alle ap­pli­ka­tio­ner. I en af vores artikler gennemgår vi de mest populære al­ter­na­ti­ver til Docker. Derudover har vi mange artikler, der sam­men­lig­ner Docker med andre platforme:

  • Ku­ber­ne­tes kontra Docker
  • Openshift vs. Docker
  • Podman vs. Docker
Gå til ho­ved­me­nu­en