Så här fungerar Docker-containrar
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.
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 durun
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.