Asp.Net Core Dockerize

Hakan Karabulut
Devops Türkiye☁️ 🐧 🐳 ☸️
4 min readApr 19, 2020

Merhaba, bu makalede bir dotnet core uygulamasını docker ile ayağa kaldırma sürecinden bahsedeceğim.

Docker ile ilgili daha fazla bilgilendirme isterseniz yazmış olduğum Docker Temelleri makaleme göz atabilirsiniz.

Öncelikli olarak bir dotnet projesi kurulumu yapmamız gerekiyor. Bunun için terminalden çalışma klasörü yaratarak işe başlıyorum.

➜ mkdir dotnet-core-dockerize

➜ cd dotnet-core-dockerize

➜ dotnet-core-dockerize dotnet new sln — name DotNetCoreDockerize

➜ dotnet-core-dockerize dotnet new webapi — name Api

➜ dotnet-core-dockerize dotnet sln add {your_awesome_path}/dotnet-core-dockerize/Api

➜ dotnet-core-dockerize cd Api

➜ touch Dockerfile

şimdi Dockerfile içerisini doldurabiliriz.

FROM mcr.microsoft.com/dotnet/core/sdk:3.1
WORKDIR /app
COPY . .
RUN dotnet restore
RUN dotnet publish Api.csproj -c Release -o out
WORKDIR out
ENV ASPNETCORE_URLS="https://*:9000"
ENTRYPOINT ["dotnet","Api.dll"]

Şimdi Dockerfile içinde adım adım yazmış olduğumuz komutları inceleyelim;

FROM : Resmi dotnet docker image’ını çekiyoruz.

WORKDIR /app : Çekmiş olduğumuz image ile çalışma klasörü belirliyoruz.

COPY . . : İçindeki ilk “.” Dockerfile’ın bulunduğu klasörün içindeki tüm klasör ve dosyaları temsil eder. İkinci “.” ise /app ile belirttiğimiz çalışma klasörümüzü ifade eder.

RUN dotnet restore : Projeyi güncel hale getiriyoruz.

RUN dotnet publish Api.csproj -c Release -o out : dotnet publish ile hangi projeyi publish edeceğimizi ifade ediyoruz, ProjenizinAdı.csporj ile proje adını belirtmek gerekiyor. -c Release ile hangi modda publish edeceğimizi bildiriyoruz. -o ile nereye publish edeceğimizi ifade ediyoruz. Burada dikkat edilmesi gereken kısım /out yazıldığında /app içinde bir klasör oluşturmaz. /app içinde klasörü oluşturmak için out yazmalıyız. Bu klasör içine publish edilmiş dosyalar atanır.

WORKDIR /out : Artık çalışma klasörümüz publish edilmiş dosyaların klasörlerin bulunduğu out olduğunu belirtiyoruz.

ENV ASPNETCORE_URLS : Container içerisinden projemize erişebilmek için kullanmamız gerekmektedir. Burada “https://*” * kullanmamızın sebebi container içinde hangi IP adresi ile çalıştığını bilmediğimiz içindir. Vermiş olduğumuz port numarası ile erişim sağlıyoruz. Kullanımda olmayan herhangi bir port numarası verebilirsiniz.

ENTRYPOINT : Dotnet projemizin çalıştığı .dll uzantısına erişim içindir.

Dockerfile oluştururken bir ide üzerinden yapmadığımız için dotnet projemizde ufak bir işlem yapmamız gerekmektedir. Properties klasörü içindeki launchSettings.json içerisine aşağıdaki ayarları eklemeliyiz.

"Docker":{
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
"publishAllPorts":true
}

Docker ile önce image’larımızı oluşturalım. Bunun için önce projenin bulunduğu klasöre girmemiz lazım, sonrasında;

➜ docker build -t dotnetapp:v1 .

dotnetapp projeye verdiğimiz isim, v1 tag, Dockerfile projenin içinde olduğu için “.” ile yolunu belirtiyoruz.

Docker image’ları terminale docker images yazdığımızda görüntüleyebiliriz.

Şimdi projemizi 5000 portundan ayağa kaldıralım.

➜ docker run -p 5000:9000 dotnetapp:v1 — name mycontainer1

Artık localhost:5000 portundan uygulamamıza erişim sağlayabiliriz.

MultiStage Build

MultiStage durumu tek bir base image yerine birden fazla base image kullanma durumudur.

Örneğimizde Sdk image kullanma nedenimiz Dockerfile içinde dotnet cli komutlarını kullanmak içindir. Sdk image kullanıldığı durumda Docker image boyutu daha fazla olacaktır. İmage boyutu ne kadar büyükse container ayağa kaldırma, taşıma vb işlemler daha maliyetli olacaktır. Bu yüzden Dockerfile içerisini aşağıdaki gibi düzenliyoruz;

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as build
WORKDIR /app
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish Api.csproj -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app/out .
ENV ASPNETCORE_URLS="https://*:9000"
ENTRYPOINT ["dotnet","Api.dll"]

➜ docker build -t dotnetapp:v2 .

İmage boyutları arasındaki fark

.dockerignore

Docker imager oluşturulduğu esnada image içinde oluşturulmasını istemediğiniz klasör ya da dosyaları buraya ekleyebilirsiniz. Terminalden proje klasörüne geldikten sonra aşağıdaki kodu yazarak oluşturabilirsiniz.

➜ touch .dockerignore

**/bin/
**/obj/
**/Dockerfile*
**/.dockerignore*

--

--