Sådan fungerer Docker-objektbeholdere
Tidligere har du opdaget, at objektbeholderen bliver den enhed, du skal bruge til at distribuere dine apps. Du har også lært, at objektbeholderen er i et standardiseret format, som både dine udvikler- og operationsteams bruger.
I dit eksempel er du ved at udvikle en portal til ordresporing, som din virksomheds forskellige forretninger kan bruge. Når Docker-billedet er bygget, er dit driftsteam nu ansvarlig for udrulning, udrulning af opdateringer og administration af din ordresporingsportal.
I det forrige undermodul kiggede du på, hvordan et Docker-billede bygges. Her ser du lidt på en Docker-objektbeholders livscyklus, og hvordan du administrerer objektbeholdere. Du får også mere at vide om, hvordan du konfigurerer datalager og netværksindstillingerne for dine objektbeholdere.
Sådan administrerer du Docker-objektbeholdere
En Docker-objektbeholder har en livscyklus, som du kan bruge til at administrere og spore objektbeholderens tilstand.
Hvis du vil placere en objektbeholder i kørselstilstanden, skal du bruge kommandoen kør. Du kan også genstarte en objektbeholder, der allerede kører. Når du genstarter en objektbeholder, modtager objektbeholderen et afslutningssignal for at gøre det muligt for alle kørende processer at lukke korrekt, før objektbeholderens kerne afsluttes.
En objektbeholder anses for at være i en kørende tilstand, indtil den enten er midlertidigt afbrudt, stoppet eller dræbt. En objektbeholder kan dog også afslutte den kørende tilstand i sig selv. En objektbeholder kan afslutte sig selv, når den kørende proces er fuldført, eller hvis processen går i fejltilstand.
Hvis du vil afbryde en kørende objektbeholder midlertidigt, skal du bruge kommandoen pause
. Denne kommando afbryder alle processer i objektbeholderen.
Hvis du vil stoppe en kørende objektbeholder, skal du bruge kommandoen stop
. Kommandoen stop
gør det muligt for arbejdsprocessen at lukke korrekt ved at sende det et afslutningssignal. Beholderens kerne afsluttes, når processen lukkes.
Hvis du har brug for at afslutte objektbeholderen, skal du bruge kommandoen kill
til at sende et kill-signal. Objektbeholderens kerne registrerer kill-signalet, men det gør den kørende proces ikke. Denne kommando afslutter arbejdsprocessen i objektbeholderen kraftigt.
Hvis du vil fjerne objektbeholdere, der er i en stoppet tilstand, skal du bruge kommandoen remove
. Når du har fjernet en objektbeholder, ødelægges alle data, der er gemt i objektbeholderen.
Sådan får du vist tilgængelige objektbeholdere
Kør kommandoen docker ps
for at få vist en liste over aktive objektbeholdere. Hvis du vil se alle objektbeholdere i alle tilstande, skal du overføre argumentet -a
.
Her er et eksempel:
docker ps -a
Her er outputtet fra denne kommando:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d93d40cc1ce9 tmp-ubuntu:latest "dotnet website.dll …" 6 seconds ago Up 5 seconds 8080/tcp happy_wilbur
33a6cf71f7c1 tmp-ubuntu:latest "dotnet website.dll …" 2 hours ago Exited (0) 9 seconds ago adoring_borg
Der er tre elementer, der skal gennemses i det foregående output:
Det billednavn, der er angivet i kolonnen IMAGE. i dette eksempel tmp-ubuntu: seneste. Bemærk, hvordan du har tilladelse til at oprette mere end én objektbeholder ud fra det samme billede. Dette er en effektiv administrationsfunktion, du kan bruge til at aktivere skalering i dine løsninger.
Den objektbeholderstatus, der er angivet i kolonnen STATUS. I dette eksempel har du én objektbeholder, der kører, og én objektbeholder, der er afsluttet. Objektbeholderens status er normalt den første indikator for objektbeholderens tilstand.
Det objektbeholdernavn, der er angivet i kolonnen NAMES. Bortset fra objektbeholder-id'et i den første kolonne modtager objektbeholderne også et navn. I dette eksempel har du ikke eksplicit angivet et navn for hver objektbeholder, og Derfor gav Docker objektbeholderen et tilfældigt navn. Hvis du vil give en objektbeholder et eksplicit navn ved hjælp af flaget
--name
, skal du bruge kommandoenrun
.
Hvorfor får objektbeholdere et navn?
Denne funktion giver dig mulighed for at køre flere objektbeholderforekomster af det samme billede. Objektbeholdernavne er entydige, hvilket betyder, at hvis du angiver et navn, kan du ikke genbruge dette navn til at oprette en ny objektbeholder. Den eneste måde at genbruge et bestemt navn på er ved at fjerne den forrige objektbeholder.
Sådan kører du en objektbeholder
Hvis du vil starte en objektbeholder, skal du bruge kommandoen docker run
. Du skal kun angive det billede, der skal køres med dets navn eller id, for at starte objektbeholderen fra billedet. En objektbeholder, der startes på denne måde, giver en interaktiv oplevelse.
Her skal du tilføje flaget -d
for at køre objektbeholderen med vores websted i baggrunden.
docker run -d tmp-ubuntu
Kommandoen returnerer i dette tilfælde kun id'et for den nye objektbeholder.
Når du har angivet et billede, der skal køres, finder Docker billedet, indlæser objektbeholderen fra billedet og udfører den kommando, der er angivet som indgangspunkt. Det er på dette tidspunkt, at objektbeholderen er tilgængelig til administration.
Sådan stopper du en objektbeholder midlertidigt
Kør kommandoen docker pause
for at afbryde en objektbeholder midlertidigt. Her er et eksempel:
docker pause happy_wilbur
Hvis en objektbeholder afbrydes midlertidigt, afbrydes alle processer midlertidigt. Denne kommando gør det muligt for objektbeholderen at fortsætte processer på et senere tidspunkt. Kommandoen docker unpause
fjerner afhængigheden af alle processer i de angivne objektbeholdere.
Sådan genstarter du en objektbeholder
Kør kommandoen docker restart
for at genstarte objektbeholdere. Her er et eksempel:
docker restart happy_wilbur
Objektbeholderen modtager en stopkommando efterfulgt af en startkommando. Hvis objektbeholderen ikke reagerer på stopkommandoen, sendes der et afslutningssignal.
Sådan stopper du en objektbeholder
Kør kommandoen docker stop
for at stoppe en kørende objektbeholder. Her er et eksempel:
docker stop happy_wilbur
Stopkommandoen sender et afslutningssignal til objektbeholderen og de processer, der kører i objektbeholderen.
Sådan fjerner du en objektbeholder
Kør kommandoen docker rm
for at fjerne en objektbeholder. Her er et eksempel:
docker rm happy_wilbur
Når du har fjernet objektbeholderen, ødelægges alle data i objektbeholderen. Det er vigtigt altid at betragte objektbeholdere som midlertidige, når du overvejer at gemme data.
Konfiguration af dockerobjektbeholderlager
Som beskrevet tidligere skal du altid betragte objektbeholdere som midlertidige, når appen i en objektbeholder skal gemme data.
Lad os antage, at din sporingsportal opretter en logfil i en undermappe til roden af appen. dvs. direkte til objektbeholderfilsystemet. Når din app skriver data til logfilen, skriver systemet dataene til det skrivbare objektbeholderlag.
Selvom denne tilgang fungerer, har den desværre flere ulemper.
Container Storage er midlertidig.
Logfilen bevares ikke mellem objektbeholderforekomster. Lad os f.eks. antage, at du stopper og fjerner objektbeholderen. Når du starter en ny objektbeholderforekomst, baserer den nye forekomst sig selv på det angivne billede, og alle dine tidligere data mangler. Husk, at alle data i en objektbeholder ødelægges sammen med objektbeholderen, når du fjerner en objektbeholder.
Objektbeholderlager er koblet til den underliggende værtscomputer.
Det er svært at få adgang til eller flytte logfilen fra objektbeholderen, fordi objektbeholderen er koblet til den underliggende værtscomputer. Du skal oprette forbindelse til objektbeholderforekomsten for at få adgang til filen.
Container-lagerdrev er mindre performante.
Objektbeholdere implementerer en lagerdriver, så dine apps kan skrive data. Denne driver introducerer en ekstra abstraktion for at kommunikere med værts-OS-kernen og er mindre effektiv end at skrive direkte til et værtsfilsystem.
Objektbeholdere kan bruge to indstillinger til at bevare data. Den første mulighed er at gøre brug af diskenheder, og den anden er binde tilslutninger.
Hvad er en diskenhed?
En diskenhed gemmes på værtsfilsystemet på en bestemt mappeplacering. Vælg en mappe, hvor du ved, at dataene ikke ændres af ikke-Docker-processer.
Docker opretter og administrerer den nye diskenhed ved at køre kommandoen docker volume create
. Denne kommando kan være en del af vores Dockerfile-definition, hvilket betyder, at du kan oprette diskenheder som en del af processen til oprettelse af objektbeholdere. Docker opretter diskenheden, hvis den ikke findes, første gang du forsøger at montere diskenheden i en objektbeholder.
Diskenheder gemmes i mapper på værtsfilsystemet. Docker monterer og administrerer diskenhederne i objektbeholderen. Efter monteringen isoleres disse diskenheder fra værtscomputeren.
Flere objektbeholdere kan bruge de samme diskenheder samtidigt. Diskenheder fjernes heller ikke automatisk, når en objektbeholder holder op med at bruge diskenheden.
I dette eksempel kan du oprette en mappe på vores objektbeholdervært og montere denne diskenhed i objektbeholderen, når du opretter objektbeholderen til sporingsportalen. Når din sporingsportal logfører data, kan du få adgang til disse oplysninger via objektbeholderværtens filsystem. Du har adgang til denne logfil, selvom din objektbeholder er fjernet.
Docker gør det også muligt for tredjepartsvirksomheder at bygge tilføjelsesprogrammer, der skal bruges som volumener. Azure Storage indeholder f.eks. en plug-in til at montere Azure Storage som diskenheder på Docker-objektbeholdere.
Hvad er en bindingsmontering?
En bindingsmontering er konceptuelt den samme som en diskenhed. I stedet for at bruge en bestemt mappe kan du dog tilslutte en hvilken som helst fil eller mappe på værten. Du forventer også, at værten kan ændre indholdet af disse mounts. På samme måde som med diskenheder oprettes bindings mounten, hvis du monterer den, og den endnu ikke findes på værten.
Bind mounts har begrænset funktionalitet sammenlignet med diskenheder, og selvom de er mere performante, afhænger de af, at værten har en bestemt mappestruktur på plads.
Mængder anses for at være den foretrukne strategi for datalagring, der skal bruges sammen med objektbeholdere.
For Windows-objektbeholdere er der en anden mulighed: Du kan montere en SMB-sti som en diskenhed og præsentere den for objektbeholdere. Dette gør det muligt for objektbeholdere på forskellige værter at bruge det samme vedvarende lager.
Konfiguration af dockerobjektbeholdernetværk
Standardkonfiguration af Docker-netværk gør det muligt at isolere objektbeholdere på Docker-værten. Denne funktion giver dig mulighed for at bygge og konfigurere apps, der kan kommunikere sikkert med hinanden.
Docker indeholder forskellige netværksindstillinger til Linux og Windows.
Til Linux er der seks forudkonfigurerede netværksindstillinger:
- Bro
- Vært
- Overlay
- IPvLan
- MACvLan
- Ingen
Til Windows er der seks forudkonfigurerede netværksindstillinger:
- NAT (oversættelse af netværksadresse)
- Gennemsigtig
- Overlay
- L2Bridge
- L2Tunnel
- Ingen
Du kan vælge, hvilke af disse netværkskonfigurationer der skal anvendes på din objektbeholder, afhængigt af dens netværkskrav.
Hvad er bronetværket?
Bronetværket er den standardkonfiguration, der anvendes på objektbeholdere, når de startes uden at angive nogen anden netværkskonfiguration. Dette netværk er et internt privat netværk, der bruges af objektbeholderen, og det isolerer objektbeholdernetværket fra Docker-værtsnetværket.
Hver objektbeholder i bronetværket tildeles en IP-adresse og en undernetmaske, hvor værtsnavnet som standard er navnet på objektbeholderen. Objektbeholdere, der er tilsluttet standardbronetværket, har tilladelse til at få adgang til andre broforbundne objektbeholdere via IP-adresse. Bronetværket tillader ikke kommunikation mellem objektbeholdere ved hjælp af værtsnavne.
Docker publicerer som standard ingen objektbeholderporte. Hvis du vil aktivere porttilknytning mellem objektbeholderportene og Docker-værtsportene, skal du bruge flaget Docker-port --publish
.
Publiceringsflaget konfigurerer effektivt en firewallregel, der tilknytter portene.
I dette eksempel er din sporingsportal tilgængelig for klienter, der browser til port 80. Du skal knytte port 80 fra objektbeholderen til en tilgængelig port på værten. Du har port 8080 åben på værten, hvilket giver dig mulighed for at angive flaget på følgende måde:
--publish 8080:80
Alle klientgennemsyn til Docker-værts-IP og port 8080 kan få adgang til sporingsportalen.
Bortset fra Linux-specifikke konfigurationer fungerer NAT-netværket på Windows-værter på samme måde som et bronetværk. NAT er også standardnetværket på Windows, og alle objektbeholdere opretter forbindelse til det, medmindre andet er angivet.
Hvad er værtsnetværket?
Værtsnetværket giver dig mulighed for at køre objektbeholderen direkte på værtsnetværket. Denne konfiguration fjerner effektivt isolationen mellem værten og objektbeholderen på netværksniveau.
I dette eksempel antager vi, at du beslutter dig for at ændre netværkskonfigurationen til værtsnetværksindstillingen. Din sporingsportal er stadig tilgængelig ved hjælp af værts-IP'en. Du kan nu bruge den velkendte port 80 i stedet for en tilknyttet port.
Vær opmærksom på, at objektbeholderen kun kan bruge porte, som værten ikke allerede bruger.
I Windows er værtsnetværket ikke tilgængeligt. På Windows-værter er der ingen mulighed for at dele den samme IP-adresse (netværksstak) mellem værten og objektbeholderen. NAT-netværket fungerer på samme måde som et bronetværk, og indstillingen Overlay giver en IP-adresse til objektbeholderen fra det samme netværk som værten, men ikke samme IP-adresse.
Overlejring og andre netværksindstillinger
I forbindelse med mere avancerede scenarier giver både Linux og Windows yderligere netværksmuligheder. Indstillingen Overlay opretter f.eks. en virtuel switch fra værtsnetværket, så objektbeholdere på dette netværk kan hente IP-adresser fra DHCP-servere eller arbejde med IP-adresser fra dette netværkssegment. Docker gør det desuden muligt for tredjepartsleverandører at oprette netværks-plug-ins.
Hvad er ingen netværk?
Hvis du vil deaktivere netværk for objektbeholdere, skal du bruge indstillingen ingen netværk. Dette kan være nyttigt, hvis du har et program, der ikke bruger netværket, eller hvis du blot vil validere, at et program kører som forventet i en objektbeholder.
Overvejelser i forbindelse med operativsystemet
Vær opmærksom på, at der er forskelle mellem stationære operativsystemer til Docker-netværkskonfigurationsindstillingerne. Den Docker0 netværksgrænseflade er f.eks. ikke tilgængelig på macOS, når du bruger bronetværket, og brug af værtsnetværkskonfigurationen understøttes ikke for både Windows- og macOS-skriveborde.
Disse forskelle kan påvirke den måde, dine udviklere konfigurerer deres arbejdsproces på for at administrere udvikling af objektbeholdere. Derudover kan objektbeholderorkestrering også levere andre netværkskonfigurationer oven på Docker-konfigurationen.