Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide Docker ile bir .NET uygulamasını kapsayıcıya almayı öğreneceksiniz. Kapsayıcılar sabit bir altyapı olmak, taşınabilir mimari sağlamak ve ölçeklenebilirliği etkinleştirmek gibi birçok özellik ve avantaja sahiptir. Görüntü yerel geliştirme ortamınız, özel bulutunuz veya genel bulutunuz için kapsayıcılar oluşturmak için kullanılabilir.
Bu öğreticide siz:
- Basit bir .NET uygulaması oluşturma ve yayımlama
- .NET için Dockerfile oluşturma ve yapılandırma
- Docker görüntüsü oluşturma
- Docker kapsayıcısı oluşturma ve çalıştırma
Bir .NET uygulaması için Docker kapsayıcı derlemesini ve dağıtım görevlerini keşfedersiniz.
Bahşiş
.NET uygulamanızı Docker veya Podman'a gerek kalmadan kapsayıcı olarak yayımlamak istiyorsanız bkz. dotnet publishile .NET uygulamasını kapsayıcıya alma.
Not
Bu öğretici ASP.NET Core uygulamaları için değildir. ASP.NET Core kullanıyorsanız, ASP.NET Core uygulamasını kapsayıcıya almayı öğrenmek için rehbere bakın.
Önkoşullar
Aşağıdaki önkoşulları yükleyin:
-
.NET 10+ SDK.
.NET yüklüyse, hangi SDK'yı kullandığınızı belirlemek içindotnet --infokomutunu kullanın.
-
.NET 9+ SDK.
.NET yüklüyse, hangi SDK'yı kullandığınızı belirlemek içindotnet --infokomutunu kullanın.
-
.NET 8+ SDK.
.NET yüklüyse, hangi SDK'yı kullandığınızı belirlemek içindotnet --infokomutunu kullanın.
- Docker Community Edition.
- Dockerfile ve .NET örnek uygulaması için geçici bir çalışma klasörü. Bu öğreticide, çalışma klasörü olarak docker-working adı kullanılır.
.NET uygulaması oluşturma
Docker kapsayıcısının çalıştığı bir .NET uygulamasına ihtiyacınız vardır. Terminalinizi açın, henüz yapmadıysanız bir çalışma klasörü oluşturun ve girin. çalışma klasöründe aşağıdaki komutu çalıştırarak Appadlı bir alt dizinde yeni bir proje oluşturun:
dotnet new console -o App -n DotNet.Docker
Klasör ağacınız aşağıdaki dizin yapısına benzer:
📁 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
dotnet new komutu, App adlı yeni bir klasör oluşturur ve bir "Merhaba Dünya" konsol uygulaması oluşturur. Şimdi dizinleri değiştirip terminal oturumunuzdan App klasörüne gidin. Uygulamayı başlatmak için dotnet run komutunu kullanın. Uygulama çalışır ve komutun altındaki Hello World! yazdırır:
cd App
dotnet run
Hello World!
Varsayılan şablon, terminale yazdıran ve hemen sonlandıran bir uygulama oluşturur. Bu öğreticide süresiz döngüler oluşturan bir uygulama kullanırsınız. Program.cs dosyasını bir metin düzenleyicisinde açın.
Bahşiş
Visual Studio Code kullanıyorsanız, önceki terminal oturumundan aşağıdaki komutu yazın:
code .
Bu komut, Visual Studio Code'da projeyi içeren App klasörünü açar.
Program.cs aşağıdaki C# kodu gibi görünmelidir:
Console.WriteLine("Hello World!");
dosyasını, sayıları her saniye sayan aşağıdaki kodla değiştirin:
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));
}
dosyayı kaydedin ve dotnet runile programı yeniden test edin. Bu uygulamanın süresiz olarak çalıştığını unutmayın. Durdurmak için Ctrl+C
dotnet run
Counter: 1
Counter: 2
Counter: 3
Counter: 4
^C
Komut satırındaki bir sayıyı uygulamaya geçirirseniz, sayıyı bu miktarla sınırlar ve sonra çıkar. Beşe kadar saymak için dotnet run -- 5 ile deneyin.
Önemli
--'dan sonraki herhangi bir parametre dotnet run komutuna aktarılmaz ve bunun yerine uygulamanıza aktarılır.
.NET uygulamasını yayımlama
Uygulamanın bir görüntü oluşturmaya uygun olması için derlenmesi gerekir.
dotnet publish komutu, uygulamayı derleyip yayımladıkça bunun için en uygun komut olur. Ayrıntılı referans için dotnet build ve dotnet publish komutları belgelerine bakın.
dotnet publish -c Release
Bahşiş
.NET uygulamanızı Docker'a gerek kalmadan kapsayıcı olarak yayımlamak istiyorsanız bkz. dotnet publishile .NET uygulamasını kapsayıcıya alma.
dotnet publish komutu uygulamanızı yayın klasörüne oluşturur. Çalışma klasöründen yayımlama klasörüne olan yol ./App/bin/Release/<TFM>/publish/ olmalıdır.
App klasöründen, DotNet.Docker.dll dosyasının oluşturulduğunu doğrulamak için yayımlama klasörünün dizin listesini alın.
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
Dockerfile oluşturma
Dockerfile dosyası, docker build komutu tarafından kapsayıcı görüntüsü oluşturmak için kullanılır. Bu dosya, uzantısı olmayan Dockerfile adlı bir metin dosyasıdır.
.csproj içeren dizinde Dockerfile adlı bir dosya oluşturun ve dosyayı bir metin düzenleyicisinde açın. Bu öğreticide ASP.NET Core çalışma zamanı görüntüsü (.NET çalışma zamanı görüntüsünü içerir) kullanılır ve .NET konsol uygulamasına karşılık gelir.
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"]
Not
ASP.NET Core çalışma zamanı görüntüsü burada kasıtlı olarak kullanılır, ancak bunun yerine mcr.microsoft.com/dotnet/runtime:9.0 görüntüsü kullanılabilir.
Önemli
Dockerfile görüntü etiketinden sonra güvenli karma algoritması (SHA) dahil olmak en iyi yöntemdir. Bu, görüntü üzerinde oynanmamasını ve görüntünün beklediğiniz görüntüyle aynı olmasını sağlar. SHA, görüntü için benzersiz bir tanımlayıcıdır. Daha fazla bilgi için bkz. Docker Belgeleri: Özet ile görüntü çekme.
Bahşiş
Bu Dockerfile, derlemeyi katmanlayarak ve yalnızca gerekli yapıtları bırakarak görüntünün son boyutunu iyileştirici çok aşamalı derlemeler kullanır. Daha fazla bilgi için bkz. Docker Docs: çok aşamalı yapılandırmalar.
FROM anahtar sözcüğü tam nitelikli bir Docker kapsayıcı görüntüsü adı gerektirir. Microsoft Container Registry (MCR, mcr.microsoft.com), genel olarak erişilebilen kapsayıcıları barındıran bir Docker Hub dağıtımıdır.
dotnet segmenti kapsayıcı deposudur, sdk veya aspnet kesimi ise kapsayıcı görüntüsü adıdır. Görüntü, sürüm oluşturma için kullanılan 9.0ile etiketlenmiş. Bu nedenle, mcr.microsoft.com/dotnet/aspnet:9.0 .NET 9.0 çalışma zamanıdır. SDK'nız tarafından hedeflenen çalışma zamanıyla eşleşen çalışma zamanı sürümünü çektiğinizden emin olun. Örneğin, önceki bölümde oluşturulan uygulama .NET 9.0 SDK'sını kullandı ve Dockerfile başvuruda bulunan temel görüntü 9.0ile etiketlendi.
Önemli
Windows tabanlı kapsayıcı görüntülerini kullanırken, yalnızca 9.0ötesinde görüntü etiketini belirtmeniz gerekir; örneğin, mcr.microsoft.com/dotnet/aspnet:9.0-nanoserver-1809yerine mcr.microsoft.com/dotnet/aspnet:9.0. Nano Sunucu mu yoksa Windows Server Core mu kullandığınıza ve bu işletim sisteminin hangi sürümünü kullandığınıza bağlı olarak bir görüntü adı seçin. .NET'in Docker Hub sayfası'de, desteklenen tüm etiketlerin tam listesini bulabilirsiniz.
Dockerfile dosyasını kaydedin. Çalışma klasörünün dizin yapısı aşağıdaki gibi görünmelidir. Makalede yer kazanmak için daha ayrıntılı dosya ve klasörlerden bazıları atlanmıştır:
📁 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
└──...
ENTRYPOINT yönergesi dotnetDotNet.Docker.dlliçin konak olarak ayarlar. Ancak, bunun yerine ENTRYPOINT uygulama yürütülebilir dosyasının kendisi olarak tanımlamak ve uygulama konağı olarak işletim sistemini kullanmak mümkündür:
ENTRYPOINT ["./DotNet.Docker"]
Bu, uygulamanın dotnetolmadan doğrudan yürütülmesine neden olur ve bunun yerine uygulama konağına ve temel işletim sistemine dayanır. Platformlar arası ikili dosyaları yayımlama hakkında daha fazla bilgi için bkz. Platformlar arası DLL dağıtımı.
Kapsayıcıyı oluşturmak için terminalinizde aşağıdaki komutu çalıştırın:
docker build -t counter-image -f Dockerfile .
Docker, Dockerfileiçindeki her satırı işler.
. komutundaki docker build görüntünün derleme bağlamını ayarlar.
-f anahtarı, Dockerfile yoludur. Bu komut, görüntüyü oluşturur ve bu görüntüyü işaret eden "counter-image" adlı lokal bir depo oluşturur. Bu komut tamamlandıktan sonra yüklü görüntülerin listesini görmek için docker images çalıştırın:
REPOSITORY TAG IMAGE ID CREATED SIZE
counter-image latest 1c1f1433e51d 32 seconds ago 223MB
counter-image deposu görüntünün adıdır. Ayrıca, görüntü etiketi, görüntü tanımlayıcısı, boyutu ve oluşturulduğu zaman çıktının bir parçasıdır. Dockerfile 'ın son adımları, uygulamayı çalıştırmak için görüntüden bir kapsayıcı oluşturmak, yayımlanan uygulamayı kapsayıcıya kopyalamak ve giriş noktasını tanımlamaktır.
FROM mcr.microsoft.com/dotnet/aspnet:9.0
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
FROM komutu, kullanılacak temel görüntüyü ve etiketi belirtir.
WORKDIR komutu, kapsayıcı içindeki geçerli dizini Appolarak değiştirir.
COPY komutu Docker'a belirtilen kaynak dizini hedef klasöre kopyalamasını söyler. Bu örnekte, katmanındaki build içeriği App/outadlı klasöre çıktı alınır, bu nedenle kopyalanacak kaynaktır.
App/out dizininde yayımlanan tüm içerikler geçerli çalışma dizinine (Uygulama) kopyalanır.
sonraki komut ENTRYPOINTDocker'a kapsayıcıyı yürütülebilir dosya olarak çalışacak şekilde yapılandırmasını söyler. Kapsayıcı başlatıldığında, ENTRYPOINT komutu çalışır. Bu komut sona erdiğinde kapsayıcı otomatik olarak durur.
Bahşiş
.NET 8'in öncesinde, salt okunur olarak çalışacak şekilde yapılandırılmış kapsayıcılar Failed to create CoreCLR, HRESULT: 0x8007000Eile başarısız olabilir. Bu sorunu gidermek için DOTNET_EnableDiagnostics olarak bir 0 ortam değişkeni belirtin (ENTRYPOINT adımından hemen önce):
ENV DOTNET_EnableDiagnostics=0
Çeşitli .NET ortam değişkenleri hakkında daha fazla bilgi için bkz..NET ortam değişkenlerini
Kapsayıcı oluşturma
Artık uygulamanızı içeren bir görüntünüz olduğuna göre bir kapsayıcı oluşturabilirsiniz. Kapsayıcıyı iki şekilde oluşturabilirsiniz. İlk olarak yeni bir durdurulmuş kapsayıcı oluşturun.
docker create --name core-counter counter-image
Bu docker create komutu, sayaç görüntüsü görüntüsünü temel alan bir kapsayıcı oluşturur.
docker create komutunun çıktısı kapsayıcının CONTAINER ID gösterir (tanımlayıcınız farklı olacaktır):
d0be06126f7db6dd1cee369d911262a353c9b7fb4829a0c11b4b2eb7b2d429cf
Tüm kapsayıcılarının
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0be06126f7d counter-image "dotnet DotNet.Docke…" 12 seconds ago Created core-counter
Kapsayıcıyı yönetme
Kapsayıcı, core-counterbelirli bir ad ile oluşturulmuştur. Bu ad kapsayıcıyı yönetmek için kullanılır. Aşağıdaki örnek, kapsayıcıyı başlatmak için docker start komutunu kullanır ve ardından docker ps komutunu kullanarak yalnızca çalışan kapsayıcıları gösterir:
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
Benzer şekilde, docker stop komutu kapsayıcıyı durdurur. Aşağıdaki örnek, kapsayıcıyı durdurmak için docker stop komutunu kullanır ve ardından hiçbir kapsayıcının çalışmadığını göstermek için docker ps komutunu kullanır:
docker stop core-counter
core-counter
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Kapsayıcıya bağlanma
Bir kapsayıcı çalıştırıldıktan sonra, çıkışı görmek için kapsayıcıya bağlanabilirsiniz. Kapsayıcıyı başlatmak ve çıkış akışına göz atmak için docker start ve docker attach komutlarını kullanın. Bu örnekte, çalışan kapsayıcıdan çıkmak için Ctrl+C tuş kombinasyonu kullanılır. Bu tuş vuruşu, aksi belirtilmedikçe kapsayıcıdaki işlemi sona erdirerek kapsayıcıyı durdurur.
--sig-proxy=false parametresi, Ctrl+C kapsayıcıdaki işlemi durdurmamasını sağlar.
Konteynerden ayırdıktan sonra, hala çalıştığını ve saymakta olduğunu doğrulamak için tekrar bağlanın.
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
Kapsayıcıyı silme
Bu makale için hiçbir şey yapmayan kapsayıcıların kalmasını istemezsiniz. Daha önce oluşturduğunuz kapsayıcıyı silin. Konteyner çalışıyorsa durdurun.
docker stop core-counter
Aşağıdaki örnekte tüm kapsayıcılar listelanmaktadır. Ardından kapsayıcıyı silmek için docker rm komutunu kullanır ve çalışan kapsayıcılar için ikinci kez denetler.
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
Tek çalıştırma
Docker, kapsayıcıyı tek bir komut olarak oluşturmak ve çalıştırmak için docker run komutu sağlar. Bu komut, docker create çalıştırma ve ardından docker startgereksinimini ortadan kaldırır. Bu komutu, kapsayıcı durduğunda kapsayıcıyı otomatik olarak silmek için de ayarlayabilirsiniz. Örneğin, iki işlemi gerçekleştirmek için docker run -it --rm kullanın: öncelikle, kapsayıcıya bağlanmak için şu anki terminali otomatik olarak kullanın ve kapsayıcı bittiğinde kaldırın.
docker run -it --rm counter-image
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
^C
Kapsayıcı ayrıca parametreleri .NET uygulamasının yürütülmesine geçirir. .NET uygulamasına yalnızca üçe kadar saymasını bildirmek için 3'ü geçirin.
docker run -it --rm counter-image 3
Counter: 1
Counter: 2
Counter: 3
docker run -itile Ctrl+C komutu kapsayıcıda çalışan işlemi durdurur ve bu da kapsayıcıyı durdurur.
--rm parametresi sağlandığından, işlem durdurulduğunda kapsayıcı otomatik olarak silinir. Var olmadığını doğrulayın:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ENTRYPOINT'i değiştir
docker run komutu, ENTRYPOINT komutunu değiştirmenize ve yalnızca bu kapsayıcı için başka bir şey çalıştırmanıza da olanak tanır. Örneğin, bash veya cmd.exeçalıştırmak için aşağıdaki komutu kullanın. Komutu gerektiği gibi düzenleyin.
Bu örnekte, ENTRYPOINTcmd.exeolarak değiştirilir.
işlemi sonlandırmak ve kapsayıcıyı durdurmak için Ctrl+C tuşlarına basılır.
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
Not
Bu örnek yalnızca Windows kapsayıcılarında çalışır. Linux kapsayıcılarında cmd.exebulunmamaktadır.
Temel komutlar
Docker'da kapsayıcıları ve görüntüleri oluşturan, yöneten ve bunlarla etkileşim kuran birçok farklı komut vardır. Bu Docker komutları kapsayıcılarınızı yönetmek için gereklidir:
Kaynakları temizleme
Bu eğitim sırasında kapsayıcılar ve görüntüler oluşturdunuz. İstersen, bu kaynakları silin. Aşağıdaki komutları kullanarak
Tüm kapsayıcıları listeleme
docker ps -aİsmiyle çalışan konteynerleri durdurun.
docker stop core-counterKapsayıcıyı silme
docker rm core-counter
Ardından, makinenizde artık istemediğiniz tüm görüntüleri silin. Dockerfile tarafından oluşturulan görüntüyü silin ve ardından Dockerfile temel aldığı .NET görüntüsünü silin. IMAGE ID veya REPOSITORY:TAG biçimlendirilmiş dizeyi kullanabilirsiniz.
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
Yüklü görüntülerin listesini görmek için docker images komutunu kullanın.
Bahşiş
Görüntü dosyaları büyük olabilir. Genellikle uygulamanızı test ederken ve geliştirirken oluşturduğunuz geçici kapsayıcıları kaldırırsınız. Bu çalışma zamanını temel alan başka görüntüler derlemeyi planlıyorsanız, genellikle temel görüntüleri çalışma zamanı yüklü olarak tutarsınız.
Sonraki adımlar
- dotnet publish ile bir .NET uygulamasını containerize etme
- .NET kapsayıcı görüntüleri
- Bir ASP.NET Core uygulamasını kapsayıcıya alın
- Kapsayıcıları destekleyen Azure hizmetlerini
- Dockerfile komutları
- Visual Studio için
Kapsayıcı Araçları