Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ebben az oktatóanyagban megtudhatja, hogyan tárolózhat egy .NET-alkalmazást a Dockerrel. A tárolók számos funkcióval és előnnyel rendelkeznek, például nem módosítható infrastruktúra, hordozható architektúrát biztosítanak, és lehetővé teszik a méretezhetőséget. A rendszerkép segítségével tárolókat hozhat létre a helyi fejlesztési környezethez, a magánfelhőhöz vagy a nyilvános felhőhöz.
Ebben az oktatóanyagban ön:
- Egyszerű .NET-alkalmazás létrehozása és közzététele
- Dockerfile létrehozása és konfigurálása a .NET-hez
- Docker-rendszerkép létrehozása
- Docker-tároló létrehozása és futtatása
Megismerheti a Docker-tárolók .NET-alkalmazásokhoz készült buildelési és üzembe helyezési feladatait. A Docker platform a Docker-engine használatával gyorsan készíthet és csomagolhat alkalmazásokat Docker image. Ezek a képek Dockerfile formátumban vannak megírva, és rétegzett tárolóban futtathatók.
Borravaló
Ha érdekli, hogy a .NET-alkalmazását konténerként tegye közzé anélkül, hogy a Docker-t vagy a Podman-t használná, tekintse meg a A .NET-alkalmazás konténerbe helyezése a dotnet publish paranccsalcímű részt.
Jegyzet
Ez a oktatóanyag nem az ASP.NET Core alkalmazások számára készült. Ha az ASP.NET Core-t használja, tekintse meg az oktatóanyagot arról, hogyan konténerizálhat egy ASP.NET Core alkalmazást.
Előfeltételek
Telepítse a következő előfeltételeket:
-
.NET 10+ SDK.
Ha telepítve van a .NET, adotnet --infoparanccsal állapítsa meg, hogy melyik SDK-t használja.
-
.NET 9+ SDK.
Ha telepítve van a .NET, adotnet --infoparanccsal állapítsa meg, hogy melyik SDK-t használja.
-
.NET 8+ SDK.
Ha telepítve van a .NET, adotnet --infoparanccsal állapítsa meg, hogy melyik SDK-t használja.
- Docker Community Edition.
- Ideiglenes munkamappa a Dockerfile és .NET-példaalkalmazáshoz. Ebben az oktatóanyagban a docker-working
nevet használjuk munkamappaként.
.NET-alkalmazás létrehozása
Szüksége van egy .NET-alkalmazásra, amelyet a Docker-tároló futtat. Nyissa meg a terminált, hozzon létre egy munkamappát, ha még nem tette meg, és írja be. A munkamappában futtassa a következő parancsot egy új projekt létrehozásához egy Appnevű alkönyvtárban:
dotnet new console -o App -n DotNet.Docker
A mappafa a következő könyvtárszerkezethez hasonlóan néz ki:
📁 docker-working
└──📂 App
├──DotNet.Docker.csproj
├──Program.cs
└──📂 obj
├── DotNet.Docker.csproj.nuget.dgspec.json
├── DotNet.Docker.csproj.nuget.g.props
├── DotNet.Docker.csproj.nuget.g.targets
├── project.assets.json
└── project.nuget.cache
A dotnet new parancs létrehoz egy új mappát App néven, és létrehoz egy "Hello World" konzolalkalmazást. Most módosíthatja a könyvtárakat, és a terminálmunkamenetből navigálhat a Alkalmazás mappába. Az alkalmazás elindításához használja a dotnet run parancsot. Az alkalmazás fut, és kinyomtatja a Hello World!-at a parancs alatt.
cd App
dotnet run
Hello World!
Az alapértelmezett sablon létrehoz egy alkalmazást, amely a terminálon nyomtat, majd azonnal leáll. Ebben az oktatóanyagban egy végtelenül ismétlődő alkalmazást használ. Nyissa meg a Program.cs fájlt egy szövegszerkesztőben.
Borravaló
Ha Visual Studio Code-ot használ, az előző terminálmunkamenetből írja be a következő parancsot:
code .
Ez a parancs megnyitja az App mappát, amely a Visual Studio Code-ban tartalmazza a projektet.
A Program.cs a következő C#-kódhoz hasonlóan kell kinéznie:
Console.WriteLine("Hello World!");
Cserélje le a fájlt a következő kódra, amely másodpercenként számokat számol:
var counter = 0;
var max = args.Length is not 0 ? Convert.ToInt32(args[0]) : -1;
while (max is -1 || counter < max)
{
Console.WriteLine($"Counter: {++counter}");
await Task.Delay(TimeSpan.FromMilliseconds(1_000));
}
Mentsd a fájlt, és teszteld újra a programot a dotnet runsegítségével. Ne feledje, hogy ez az alkalmazás határozatlan ideig fut. Használja a mégse parancsot a Ctrl+C kombinációja leállítására. Vegye figyelembe a következő példakimenetet:
dotnet run
Counter: 1
Counter: 2
Counter: 3
Counter: 4
^C
Ha egy számot ad át a parancssorban az alkalmazásnak, az erre az összegre korlátozza a számot, majd kilép. Próbálja ki a dotnet run -- 5 kóddal, hogy ötig számoljon.
Fontos
Az -- utáni paraméterek nem lesznek átadva a dotnet run parancsnak, hanem az alkalmazásnak lesznek átadva.
.NET-alkalmazás közzététele
Ahhoz, hogy az alkalmazás alkalmas legyen egy kép létrehozására, össze kell állítania. Ehhez a dotnet publish parancs a legalkalmasabb, mivel létrehozza és közzéteszi az alkalmazást. Részletesebb információért lásd a dotnet build és dotnet publish parancsok dokumentációját.
dotnet publish -c Release
Borravaló
Ha a .NET-alkalmazását Docker nélkül szeretné konténerként közzétenni, olvassa el a „Konténerizáljon .NET-alkalmazást a dotnet publish segítségével”című témakört.
A dotnet publish utasítás az alkalmazást a publikálási mappába fordítja. Az elérési út a munkamappából a közzétételi mappához: ./App/bin/Release/<TFM>/publish/:
Az Alkalmazás mappából szerezze be a közzétételi mappa könyvtárlistát annak ellenőrzéséhez, hogy a DotNet.Docker.dll fájl létrejött-e.
dir .\bin\Release\net9.0\publish\
Directory: C:\Users\default\docker-working\App\bin\Release\net9.0\publish
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 1/6/2025 10:11 AM 431 DotNet.Docker.deps.json
-a---- 1/6/2025 10:11 AM 6144 DotNet.Docker.dll
-a---- 1/6/2025 10:11 AM 145408 DotNet.Docker.exe
-a---- 1/6/2025 10:11 AM 11716 DotNet.Docker.pdb
-a---- 1/6/2025 10:11 AM 340 DotNet.Docker.runtimeconfig.json
A Dockerfile létrehozása
A Dockerfile fájlt a docker build parancs használja tárolólemezkép létrehozásához. Ez a fájl Dockerfile nevű szövegfájl, amely nem rendelkezik kiterjesztéssel.
Hozzon létre egy Dockerfile nevű fájlt a .csproj tartalmazó könyvtárban, és nyissa meg egy szövegszerkesztőben. Ez az oktatóanyag a ASP.NET Core futtatókörnyezeti rendszerképet használja (amely tartalmazza a .NET-futtatókörnyezet rendszerképét), és megfelel a .NET-konzolalkalmazásnak.
FROM mcr.microsoft.com/dotnet/sdk:9.0@sha256:3fcf6f1e809c0553f9feb222369f58749af314af6f063f389cbd2f913b4ad556 AS build
WORKDIR /App
# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:9.0@sha256:b4bea3a52a0a77317fa93c5bbdb076623f81e3e2f201078d89914da71318b5d8
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
Jegyzet
Itt szándékosan a ASP.NET Core futtatókörnyezeti rendszerképet használja a rendszer, bár ehelyett a mcr.microsoft.com/dotnet/runtime:9.0 rendszerkép használható.
Fontos
Ajánlott eljárás, ha egy Dockerfile képcímkéje után egy biztonságos kivonatoló algoritmust (SHA) is használ. Ez biztosítja, hogy a képet ne módosítsák, és hogy a kép megegyezzen a várttal. Az SHA a kép egyedi azonosítója. További információért lásd a Docker dokumentációt: Kép lekérése kivonat alapján.
Borravaló
Ez a Dockerfile többfázisú buildeket használ, amelyek optimalizálják a rendszerkép végső méretét a build rétegzésével, és csak a szükséges összetevőket hagyják meg. További információ: Docker Docs: többfázisú buildek.
A FROM kulcsszóhoz egy teljes mértékben minősített Docker-tároló lemezképének neve szükséges. A Microsoft Container Registry (MCR, mcr.microsoft.com) a Docker Hub szindikátusa, amely nyilvánosan elérhető tárolókat üzemeltet. A dotnet szegmens a tárolóadattár, míg a sdk vagy aspnet szegmens a tárolórendszerkép neve. A kép a verziószámozáshoz használt 9.0címkével van megjelölve. Így mcr.microsoft.com/dotnet/aspnet:9.0 a .NET 9.0 futtatókörnyezet. Győződjön meg arról, hogy az SDK által megcélzott futási környezettel egyező verziót tölti le. Az előző szakaszban létrehozott alkalmazás például a .NET 9.0 SDK-t használta, és a Dockerfile
Fontos
Windows-alapú tárolórendszerképek használatakor a rendszerképcímkét a 9.0túl kell megadnia, például mcr.microsoft.com/dotnet/aspnet:9.0-nanoserver-1809mcr.microsoft.com/dotnet/aspnet:9.0helyett. Válasszon egy képnevet attól függően, hogy a Nano Servert vagy a Windows Server Core-t használja-e, és hogy az operációs rendszer melyik verzióját használja. Az összes támogatott címke teljes listája megtalálható a .NET Docker Hub oldalán.
Mentse a Dockerfile fájlt. A munkamappa könyvtárszerkezetének az alábbihoz hasonlóan kell kinéznie. A mélyebb szintű fájlok és mappák némelyike ki van hagyva a hely megtakarítása érdekében a cikkben.
📁 docker-working
└──📂 App
├── Dockerfile
├── DotNet.Docker.csproj
├── Program.cs
├──📂 bin
│ └───📂 Release
│ └───📂 net9.0
│ ├───📂 publish
│ │ ├─── DotNet.Docker.deps.json
│ │ ├─── DotNet.Docker.dll
│ │ ├─── DotNet.Docker.exe
│ │ ├─── DotNet.Docker.pdb
│ │ └─── DotNet.Docker.runtimeconfig.json
│ ├─── DotNet.Docker.deps.json
│ ├─── DotNet.Docker.dll
│ ├─── DotNet.Docker.exe
│ ├─── DotNet.Docker.pdb
│ └─── DotNet.Docker.runtimeconfig.json
└──📁 obj
└──...
A ENTRYPOINT utasítás beállítja dotnet-et a DotNet.Docker.dllgazdagépeként. Azonban lehetséges, hogy a ENTRYPOINT az alkalmazás végrehajtható fájlként legyen definiálva, az operációs rendszerre támaszkodva, mint az alkalmazás gazdája.
ENTRYPOINT ["./DotNet.Docker"]
Ez azt eredményezi, hogy az alkalmazás közvetlenül, dotnetnélkül lesz végrehajtva, és ehelyett az alkalmazás gazdagépére és az alapul szolgáló operációs rendszerre támaszkodik. A platformfüggetlen bináris fájlok közzétételével kapcsolatos további információkért lásd a platformfüggetlen DLL üzembe helyezését ismertető témakört.
A tároló létrehozásához futtassa a következő parancsot a terminálból:
docker build -t counter-image -f Dockerfile .
A Docker a Dockerfileminden sorát feldolgozza. A . a docker build parancsban beállítja a rendszerkép építési környezetét. A -f kapcsoló a Dockerfileelérési útja. Ez a parancs létrehozza a képfájlt, és létrehoz egy helyi adattárat számlálókép, amely erre a képfájlra hivatkozik. A parancs befejeződése után futtassa a docker images a telepített képek listájának megtekintéséhez:
REPOSITORY TAG IMAGE ID CREATED SIZE
counter-image latest 1c1f1433e51d 32 seconds ago 223MB
A counter-image adattár a kép neve. Emellett a képcímke, a képazonosító, a méret és a létrehozásuk is a kimenet részét képezi. A Dockerfile utolsó lépéseként hozzon létre egy tárolót a rendszerképből, futtassa az alkalmazást, másolja a közzétett alkalmazást a tárolóba, és határozza meg a belépési pontot:
FROM mcr.microsoft.com/dotnet/aspnet:9.0
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
A FROM parancs megadja a használni kívánt alaprendszerképet és címkét. A WORKDIR parancs a tárolón belüli jelenlegi könyvtáratAlkalmazás.
A COPY parancs arra utasítja a Dockert, hogy másolja a megadott forráskönyvtárat egy célmappába. Ebben a példában a közzéteszi a tartalmakat a build rétegen, amelyeket a Alkalmazás/kinevű mappába kerülnek, így ez lesz a forrás, ahonnan másolni kell. A Alkalmazás/ki könyvtárban közzétett összes tartalom át lesz másolva az aktuális munkakönyvtárba (Alkalmazás).
A következő parancs, ENTRYPOINT, arra utasítja a Dockert, hogy konfigurálja a tárolót végrehajthatóként való futtatásra. A tároló indításakor a ENTRYPOINT parancs fut. Ha ez a parancs véget ér, a tároló automatikusan leáll.
Borravaló
A .NET 8 előtt az írásvédett módú futtatásra konfigurált tárolók hibát okozhatnak Failed to create CoreCLR, HRESULT: 0x8007000E. A probléma megoldásához adjon meg egy DOTNET_EnableDiagnostics környezeti változót 0 ként (a ENTRYPOINT lépés előtt):
ENV DOTNET_EnableDiagnostics=0
A különböző .NET környezeti változókkal kapcsolatos további információkért lásd .NET környezeti változókat.
Tároló létrehozása
Most, hogy már rendelkezik az alkalmazást tartalmazó képpel, létrehozhat egy tárolót. Tárolót kétféleképpen hozhat létre. Először hozzon létre egy leállított új tárolót.
docker create --name core-counter counter-image
Ez a docker create parancs létrehoz egy tárolót a ellenképkép kép alapján. A
d0be06126f7db6dd1cee369d911262a353c9b7fb4829a0c11b4b2eb7b2d429cf
Az összes tároló
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0be06126f7d counter-image "dotnet DotNet.Docke…" 12 seconds ago Created core-counter
A tároló kezelése
A core-counternevű tároló lett létrehozva. Ez a név a tároló kezelésére szolgál. Az alábbi példa a docker start paranccsal indítja el a tárolót, majd a docker ps paranccsal csak a futó tárolókat jeleníti meg:
docker start core-counter
core-counter
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf01364df453 counter-image "dotnet DotNet.Docke…" 53 seconds ago Up 10 seconds core-counter
Hasonlóképpen, a docker stop parancs leállítja a tárolót. Az alábbi példa a docker stop paranccsal állítja le a tárolót, majd a docker ps paranccsal mutatja, hogy nincsenek tárolók:
docker stop core-counter
core-counter
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Csatlakozás tárolóhoz
A tároló futtatása után csatlakozhat hozzá a kimenet megtekintéséhez. A docker start és docker attach parancsokkal indítsa el a tárolót, és nézze meg a kimeneti adatfolyamot. Ebben a példában a Ctrl+C billentyűkombinációval választja el a futó tárolót. Ez a billentyűleütés a tárolóban befejezi a folyamatot, hacsak nincs másként megadva, ami leállítja a tárolót. A
Miután leválasztotta a tárolót, csatlakozzon újra, hogy ellenőrizze, még mindig fut-e és számol-e.
docker start core-counter
core-counter
docker attach --sig-proxy=false core-counter
Counter: 7
Counter: 8
Counter: 9
^C
docker attach --sig-proxy=false core-counter
Counter: 17
Counter: 18
Counter: 19
^C
Tároló törlése
Ehhez a cikkhez nem akar olyan tárolókat, amelyek nem csinálnak semmit. Törölje a korábban létrehozott tárolót. Ha a tároló fut, állítsa le.
docker stop core-counter
Az alábbi példa az összes tárolót felsorolja. Ezután a docker rm paranccsal törli a tárolót, majd másodszor ellenőrzi a futó tárolókat.
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f6424a7ddce counter-image "dotnet DotNet.Dock…" 7 minutes ago Exited (143) 20 seconds ago core-counter
docker rm core-counter
core-counter
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Egyszeri futtatás
A Docker biztosítja a docker run parancsot a tároló egyetlen parancsként való létrehozásához és futtatásához. Ez a parancs szükségtelenné teszi a docker create, majd docker startfuttatását. Ezt a parancsot úgy is beállíthatja, hogy a tároló leállásakor automatikusan törölje a tárolót. Például a docker run -it --rm használatával két dolgot hajthat végre, először automatikusan használja az aktuális terminált a tárolóhoz való csatlakozáshoz, majd amikor a tároló befejeződik, távolítsa el:
docker run -it --rm counter-image
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
^C
A tároló a paramétereket is átadja a .NET-alkalmazás végrehajtásához. Ha azt szeretné, hogy a .NET-alkalmazás csak háromra számoljon, adja meg a 3-at.
docker run -it --rm counter-image 3
Counter: 1
Counter: 2
Counter: 3
A --rm paraméter meg lett adva, a tároló automatikusan törlődik a folyamat leállításakor. Ellenőrizze, hogy nem létezik-e:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Az ENTRYPOINT módosítása
A docker run parancs lehetővé teszi a ENTRYPOINT parancsának módosítását, és más parancs futtatását is lehetővé teszi, de csak az adott tárolóhoz. A következő paranccsal például futtathatja bash vagy cmd.exe. Szükség szerint szerkessze a parancsot.
Ebben a példában a ENTRYPOINTcmd.exelesz.
Ctrl+C lenyomásával befejezi a folyamatot és leállítja a tárolót.
docker run -it --rm --entrypoint "cmd.exe" counter-image
Microsoft Windows [Version 10.0.17763.379]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\>dir
Volume in drive C has no label.
Volume Serial Number is 3005-1E84
Directory of C:\
04/09/2019 08:46 AM <DIR> app
03/07/2019 10:25 AM 5,510 License.txt
04/02/2019 01:35 PM <DIR> Program Files
04/09/2019 01:06 PM <DIR> Users
04/02/2019 01:35 PM <DIR> Windows
1 File(s) 5,510 bytes
4 Dir(s) 21,246,517,248 bytes free
C:\>^C
Jegyzet
Ez a példa csak Windows-tárolókon működik. A Linux-konténerek nem rendelkeznek cmd.exe-nal.
Alapvető parancsok
A Docker számos különböző parancsot tartalmaz, amelyek tárolókat és képfájlokat hoznak létre, kezelnek és azokkal dolgoznak. Ezek a Docker-parancsok nélkülözhetetlenek a tárolók kezeléséhez:
- docker build
- Docker futtatása
- docker ps
- docker stop
- docker rm
- docker rmi
- Docker-rendszerkép
Erőforrások törlése
Ebben az oktatóanyagban tárolókat és képfájlokat hozott létre. Ha szeretné, törölje ezeket az erőforrásokat. Az alábbi parancsokkal
Az összes tároló listázása
docker ps -aÁllítsa le a nevük alapján futó tárolókat.
docker stop core-counterA tároló törlése
docker rm core-counter
Ezután törölje azokat a képeket, amelyeket már nem szeretne a gépén. Törölje a Dockerfile által létrehozott képet, majd törölje azt a .NET-lemezképet, amelyen Dockerfile alapult. Használhatja a képazonosító vagy a REPOSITORY:TAG formázott karakterláncot.
docker rmi counter-image:latest
docker rmi mcr.microsoft.com/dotnet/aspnet:10.0
docker rmi counter-image:latest
docker rmi mcr.microsoft.com/dotnet/aspnet:9.0
docker rmi counter-image:latest
docker rmi mcr.microsoft.com/dotnet/aspnet:8.0
A docker images paranccsal megtekintheti a telepített képek listáját.
Borravaló
A képfájlok nagy méretűek lehetnek. Általában eltávolítaná az alkalmazás tesztelése és fejlesztése során létrehozott ideiglenes tárolókat. Az alaprendszerképeket általában a futtatókörnyezettel együtt kell tárolnia, ha az adott futtatókörnyezet alapján más rendszerképeket szeretne készíteni.
Következő lépések
- .NET-alkalmazás tárolóba helyezése dotnet közzétételi
- .NET-tárolórendszerképek
- ASP.NET Core-alkalmazás tárolóba helyezése
- tárolókat támogató Azure-szolgáltatások
- Dockerfile-parancsok
- Konténer eszközök a Visual Studio-hoz