Hämta en befintlig dockeravbildning och distribuera den lokalt
Docker är en teknik som gör att du kan distribuera program och tjänster snabbt och enkelt. En Docker-app körs med hjälp av en Docker-avbildning. En Docker-avbildning är en förpaketerad miljö som innehåller programkoden och miljön där koden körs.
I företagsscenariot som vi beskrev tidigare vill du undersöka möjligheten att paketera och köra en app med Docker. Du bestämmer dig för att skapa och distribuera en Docker-avbildning som kör en testwebbapp.
I den här lektionen får du lära dig om viktiga begrepp och processer som ingår vid körning av en containerbaserad app som lagras i en Docker-avbildning.
Översikt över Docker
Docker är ett verktyg för att köra containerbaserade appar. En containerbaserad app innehåller appen och filsystemet som utgör miljön som den körs i. En containerbaserad app kan exempelvis bestå av en databas och annan tillhörande programvara och konfigurationsinformation som behövs för att köra appen.
En containerbaserad app har vanligtvis ett mycket mindre fotavtryck än en virtuell dator som konfigureras för att köra samma app. Det mindre fotavtrycket beror på att en virtuell dator måste försörja hela operativsystemet och den associerade miljön som stöds. En Docker-container har ingen sådan extra information eftersom Docker använder operativsystemets kernel på värddatorn för att driva containern. Det går snabbare och mer utrymmeseffektivt att ladda ned och starta en Docker-avbildning än att ladda ned och köra en virtuell dator med liknande funktioner.
Du skapar en containerbaserad app genom att skapa en avbildning som innehåller en uppsättning filer och ett avsnitt med konfigurationsinformation som Docker använder. Du kan köra appen genom att be Docker starta en container baserat på avbildningen. När containern startar använder Docker avbildningskonfigurationen för att avgöra vilket program som ska köras i containern. Docker tillhandahåller operativsystemets resurser och nödvändig säkerhet. Det säkerställer att containrar körs samtidigt och förblir relativt isolerade.
Viktigt!
Docker tillhandahåller inte den isoleringsnivå som är tillgänglig för virtuella datorer. En virtuell dator implementerar isolering på maskinvarunivå. Docker-containrar delar underliggande operativsystemresurser och bibliotek. Docker ser dock till att en container inte kan komma åt en annans resurser om inte containrarna har konfigurerats för att göra det.
Du kan köra Docker på din stationära eller bärbara dator om du utvecklar och testar lokalt. För produktionssystem är Docker tillgängligt för servermiljöer, däribland många varianter av Linux och Microsoft Windows Server 2016 för system i drift. Många leverantörer har också stöd för Docker i molnet. Du kan till exempel lagra Docker-avbildningar i Azure Container Registry och köra containrar med Azure Container Instances.
I den här modulen använder du Docker lokalt för att skapa och köra en avbildning. Sedan laddar du upp avbildningen till Azure Container Registry och kör den i en Azure Container Instance. Den här versionen av Docker är lämplig för lokal utveckling och testning av Docker-avbildningar.
Docker-avbildningar med Linux och Windows
Docker utvecklades ursprungligen för Linux och har sedan dess utökats för att stödja Windows. Enskilda Docker-avbildningar är antingen Windows- eller Linux-baserade, men kan inte vara båda på samma gång. Avbildningens operativsystem avgör vilken typ av operativsystemmiljö som används i containern.
Författare till Docker-avbildningar som vill erbjuda liknande funktioner i både Linux- och Windows-baserade avbildningar kan skapa de här avbildningarna separat. Microsoft erbjuder till exempel Windows- och Linux Docker-avbildningar som innehåller en ASP.NET Core-miljö som du kan använda som grund för containerbaserade ASP.NET Core-program.
Linux-datorer med Docker installerat kan endast köra Linux-containrar. Windows-datorer med Docker installerat kan köra båda typerna av containrar. Windows kör båda med hjälp av en virtuell dator för att köra ett Linux-system och använder det virtuella Linux-systemet för att köra Linux-containrar.
I den här modulen ska du skapa och köra en Linux-baserad avbildning.
Docker-register och Docker Hub
Docker-avbildningar lagras och blir tillgängliga i register. Ett register är en webbtjänst som Docker kan ansluta till för att ladda upp och hämta containeravbildningarna. Det mest välkända registret är Docker Hub, vilket är ett offentligt register. Många personer och organisationer publicerar bilder till Docker Hub och du kan ladda ned och köra avbildningarna med hjälp av Docker som körs på skrivbordet, på en server eller i molnet. Du kan skapa ett Docker Hub-konto och ladda upp dina avbildningar till det utan kostnad.
Ett register är ordnat som en serie lagringsplatser. Varje lagringsplats innehåller flera Docker-avbildningar som delar ett gemensamt namn och vanligtvis har samma syfte och funktioner. Dessa avbildningar har normalt olika versioner som identifieras med en tagg. Med den här mekanismen kan du publicera och behålla flera versioner av avbildningar av kompatibilitetsskäl. När du laddar ned och kör en avbildning måste du ange registret, lagringsplatsen versionstaggen för avbildningen. Taggar är textetiketter. Du kan använda ditt versionsnummersystem (v1.0, v1.1, v1.2, v2.0 och så vidare).
Anta att du vill använda Docker-avbildningen av ASP.NET Core-körningen. Den här avbildningen finns i två versioner:
- 8.0 (Långsiktigt stöd):
mcr.microsoft.com/dotnet/aspnet:8.0
- 6.0 (Långsiktigt stöd):
mcr.microsoft.com/dotnet/aspnet:6.0
Anta nu att du vill använda Docker-avbildningarna av .NET Core-exempel. Här har vi fyra tillgängliga versioner att välja mellan:
mcr.microsoft.com/dotnet/samples:dotnetapp
mcr.microsoft.com/dotnet/samples:dotnetapp-chiseled
mcr.microsoft.com/dotnet/samples:aspnetapp
mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled
Kommentar
En enda avbildning kan ha flera taggar tilldelade till sig. Enligt konventionen tilldelas den senaste versionen av en avbildning den senaste taggen utöver en tagg som beskriver dess versionsnummer. När du släpper en ny version av en avbildning kan du tilldela den taggen senaste för att referera till den nya avbildningen.
En lagringsplats är också en avbildnings sekretessenhet. Om du inte vill dela en avbildning kan du göra lagringsplatsen privat. Du kan ge åtkomst till andra användare som du vill dela avbildningen med.
Bläddra i Docker Hub och hämta en avbildning
Kommentar
Du behöver inte slutföra något av exemplen eller köra någon av koden i följande avsnitt. Det gör du i nästa lektion.
Ofta ser du att det finns en avbildning i Docker Hub som matchar den typ av app som du vill behålla. Du kan ladda ned en sådan avbildning och utöka den med din programkod.
Docker Hub innehåller tusentals bilder. Du kan söka och bläddra i ett register med hjälp av Docker från kommandoraden eller Docker Hub-webbplatsen. På webbplatsen kan du söka efter, filtrera och välja avbildningar efter typ och utgivare. Bilden nedan visar ett exempel på söksidan.
Du kan hämta en avbildning med kommandot docker pull
med avbildningens namn. Som standard laddar Docker ned avbildningen som har taggen latest
från den lagringsplatsen på Docker Hub om du endast anger namnet på lagringsplatsen. Tänk på att du kan ändra kommandot för att hämta olika taggar och från olika lagringsplatser. Det här exemplet hämtar avbildningen med taggen aspnetapp
från mcr.microsoft.com/dotnet/samples:aspnetapp-lagringsplatsen. Den här avbildningen innehåller en enkel ASP.NET Core-webbapp.
Kommentar
Exemplen i den här enheten är avsedda att visa syntaxen för olika Docker-kommandon. Du behöver inte köra de här kommandona vid läsning av enheten. Övningarna som följer den här lektionen vägleder dig genom att arbeta med Docker direkt.
docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
När du hämtar en avbildning lagrar Docker den lokalt och gör den tillgänglig för att köra containrar. Du kan visa avbildningarna i det lokala registret med kommandot docker image list.
docker image list
Utdata ser ut som i följande exempel:
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples aspnetapp 6e2737d83726 6 days ago 263MB
Du kan använda avbildningsnamns-ID:t för att referera till avbildningen i många andra Docker-kommandon.
Köra en Docker-container
Använd kommandot docker run
för att starta en container. Ange avbildningen som ska köras med dess namn eller ID. Om du inte har docker pull
avbildningen redan gör Docker det åt dig.
docker run mcr.microsoft.com/dotnet/samples:aspnetapp
I det här exemplet svarar kommandot med följande meddelande:
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
Den här avbildningen innehåller en webbapp, så nu lyssnar den efter begäranden som tas emot på HTTP-port 80. Men om du öppnar en webbläsare och navigerar till http://localhost:80
visas inte appen.
Som standard tillåter inte Docker att inkommande begäranden når din container. Du måste be Docker att tilldela ett visst portnummer från din dator till ett visst portnummer i containern genom att lägga till -p
-alternativet till docker run
. Den här instruktionen aktiverar nätverksbegäranden till containern på den angivna porten.
Dessutom är inte webbappen i den här avbildningen avsedd att användas interaktivt från kommandoraden. När vi startar den vill vi att Docker ska starta den i bakgrunden och bara låta den köras. Använd flaggan -d
för att instruera Docker att starta webbappen i bakgrunden.
Tryck på Ctrl+C för att stoppa bilden och starta sedan om den enligt följande exempel:
docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp
Kommandot mappar port 80 i containern till port 8080 på datorn. Om du besöker sidan http://localhost:8080
i en webbläsare visas exempelwebbappen.
Containrar och filer
Om en container som körs gör ändringar i filerna i sin avbildning finns bara ändringarna i containern där ändringarna görs. Om du inte vidtar specifika åtgärder för att bevara tillståndet för en container går dessa ändringar förlorade när containern tas bort. På samma sätt delar inte flera containrar baserade på samma avbildning som körs samtidigt filerna i avbildningen. Varje container har en egen oberoende kopia. Alla data som en container skriver till filsystemet är inte synliga för den andra.
Du kan lägga till skrivbara volymer i en container. En volym representerar ett filsystem som containern kan montera och görs tillgänglig för programmet som körs i containern. Data i en volym kvarstår när containern stoppas, och flera containrar kan dela samma volym. Information om att skapa och använda volymer ligger utanför omfånget för den här modulen.
Det är en bra idé att undvika behovet av att göra ändringar i avbildningsfilsystemet för program som distribueras med Docker. Gör det bara för tillfälliga filer som kan få gå förlorade.
Hantera Docker-containrar
Du kan visa aktiva containrar med kommandot docker ps
.
docker ps
Utdata innehåller containerstatus – Upp om den körs, Avslutad om den avslutas – bland andra värden som kommandoradsflaggor som angavs när avbildningen startades och ytterligare information. Med Docker kan du köra flera containrar från samma avbildning samtidigt, så att varje container tilldelas ett unikt ID och ett unikt läsbart namn för människor. De flesta Docker-kommandon som används för att hantera enskilda containrar kan använda det ID eller namnet för att referera till en specifik container.
I följande utdata kan du se två containrar. I fältet PORTAR ser du att containern med ID elegant_ramanujan
är avbildningen som körs med port 80 på Docker-värden som mappas till port 8080 på datorn. Instansen youthful_heisenberg
är containern för den tidigare körningen av avbildningen. Fältet KOMMANDO visar kommandot som containern körde för att starta programmet i avbildningen. I det här fallet är det dotnet aspnetapp.dll för båda containrarna. Avbildnings-ID:t för containrarna är också detsamma eftersom båda containrarna kör samma avbildning.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 42 seconds ago Up 41 seconds 0.0.0.0:8080->80/tcp elegant_ramanujan
d27071f3ca27 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 5 minutes ago Up 5 minutes 0.0.0.0:8081->80/tcp youthful_heisenberg
Kommentar
docker ps
är en genväg för docker container ls
. Namnen på kommandona baseras på Linux-verktygen ps
och ls
, som anger processer respektive filer som körs.
Du kan stoppa en aktiv container med docker stop
kommandot och ange container-ID:t.
docker stop elegant_ramanujan
Om du kör docker ps
igen ser du att containern elegant_ramanujan inte längre finns i utdata. Containern finns fortfarande, men den är inte längre värd för en process som körs. Du kan ta med stoppade containrar i utdata för docker ps
genom att inkludera flaggan -a
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 2 minutes ago Exited (0) 21 seconds ago elegant_ramanujan
d27071f3ca27 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 7 minutes ago Up 7 minutes 0.0.0.0:8081->80/tcp youthful_heisenberg
Du kan starta om en stoppad container med kommandot docker start
. Huvudprocessen för containern startas på nytt.
docker start elegant_ramanujan
När en container har stoppats bör du vanligtvis också ta bort den. När en container tas bort rensas alla kvarvarande resurser. När du tar bort en container förloras eventuella ändringar som görs i avbildningens filsystem permanent.
docker rm elegant_ramanujan
Du kan inte ta bort en container som körs, men du kan tvinga en container att stoppas och tas bort med flaggan -f till docker rm
kommandot. Det här är ett snabbt sätt att stoppa och ta bort en container, men bör endast användas om appen i containern inte behöver utföra en graciös avstängning.
docker container rm -f elegant_ramanujan
Ta bort Docker-avbildningar
Du kan ta bort en avbildning från den lokala datorn med docker image rm
-kommandot. Ange avbildnings-ID för avbildningen som ska tas bort. I följande exempel tar du bort avbildningen för exempelwebbappen.
docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp
Du måste avsluta containrar som kör avbildningen innan du kan ta bort avbildningen. Om avbildningen fortfarande används av en container får du ett felmeddelande som liknar det som följer. I det här exemplet uppstår felet eftersom den youthful_heisenberg containern fortfarande använder avbildningen.
Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe