Så här fungerar Docker-containrar

Slutförd

Tidigare upptäckte du att containern blir den enhet som du ska använda för att distribuera dina appar. Du har också lärt dig att containern är i ett standardiserat format som både utvecklar- och åtgärdsteamen använder.

I ditt exempel utvecklar du en orderspårningsportal som företagets olika butiker kan använda. När Docker-avbildningen har skapats ansvarar ditt driftteam nu för att distribuera, distribuera uppdateringar och hantera din orderspårningsportal.

I föregående lektion tittade du på hur en Docker-avbildning skapas. Här kommer du att titta närmare på Docker-containerns livscykel samt hur du hanterar containrar. Du får också lära dig hur du konfigurerar datalagring och nätverksalternativen för dina containrar.

Så här hanterar du Docker-containrar

En Docker-container har en livscykel som du kan använda för att hantera och spåra containerns tillstånd.

Diagram som visar livscykeln för en container och övergången mellan livscykelns olika faser.

Om du vill placera en container i körningstillståndet använder du körningskommandot. Du kan också starta om en container som redan körs. När du startar om en container får containern en avslutningssignal så att alla processer som körs kan stängas av korrekt innan containerns kernel avslutas.

Containrar anses vara i ett körningstillstånd tills de antingen pausas, stoppas eller avbryts. En container kan dock också avslutas från körningstillståndet på egen hand. Containrar kan avsluta sig själva när körningsprocessen slutförs eller om processen hamnar i feltillstånd.

Om du vill pausa en container som körs använder du pause kommandot . Det här kommandot pausar alla processer i containern.

Om du vill stoppa en container som körs använder du stop kommandot . Kommandot stop gör att arbetsprocessen kan stängas av korrekt genom att skicka en avslutningssignal. Containerns kernel avslutas när processen har stängts av.

Om du behöver avsluta containern använder du kill kommandot för att skicka en kill-signal. Containerns kernel samlar in kill-signalen, men den process som körs gör det inte. Det här kommandot avslutar med kraft arbetsprocessen i containern.

Slutligen använder du kommandot för att ta bort containrar som är i ett stoppat tillstånd remove . När en container har tagits bort förstörs alla data som lagras i containern.

Så här visar du tillgängliga containrar

Kör kommandot docker ps för att visa containrar som körs. Om du vill se alla containrar i alla tillstånd skickar du argumentet -a.

Här är ett exempel:

docker ps -a

Här är utdata från kommandot:

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

Det finns tre objekt att granska i föregående utdata:

  • Bildnamnet som visas i kolumnen IMAGE . I det här exemplet tmp-ubuntu: latest. Observera att du kan skapa fler än en container från samma avbildning. Det här är en kraftfull hanteringsfunktion som du kan använda för att aktivera skalning i dina lösningar.

  • Containerstatusen som anges i kolumnen STATUS . I det här exemplet har du en container som körs och en container som har avslutats. Containerns status är vanligtvis den första indikatorn för containerns hälsa.

  • Containernamnet som anges i kolumnen NAMES . Förutom container-ID:t i den första kolumnen får containrar också ett namn. I det här exemplet angav du inte uttryckligen ett namn för varje container, och därför gav Docker containern ett slumpmässigt namn. Om du vill ge en container ett explicit namn med hjälp av --name flaggan använder du run kommandot .

Varför ges containrar ett namn?

Med den här funktionen kan du köra flera containerinstanser av samma avbildning. Containernamn är unika, vilket innebär att om du anger ett namn kan du inte återanvända det namnet för att skapa en ny container. Det enda sättet att återanvända ett specifikt namn är att ta bort den tidigare containern.

Så här kör du en container

Om du vill starta en container använder du docker run kommandot . Du behöver bara ange den avbildning som ska köras med dess namn eller ID för att starta containern från avbildningen. En container som startas på det här sättet ger en interaktiv upplevelse.

Här lägger du till flaggan -d för att köra containern med vår webbplats i bakgrunden.

docker run -d tmp-ubuntu

I det här fallet returnerar kommandot endast ID:t för den nya containern.

När du har angett en avbildning som ska köras hittar Docker avbildningen, läser in containern från avbildningen och kör kommandot som anges som startpunkt. Det är i det här läget som containern är tillgänglig för hantering.

Så här pausar du en container

Kör kommandot docker pause för att pausa en container. Här är ett exempel:

docker pause happy_wilbur

Om du pausar en container pausas alla processer. Det här kommandot gör att containern kan återuppta processerna senare. Kommandot docker unpause avanvänder alla processer i de angivna containrarna.

Så här startar du om en container

Kör kommandot docker restart för att starta om containrar. Här är ett exempel:

docker restart happy_wilbur

Containern tar emot ett stoppkommando följt av ett startkommando. Om containern inte svarar på stoppkommandot skickas en kill-signal.

Så här stoppar du en container

Kör kommandot docker stop för att stoppa en container som körs. Här är ett exempel:

docker stop happy_wilbur

Stoppkommandot skickar en avslutningssignal till containern och processerna som körs i containern.

Så här tar du bort en container

Kör kommandot docker rm för att ta bort en container. Här är ett exempel:

docker rm happy_wilbur

Alla data i containern förstörs när du har tagit bort containern. Det är viktigt att alltid betrakta containrar som temporära vad gäller datalagring.

Konfiguration av Docker-containerns lagring

Som vi beskrev tidigare bör du alltid betrakta containrar som tillfälliga när appen i en container behöver lagra data.

Anta att spårningsportalen skapar en loggfil i en undermapp till appens rot. det vill: direkt till containerfilsystemet. När din app skriver data till loggfilen skriver systemet data till det skrivbara containerskiktet.

Även om den här metoden fungerar har den tyvärr flera nackdelar.

  • Containerlagring är tillfälligt.

    Loggfilen behålls inte mellan containerinstanser. Anta till exempel att du stoppar och tar bort containern. När du startar en ny containerinstans baseras den nya instansen på den angivna avbildningen och alla dina tidigare data saknas. Kom ihåg att alla data i en container förstörs tillsammans med containern när du tar bort en container.

  • Containerlagring är kopplat till den underliggande värddatorn.

    Det är svårt att komma åt eller flytta loggfilen från containern eftersom containern är kopplad till den underliggande värddatorn. Du måste ansluta till containerinstansen för att få åtkomst till filen.

  • Containerlagringsenheter är mindre högpresterande.

    Containrar implementerar en lagringsdrivrutin som gör att dina program kan skriva data. Den här drivrutinen introducerar en extra abstraktion för att kommunicera med värdoperativsystemets kernel och är mindre högpresterande än att skriva direkt till ett värdfilsystem.

Containrar kan använda två alternativ för att bevara data. Det första alternativet är att använda volymer, och det andra är bindningsmonteringar.

Vad är en volym?

En volym lagras på värdfilsystemet vid en angiven mapplats. Välj en mapp där du vet att data inte kommer att ändras av icke-Docker-processer.

Docker skapar och hanterar den nya volymen genom att köra kommandot docker volume create. Det här kommandot kan ingå i vår Dockerfile-definition, vilket innebär att du kan skapa volymer som en del av processen för att skapa containrar. Docker skapar volymen om den inte finns när du försöker montera volymen i en container första gången.

Volymer lagras i kataloger på värdfilsystemet. Docker monterar och hanterar volymerna i containern. När dessa volymer har monterats är de isolerade från värddatorn.

Flera containrar kan använda samma volymer samtidigt. Dessutom tas volymer inte bort automatiskt när en container slutar använda volymen.

I det här exemplet kan du skapa en katalog på containervärden och montera den här volymen i containern när du skapar containern tracking-portal. När spårningsportalen loggar data kan du komma åt denna information via containervärdens filsystem. Du får åtkomst till den här loggfilen även om containern tas bort.

Docker är också ett sätt för tredjepartsföretag att skapa tillägg som ska användas som volymer. Azure Storage tillhandahåller till exempel ett plugin-program för att montera Azure Storage som volymer på Docker-containrar.

Vad är en bindningsmontering?

En bindningsmontering är konceptuellt densamma som en volym. Men i stället för att använda en specifik mapp kan du montera valfri fil eller mapp på värden. Du förväntar dig också att värden kan ändra innehållet i dessa monteringar. Precis som volymer skapas bindningsmonteringen om du monterar den och den ännu inte finns på värden.

Bindningsmonteringar har begränsade funktioner jämfört med volymer, och även om de presterar bättre är de beroende av att värden har en viss mappstruktur.

Volymer anses vara den bästa datalagringsstrategin som ska användas med containrar.

För Windows-containrar är ett annat alternativ tillgängligt: du kan montera en SMB-sökväg som en volym och presentera den för containrar. På så sätt kan containrar på olika värdar använda samma beständiga lagring.

Konfiguration av Docker-containerns nätverk

Standardkonfigurationen för Docker-nätverk tillåter isolera containrar på Docker-värden. Med den här funktionen kan du skapa och konfigurera appar som kan kommunicera säkert med varandra.

Docker tillhandahåller olika nätverksinställningar för Linux och Windows.

För Linux finns det sex förkonfigurerade nätverksalternativ:

  • Brygga
  • Host
  • Överlägg
  • IPvLan
  • MACvLan
  • Ingen

För Windows finns det sex förkonfigurerade nätverksalternativ:

  • NAT (översättning av nätverksadress)
  • Transparent
  • Överlägg
  • L2Bridge
  • L2Tunnel
  • Ingen

Du kan välja vilken av dessa nätverkskonfigurationer som ska tillämpas på din container beroende på dess nätverkskrav.

Vad är nätverksbryggan?

Bryggnätverket är standardkonfigurationen som tillämpas på containrar när det startas utan att ange någon annan nätverkskonfiguration. Det här nätverket är ett internt, privat nätverk som används av containern och isolerar containernätverket från Docker-värdnätverket.

Varje container i bryggnätverket tilldelas en IP-adress och nätmask, med värdnamnet som standard till containernamnet. Containrar som är anslutna till standardbrygganätverket får åtkomst till andra brygganslutna containrar med IP-adress. Nätverksbryggan tillåter inte kommunikation mellan containrar med hjälp av värdnamn.

Som standard publicerar inte Docker några containerportar. Använd Docker-portflaggan --publish för att aktivera portmappning mellan containerportarna och Docker-värdportarna.

Publiceringsflaggan konfigurerar i praktiken en brandväggsregel som mappar portarna.

I det här exemplet är spårningsportalen tillgänglig för klienter som navigerar till port 80. Du måste mappa port 80 från containern till en tillgänglig port på värden. Du har port 8080 öppen på värden, vilket gör att du kan ange flaggan så här:

--publish 8080:80

Alla klienter som navigerar till Docker-värd-IP och port 8080 kan komma åt spårningsportalen.

Förutom Linux-specifika konfigurationer fungerar NAT-nätverket på Windows-värdar på samma sätt som ett bryggnätverk. Nat är också standardnätverket i Windows, och alla containrar ansluter till det om inget annat anges.

Vad är värdnätverket?

Värdnätverket gör att du kan köra containern i värdnätverket direkt. Den här konfigurationen tar bort isoleringen mellan värden och containern på nätverksnivå.

I det här exemplet antar vi att du väljer att ändra nätverkskonfigurationen till alternativet för värdnätverk. Det går fortfarande att komma åt spårningsportalen via värd-IP. Nu kan du använda den välkända port 80 i stället för en mappad port.

Tänk på att containern endast kan använda portar som värden inte redan använder.

I Windows är värdnätverket inte tillgängligt. På Windows-värdar finns det inget alternativ för att dela samma IP-adress (nätverksstack) mellan värden och containern. NAT-nätverket fungerar ungefär som ett bryggnätverk, och alternativet Överlägg tillhandahåller en IP-adress till containern från samma nätverk som värden, men inte samma IP-adress.

Överlägg och andra nätverksalternativ

För mer avancerade scenarier tillhandahåller både Linux och Windows ytterligare nätverksalternativ. Överläggsalternativet skapar till exempel en virtuell växel från värdnätverket, så att containrar i nätverket kan hämta IP-adresser från DHCP-servrar eller arbeta med IP-adresser från det nätverkssegmentet. Dessutom tillåter Docker tredjepartsleverantörer att skapa nätverksinsticksprogram.

Vad är nätverket inget?

Om du vill inaktivera nätverk för containrar använder du alternativet inget nätverk. Detta kan vara användbart om du har ett program som inte använder nätverket, eller om du bara vill verifiera att ett program körs som förväntat i en container.

Överväganden vad gäller operativsystem

Tänk på att det finns skillnader mellan skrivbordsoperativsystem för Docker-nätverkskonfigurationsalternativen. Docker0-nätverksgränssnittet är till exempel inte tillgängligt på macOS när du använder bryggnätverket, och användning av konfigurationen för värdnätverk stöds inte för både Windows- och macOS-skrivbord.

De här skillnaderna kan påverka hur dina utvecklare konfigurerar sina arbetsflöden för att hantera containerutveckling. Dessutom kan containerorkestrerare även tillhandahålla andra nätverkskonfigurationer ovanpå Docker-installationen.

Kontrollera dina kunskaper

1.

En container startas med flaggan --publish 8080:80. Vilket av följande alternativ är den mest sannolika nätverkskonfigurationen som används för containern?

2.

Vilket lagringsalternativ är det bästa alternativet som gör att värden och containern kan dela en fil för att hantera namnservermatchning. till exempel filen resolve.conf i Linux?