﻿
{"id":26586,"date":"2023-09-30T08:49:04","date_gmt":"2023-09-30T08:49:04","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26586"},"modified":"2023-09-30T08:49:04","modified_gmt":"2023-09-30T08:49:04","slug":"nette-built-in-container-destegi-net-uygulamalarini-dockerfile-dosyasi-olmaksizin-dockerize-etme","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/nette-built-in-container-destegi-net-uygulamalarini-dockerfile-dosyasi-olmaksizin-dockerize-etme\/","title":{"rendered":".NET&#8217;te Built-In Container Deste\u011fi &#8211; .NET Uygulamalar\u0131n\u0131 Dockerfile Dosyas\u0131 Olmaks\u0131z\u0131n Dockerize Etme"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde .NET 7 ve \u00fczeri s\u00fcr\u00fcmleri i\u00e7in gelmi\u015f olan Dockerfile dosyas\u0131na gerek duyulmaks\u0131z\u0131n uygulamay\u0131 dockerize etme \u00f6zelli\u011fini ele alacak ve biryandan da built-in container deste\u011fi hakk\u0131nda incelemede bulunuyor olaca\u011f\u0131z.<\/p>\n<p>Evet&#8230; Microsoft, .NET 7 SDK&#8217;sinden itibaren uygulamalar\u0131n dockerize edilebilmesi i\u00e7in ihtiya\u00e7 duyulan Dockerfile dosyas\u0131na olan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ortadan kald\u0131rarak tamamen yeni bir yakla\u015f\u0131m sergilemekte ve b\u00f6ylece uygulamalar\u0131n devops s\u00fcre\u00e7lerinde ekstradan bak\u0131m gerektiren bir dosyas\u0131n\u0131n varl\u0131\u011f\u0131ndan s\u00fcreci t\u00f6rp\u00fcleyerek \u00e7al\u0131\u015fma yo\u011funlu\u011funu sadele\u015ftirmektedir. Haliyle bu yakla\u015f\u0131m sayesinde uygulaman\u0131n dockerize edilme s\u00fcreci daha da basitle\u015ftirilerek, kolay hale getirilmi\u015f olmaktad\u0131r.<\/p>\n<p>Bu yakla\u015f\u0131m\u0131n temel fikri; geli\u015ftirilen yaz\u0131l\u0131m uygulamalar\u0131n\u0131n pek \u00e7o\u011funda, geli\u015ftiricilerin, uygulaman\u0131n dockerize edilebilmesi i\u00e7in uzun uzad\u0131ya Dockerfile dosyas\u0131yla ha\u015f\u0131r ne\u015fir olmas\u0131na ve buna b\u00fcy\u00fck enerji sarf etmesi durumuna dayanmaktad\u0131r. Bu duruma kar\u015f\u0131n .NET 7&#8217;den sonra, built-in olarak gelen docker image olu\u015fturabilme ve deploy edebilme yeteneklerini .NET CLI arac\u0131 sayesinde ger\u00e7ekle\u015ftirebilmekte ve s\u00fcreci daha da efektif bir \u015fekilde y\u00f6netilebilir k\u0131lmaktay\u0131z.<\/p>\n<p>\u015eimdi bizler bir .NET uygulamas\u0131n\u0131n Dockerfile dosyas\u0131yla nas\u0131l dockerize edildi\u011fini hat\u0131rlayarak, paralelinde Dockerfile dosyas\u0131 olmaks\u0131z\u0131n bu i\u015flemin nas\u0131l yap\u0131labilece\u011fini ele alacak ve mukayeseli bir \u015fekilde de\u011ferlendirmede bulunuyor olaca\u011f\u0131z. O halde buyurun ba\u015flayal\u0131m&#8230;<\/p>\n<p>\u0130lk olarak a\u015fa\u011f\u0131daki endpoint&#8217;e sahip bir Asp.NET Core WEB API uygulamas\u0131 geli\u015ftirelim;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/&quot;, () =&gt; &quot;Merhaba D\u00fcnya&quot;);\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan bu uygulamay\u0131 dockerize edebilmek i\u00e7in a\u015fa\u011f\u0131daki i\u00e7eri\u011fe sahip bir Dockerfile dosyas\u0131 olu\u015ftural\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nFROM mcr.microsoft.com\/dotnet\/sdk:8.0 as build\r\nWORKDIR \/src\r\nCOPY *.csproj .\r\nRUN dotnet restore\r\nCOPY . .\r\nRUN dotnet publish -c Release -o \/publish\r\n\r\nFROM mcr.microsoft.com\/dotnet\/aspnet:8.0 as runtime\r\nWORKDIR \/publish\r\nCOPY --from=build \/publish .\r\nENV ASPNETCORE_URLS=http:\/\/+:5000\r\nEXPOSE 5000\r\nENTRYPOINT &#x5B;&quot;dotnet&quot;, &quot;Docker.Example.dll&quot;]\r\n<\/pre>\n<\/div>\n<p>Art\u0131k Dockerfile dosyas\u0131 haz\u0131r oldu\u011funa g\u00f6re <strong style=\"color:green;\"><code>docker build -t docker-example .<\/code><\/strong> talimat\u0131 e\u015fli\u011finde bir image olu\u015ftural\u0131m.<\/p>\n<p>Bu i\u015flem sonras\u0131nda da art\u0131k olu\u015fturulmu\u015f olan bu image&#8217;dan <strong style=\"color:green;\"><code>docker run -p 5000:5000 --name docker-example-container docker-example<\/code><\/strong> talimat\u0131 e\u015fli\u011finde de bir container olu\u015ftural\u0131m.<\/p>\n<p>Vee <a href=\"http:\/\/localhost:5000\/\" rel=\"noopener\" target=\"_blank\">http:\/\/localhost:5000\/<\/a> adresine istekte bulunal\u0131m.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NETte-Built-In-Container-Destegi-.NET-Uygulamalarini-Dockerfile-Dosyasi-Olmaksizin-Dockerize-Etme.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NETte-Built-In-Container-Destegi-.NET-Uygulamalarini-Dockerfile-Dosyasi-Olmaksizin-Dockerize-Etme.png\" alt=\".NET&#039;te Built-In Container Deste\u011fi - .NET Uygulamalar\u0131n\u0131 Dockerfile Dosyas\u0131 Olmaks\u0131z\u0131n Dockerize Etme\" width=\"244\" height=\"72\" class=\"aligncenter size-full wp-image-26593\" \/><\/a>\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<blockquote><p><em>Docker teknolojisi, Dockerfile dosyas\u0131 ve container yap\u0131land\u0131rmas\u0131yla ilgili detayl\u0131 bilgi edinmek istiyorsan\u0131z <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-core-docker-yazi-dizisi\/\" rel=\"noopener\" target=\"_blank\">.NET Core &#038; Docker Yaz\u0131 Dizisi<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131 serisine g\u00f6z atabilirsiniz.<\/em><\/p><\/blockquote>\n<p><strong>Peki hoca, burada zor ve kar\u0131\u015f\u0131k olan ne ki?<\/strong> diye sordu\u011funuzu duyar gibiyim&#8230; Evet, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere zor olan bir durum yok. En sade haliyle bir .NET uygulamas\u0131n\u0131 dockerize ederken bu yolu tercih ediyoruz. Amma velakin uygulaman\u0131n gereksinimleri ve projenin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a bu Dockerfile dosyas\u0131n\u0131n i\u00e7eri\u011fi de artacakt\u0131r. Haliyle ister istemez bu dosya a\u00e7\u0131s\u0131ndan bir bak\u0131m maliyeti s\u00f6z konusu olacakt\u0131r. \u0130\u015fte bu tarz durumlara kar\u015f\u0131n Microsoft, .NET&#8217;te dockerize s\u00fcre\u00e7lerinde Dockerfile dosyas\u0131na ihtiya\u00e7 duyulmaks\u0131z\u0131n container deste\u011fini getirmi\u015f bulunmaktad\u0131r.<\/p>\n<p>Bu destek ile kelimenin tam anlam\u0131yla tek talimatla docker image&#8217;i olu\u015fturabilmekte ve o image&#8217;den container aya\u011fa kald\u0131rabilmekteyiz. Image&#8217;i olu\u015fturabilmek i\u00e7in a\u015fa\u011f\u0131daki talimat\u0131n verilmesi yeterli olacakt\u0131r.<br \/>\n<strong style=\"color:green;\"><code>dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer -p:ContainerImageName=docker-example<\/code><\/strong><br \/>\nBu talimat size \u00e7ok kompleks geldiyse e\u011fer .csproj dosyas\u0131nda a\u015fa\u011f\u0131daki gibi <em><code>ContainerImageName<\/code><\/em>, <em><code>PublishProfile<\/code><\/em> ve <em><code>ContainerImageTags<\/code><\/em> \u00f6zelliklerini ekleyebilir ve talimat\u0131 sadele\u015ftirme yakla\u015f\u0131m\u0131 sergileyebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&gt;\r\n\t&lt;PropertyGroup&gt;\r\n\t\t.\r\n\t\t.\r\n\t\t.\r\n\t\t&lt;ContainerImageName&gt;docker-example-container&lt;\/ContainerImageName&gt;\r\n\t\t&lt;PublishProfile&gt;DefaultContainer&lt;\/PublishProfile&gt;\r\n\t\t&lt;ContainerImageTags&gt;1.1.0;latest&lt;\/ContainerImageTags&gt;\r\n\t&lt;\/PropertyGroup&gt;\r\n\t&lt;ItemGroup&gt;\r\n\t\t.\r\n\t\t.\r\n\t\t.\r\n\t&lt;\/ItemGroup&gt;\r\n&lt;\/Project&gt;\r\n<\/pre>\n<\/div>\n<p>Haliyle bu vaziyette talimat\u0131 a\u015fa\u011f\u0131daki gibi vermeniz yeterli olacakt\u0131r.<br \/>\n<strong style=\"color:green;\"><code>dotnet publish --os linux --arch x64<\/code><\/strong><br \/>\nHatta biryandan da a\u015fa\u011f\u0131daki gibi <em><code>RuntimeIdentifier<\/code><\/em> \u00f6zelli\u011fini de ekleyerek talimat\u0131 daha da sadele\u015ftirebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\t\t&lt;ContainerImageName&gt;docker-example-container&lt;\/ContainerImageName&gt;\r\n\t\t&lt;PublishProfile&gt;DefaultContainer&lt;\/PublishProfile&gt;\r\n\t\t&lt;ContainerImageTags&gt;1.1.0;latest&lt;\/ContainerImageTags&gt;\r\n\t\t&lt;RuntimeIdentifier&gt;linux-x64&lt;\/RuntimeIdentifier&gt;\r\n<\/pre>\n<\/div>\n<p><strong style=\"color:green;\"><code>dotnet publish<\/code><\/strong><br \/>\nBu i\u015flem neticesinde docker&#8217;da image&#8217;lerinizi kontrol ederseniz e\u011fer verdi\u011finiz isimde bir image&#8217;in olu\u015fturuldu\u011funu g\u00f6rebilirsiniz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NETte-Built-In-Container-Destegi-.NET-Uygulamalarini-Dockerfile-Dosyasi-Olmaksizin-Dockerize-Etme-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/09\/NETte-Built-In-Container-Destegi-.NET-Uygulamalarini-Dockerfile-Dosyasi-Olmaksizin-Dockerize-Etme-1.png\" alt=\".NET&#039;te Built-In Container Deste\u011fi - .NET Uygulamalar\u0131n\u0131 Dockerfile Dosyas\u0131 Olmaks\u0131z\u0131n Dockerize Etme\" width=\"230\" height=\"62\" class=\"aligncenter size-full wp-image-26597\" \/><\/a>T\u00fcm bunlar\u0131n d\u0131\u015f\u0131nda olu\u015fturulacak image&#8217;i a\u015fa\u011f\u0131da a\u00e7\u0131klamas\u0131 verilmi\u015f olan \u00f6zellikler sayesinde de \u00f6zelle\u015ftirebilirsiniz.<\/p>\n<ul>\n<li><strong><code>ContainerBaseImage<\/code><\/strong><br \/>\nBu \u00f6zellik sayesinde .NET uygulamalar\u0131n\u0131 build edebilmek i\u00e7in kullan\u0131lan base image&#8217;in denetlenmesini sa\u011flamaktad\u0131r. Varsay\u0131lan SDK olarak <em><code>mcr.microsoft.com\/dotnet\/aspnet<\/code><\/em> image&#8217;i kullan\u0131lmaktad\u0131r.\n<\/li>\n<li><strong><code>ContainerImageName<\/code><\/strong><br \/>\nImage ad\u0131n\u0131n de\u011fi\u015ftirilmesini sa\u011flar.\n<\/li>\n<li><strong><code>ContainerPort<\/code><\/strong><br \/>\nContainer portunun belirtilmesini sa\u011flar.\n<\/li>\n<\/ul>\n<p>Ayr\u0131ca a\u015fa\u011f\u0131daki gibi <code>ContainerEnvironmentVariable<\/code> \u00f6zelli\u011fi sayesinde environment variable tan\u0131mlayabilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&gt;\r\n\t.\r\n\t.\r\n\t.\r\n\t&lt;ItemGroup&gt;\r\n\t\t&lt;ContainerEnvironmentVariable Include=&quot;Example_Environment_Variable&quot; Value=&quot;Trace&quot; \/&gt;\r\n\t&lt;\/ItemGroup&gt;\r\n&lt;\/Project&gt;\r\n<\/pre>\n<\/div>\n<p>Nihai olarak,<br \/>\n.NET mimarisi, uygulamalar\u0131m\u0131z\u0131n docker image&#8217;lerini olu\u015ftururken standart Dockerfile yakla\u015f\u0131mlar\u0131ndan ziyade Dockerfile dosyas\u0131na ihtiya\u00e7 duymaks\u0131z\u0131n olduk\u00e7a kolay ve esnek bir \u015fekilde image&#8217;lar\u0131m\u0131z\u0131 olu\u015fturmam\u0131za ve h\u0131z\u0131m\u0131za h\u0131z katmam\u0131za odaklanm\u0131\u015f ve kanaatim odur ki bunda b\u00fcy\u00fck bir fark yaratm\u0131\u015ft\u0131r \ud83d\ude42<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde .NET 7 ve \u00fczeri s\u00fcr\u00fcmleri i\u00e7in gelmi\u015f olan Dockerfile dosyas\u0131na gerek duyulmaks\u0131z\u0131n uygulamay\u0131 dockerize etme \u00f6zelli\u011fini ele alacak ve biryandan da built-in container deste\u011fi hakk\u0131nda incelemede bulunuyor olaca\u011f\u0131z. Evet&#8230; Microsoft, .NET&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":14719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4754,4912,3281],"tags":[533,4932,3284,3291],"class_list":["post-26586","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-7","category-net-8","category-docker","tag-net","tag-net-dockerfile","tag-docker","tag-dockerfile"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26586","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=26586"}],"version-history":[{"count":13,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26586\/revisions"}],"predecessor-version":[{"id":26602,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26586\/revisions\/26602"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/14719"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=26586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}