{"id":3594,"date":"2020-11-09T09:40:10","date_gmt":"2020-11-09T08:40:10","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=3594"},"modified":"2020-11-09T18:14:31","modified_gmt":"2020-11-09T17:14:31","slug":"useful-information-for-windows-containers","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/useful-information-for-windows-containers\/","title":{"rendered":"Windows Container&#8217;lar i\u00e7in Yararl\u0131 Bilgiler"},"content":{"rendered":"<p><\/p>\r\n<p>Tahmin edebilece\u011fimiz gibi genellikle zaman ve maliyet sebeplerinden dolay\u0131 mevcut uygulamalar\u0131 <strong>lift &amp; shift<\/strong> yakla\u015f\u0131m\u0131yla cloud ortam\u0131na migrate etmeye \u00e7al\u0131\u015fmak, bazen sand\u0131\u011f\u0131m\u0131z kadar kolay bir \u015fekilde ger\u00e7ekle\u015fmeyebiliyor. \u00d6zellikle <em>.NET Framework<\/em> ile geli\u015ftirmi\u015f oldu\u011fumuz mevcut uygulamalar\u0131m\u0131z\u0131 containerize edilmi\u015f olarak kubernetes gibi ortamlarda host etmek istiyorsak. Ayr\u0131ca \u00e7o\u011fu zaman tahmin edemeyece\u011fimiz farkl\u0131 challenge&#8217;lar\u0131 da handle etmemiz gerekebiliyor.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"768\" height=\"279\" class=\"wp-image-3617 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/liftandshift.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/liftandshift.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/liftandshift-300x109.jpg 300w\" data-sizes=\"(max-width: 768px) 100vw, 768px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 768px; --smush-placeholder-aspect-ratio: 768\/279;\" \/>\r\n<figcaption>https:\/\/www.ais.com\/wp-content\/uploads\/2019\/07\/Lift-n-Shift-Approach-App-Modernization-768&#215;279.jpg<\/figcaption>\r\n<\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Ben yakla\u015f\u0131k 1 y\u0131l gibi bir s\u00fcredir aktif olarak <em>Windows Container&#8217;lar<\/em> \u00fczerinde \u00e7al\u0131\u015fmaktay\u0131m. Bu s\u00fcre\u00e7te bir \u00e7ok farkl\u0131 challenge&#8217;larla kar\u015f\u0131la\u015ft\u0131k ve farkl\u0131 \u00e7\u00f6z\u00fcmler deneyimledik. Bu makale kapsam\u0131nda ise Windows container&#8217;lar ile ilgili baz\u0131 yararl\u0131 bilgileri ve notlar\u0131m\u0131 payla\u015fmaya \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">Base Windows Container Image&#8217;inin Se\u00e7imi<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Belki de en \u00f6nemli konulardan birisi, base Windows container image&#8217;inin se\u00e7imi. E\u011fer Windows container&#8217;lar ile \u00e7al\u0131\u015fmaya yeni ba\u015fl\u0131yorsan\u0131z, farkl\u0131 base Windows container image t\u00fcrleri (<em>Windows Server Core, Nano Server, Windows IoT Core, Windows<\/em>) ve versiyonlar\u0131 sebebiyle bu s\u00fcre\u00e7 biraz kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olabiliyor.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>E\u011fer mevcut uygulamalar\u0131m\u0131z full <em>.<\/em>NET Framework ihtiyac\u0131 duyuyorsa, <strong>Windows Server Core<\/strong> tabal\u0131 bir base image kullanmam\u0131z gerekmektedir.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bir di\u011fer nokta ise se\u00e7ecek oldu\u011fumuz image&#8217;in support lifecycle&#8217;\u0131. \u00d6rne\u011fin Windows server core i\u00e7in olan tag&#8217;lere <a href=\"https:\/\/hub.docker.com\/_\/microsoft-windows-servercore\" target=\"_blank\" rel=\"noreferrer noopener\"><em>buradan<\/em><\/a> bakarsan\u0131z, &#8220;LTSC&#8221; ve &#8220;SAC&#8221; olmak \u00fczere iki farkl\u0131 release channel&#8217;\u0131 oldu\u011funu g\u00f6rebilirsiniz. Bu noktada ise &#8220;LTSC&#8221; (Long-Term Servicing Channel) olan tag&#8217;lerden birisini se\u00e7memiz, her t\u00fcrl\u00fc faydam\u0131za olacakt\u0131r.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Ayr\u0131ca se\u00e7enek oldu\u011fumuz container version&#8217;\u0131n\u0131n , host makinas\u0131n\u0131n version&#8217;\u0131 ile de uyumlu olmas\u0131 gerekmektedir. \u00d6rne\u011fin container&#8217;lar\u0131n\u0131z\u0131 benim gibi sizde <strong>Azure Kubernetes Service<\/strong> (AKS) \u00fczerinde host etmek istiyorsan\u0131z, <strong>2019 <\/strong>version tabanl\u0131 bir container image&#8217;i kullanman\u0131z gerekmektedir. \u00c7\u00fcnk\u00fc AKS, host OS version&#8217;\u0131 olarak Windows Server 2019 kullanmaktad\u0131r.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Detayl\u0131 bilgiye ise,\u00a0<em><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/windows-faqAs we can imagine, trying to migrate existing applications to the cloud environment with the lift &amp; shift approach due to time and cost reasons, sometimes not as easy as we think. Especially if we want to host and manage the existing applications, that we have developed with .NET Framework, as containerized in environments such as kubernetes. In addition, we may also need to handle different challenges that we often cannot foresee.  https:\/\/www.ais.com\/wp-content\/uploads\/2019\/07\/Lift-n-Shift-Approach-App-Modernization-768x279.jpg  I have been working on Windows Container for about 1 year. During this period, we faced many different challenges and experienced different solutions. In this article context, I will try to share some of the useful information and my notes related to windows containers.  Choosing Base Windows Container Image  Maybe one of the most important topics is the choice of the base windows container image. If you are just starting to work with Windows containers, this process can be a bit confusing due to different types of base windows container images (Windows Server Core, Nano Server, Windows IoT Core, Windows) and versions.  If our existing applications require full .NET Framework, we need to use a Windows Server Core-based base image.  Another point is the support lifecycle of the image we will choose. For example, if you take a look at the tags for windows server core from here, you can see that there are two different release channels as\" target=\"_blank\" rel=\"noreferrer noopener\" name=\"\">buradan<\/a><\/em>\u00a0eri\u015febilirsiniz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6rne\u011fin .NET Framework ile geli\u015ftirilmi\u015f olan bir Web API&#8217;\u0131 containerize etmek ve AKS&#8217;de host etmek istiyorsak, a\u015fa\u011f\u0131daki gibi bir image kullanabiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>FROM mcr.microsoft.com\/dotnet\/framework\/aspnet:4.8-windowsservercore-ltsc2019<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>E\u011fer containerize edece\u011fimiz uygulama, i\u00e7erisinde IIS gerektirmiyorsa da a\u015fa\u011f\u0131daki gibi bir image&#8217;i kullanabiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>FROM mcr.microsoft.com\/windows\/servercore:ltsc2019\r\nFROM mcr.microsoft.com\/dotnet\/framework\/runtime:4.8-windowsservercore-ltsc2019<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Di\u011fer tag&#8217;lere ise, a\u015fa\u011f\u0131daki link&#8217;lerden eri\u015febilirsiniz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<ul class=\"wp-block-list\">\r\n<li><a href=\"https:\/\/hub.docker.com\/_\/microsoft-dotnet-framework-runtime\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/hub.docker.com\/_\/microsoft-dotnet-framework-runtime\/<\/a><\/li>\r\n<li><a href=\"https:\/\/hub.docker.com\/_\/microsoft-dotnet-framework-aspnet\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/hub.docker.com\/_\/microsoft-dotnet-framework-aspnet\/<\/a><\/li>\r\n<\/ul>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">Windows Container&#8217;\u0131 Up-to-date Tutmak<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"880\" height=\"334\" class=\"wp-image-3618 lazyload\" data-src=\"\/wp-content\/uploads\/2020\/10\/windows-con-last-update.png\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/windows-con-last-update.png 880w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/windows-con-last-update-300x114.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/10\/windows-con-last-update-768x291.png 768w\" data-sizes=\"(max-width: 880px) 100vw, 880px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 880px; --smush-placeholder-aspect-ratio: 880\/334;\" \/><\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Microsoft kulland\u0131\u011f\u0131m\u0131z OS&#8217;lerde oldu\u011fu gibi belirli aral\u0131klarla Windows container image&#8217;lerini de g\u00fcncellemektedir. Bu g\u00fcncellemeleri elde edebilmek i\u00e7in ise, uygulamalar\u0131m\u0131z\u0131n deployment an\u0131nda her zaman g\u00fcncel image&#8217;leri \u00e7ekmelerini sa\u011flamam\u0131z gerekmektedir. B\u00f6ylece base image&#8217;in g\u00fcncel security ve bug fix g\u00fcncellemelerine sahip oldu\u011fundan emin olabiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">Dockerfile&#8217;\u0131 Haz\u0131rlamak<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6zellikle mevcut uygulamalar\u0131m\u0131z\u0131n baz\u0131 third-party k\u00fct\u00fcphanelere ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 var ise, dockerfile&#8217;\u0131 haz\u0131rlamak ve container&#8217;\u0131 \u00e7al\u0131\u015f\u0131r bir hale getirebilmek bazen can s\u0131k\u0131c\u0131 olabiliyor. \u00c7\u00fcnk\u00fc ilgili third-party k\u00fct\u00fcphanelerin <strong>silent installation<\/strong> command&#8217;lar\u0131n\u0131 bulmak ve istedi\u011fimiz gibi \u00e7al\u0131\u015ft\u0131rmak bazen \u00e7ok da kolay olmuyor.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>E\u011fer uygulamalar\u0131m\u0131z\u0131n baz\u0131 k\u00fct\u00fcphanelere ba\u011f\u0131ml\u0131l\u0131klar\u0131 varsa, a\u015fa\u011f\u0131daki gibi bir \u00f6zel base image olu\u015fturabilir ve o base image&#8217;i ilgili uygulamalar\u0131 containerize etmek i\u00e7in kullanabiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>FROM mcr.microsoft.com\/dotnet\/framework\/aspnet:4.8-windowsservercore-ltsc2019\r\nWORKDIR \/app\r\n\r\n\/\/ Third-party dependencies\r\nADD .\/AppPath\/DependedLibrary.exe \/app\r\n\r\n\/\/ Silent installation\r\nRUN .\/DependedLibrary.exe \/install \/quiet\r\n\r\n\/\/ Installation i\u015fleminden sonra silmeyi de unutmayal\u0131m\r\nRUN DEL .\/DependedLibrary.exe<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">\u00c7al\u0131\u015fan Bir Container&#8217;a Eri\u015fmek<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00c7al\u0131\u015fan bir Windows container&#8217;a eri\u015fip -i\u00e7erisinde bir command \u00e7al\u0131\u015ft\u0131rmak istiyorsak, a\u015fa\u011f\u0131daki gibi bu i\u015flemi ger\u00e7ekle\u015ftirebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>docker exec -it container_id cmd\/powershell\r\nkubectl exec -it container_id -- cmd\/powershell<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">TLS&#8217;i Ayarlamak<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bir di\u011fer challenged konulardan birisi de, uygulamalar\u0131n secure communication&#8217;\u0131 i\u00e7in TLS&#8217;i ayarlamak.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6rne\u011fin .NET Framework ile geli\u015ftirilmi\u015f olan mevcut bir uygulamam\u0131z\u0131n, TLS&#8217;i etkinle\u015ftirilmi\u015f bir backing service&#8217;e ba\u011flanmas\u0131 gerekti\u011fini varsayal\u0131m. Bunun i\u00e7in ise <strong>root ca<\/strong> certificate&#8217;ini ilgili uygulama ba\u015flat\u0131lmadan \u00f6nce Windows container&#8217;\u0131n root store&#8217;una eklememiz gerekmektedir.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u0130lgili certificate&#8217;i ise &#8220;certoc.exe&#8221; tool&#8217;unu kullanarak, i\u015fletim sisteminin Trusted Root store&#8217;una ekleyebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>FROM mcr.microsoft.com\/dotnet\/framework\/runtime:4.8-windowsservercore-ltsc2019\r\nWORKDIR \/app\r\nCOPY . .\r\nRUN powershell certoc.exe -addstore root path\\\\ca.crt\r\nENTRYPOINT [\"MyConsoleApp.exe\"]<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>E\u011fer bir ASP.NET Framework Web API container&#8217;\u0131nda <strong>SSL<\/strong> i\u00e7in bir <strong>PFX<\/strong> certificate&#8217;ini install etmek istiyorsak, i\u015fler burada biraz daha farkl\u0131 ger\u00e7ekle\u015fiyor.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada, PowerShell&#8217;in &#8220;<em>Import-PfxCertificate<\/em>&#8221; cmdlet&#8217;ini kullanarak certificate&#8217;i import etmemiz ve <strong>443 <\/strong>port&#8217;una bind etmemiz gerekmektedir.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu i\u015flemi ise a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>FROM mcr.microsoft.com\/dotnet\/framework\/aspnet:4.8-windowsservercore-ltsc2019\r\nCOPY . \/inetpub\/wwwroot\r\n\r\nRUN powershell.exe -Command \"\\\r\n  Import-Module IISAdministration; \\\r\n  Import-Module WebAdministration; \\\r\n  $pwd = SOME_PASS_HERE | ConvertTo-SecureString -Force -AsPlainText; \\\r\n  $cert = Import-PfxCertificate -Exportable -FilePath 'C:\\PFX_PATH\\FILE' -CertStoreLocation cert:\\localMachine\\My -Password $pwd; \\\r\n  new-item -Path IIS:\\SslBindings\\0.0.0.0!443 -value $cert; \\\r\n  New-WebBinding -name 'Default Web Site' -Protocol https -Port 443; \\\r\n  Remove-WebBinding -Port 80; \\\r\n  c:\\ServiceMonitor.exe w3svc\"<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>E\u011fer kubernetes gibi bir platform&#8217;a deploy ediyorsan\u0131z, bu PowerShell command&#8217;lerini olu\u015fturaca\u011f\u0131n\u0131z helm chart&#8217;\u0131n &#8220;<em>deployment.yaml<\/em>&#8221; file&#8217;\u0131 i\u00e7erisinde tekrar kullan\u0131labilir bir hale getirebilirsiniz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Ayr\u0131ca password ile certificate&#8217;in olu\u015fturulma a\u015famalar\u0131nda da a\u015fa\u011f\u0131daki gibi cert-manager&#8217;\u0131n &#8220;<em>Certificate<\/em>&#8221; resource&#8217;undan ve kubernetes&#8217;in &#8220;<em>Secret<\/em>&#8221; objesinden yararlanabilirsiniz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>apiVersion: cert-manager.io\/v1\r\nkind: Certificate\r\nmetadata:\r\n  name: {{ template \"my-apis.fullname\" . }}\r\nspec:\r\n  secretName: {{ template \"my-apis.fullname\" . }}-tls\r\n  dnsNames:\r\n    - {{ template \"my-apis.fullname\" . }}\r\n  keystores:\r\n    pkcs12:\r\n      create: true\r\n      passwordSecretRef:\r\n        key: pfx-password\r\n        name: {{ include \"my-apis.fullname\" . }}-pfx-secret\r\n  issuerRef:\r\n    name: ca-issuer\r\n    kind: ClusterIssuer\r\n  duration: 8760h<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>SSL&#8217;in test i\u015flemini de <strong>SNI <\/strong>ile birlikte herhangi bir pod i\u00e7erisinden a\u015fa\u011f\u0131daki komut yard\u0131m\u0131yla ger\u00e7ekle\u015ftirebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>curl -k https:\/\/MY_API_HOST\/PATH --resolve MY_API_HOST:443:SVC_IP<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">IIS Binding \u0130\u015flemleri<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6zellikle SSL i\u015flemleri i\u00e7in container i\u00e7erisindeki IIS binding&#8217;lerini listelemek istersek, a\u015fa\u011f\u0131daki komutu kullanabiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>powershell Get-WebBinding 'Default Web Site'<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">Log&#8217;lar\u0131 Elde Etmek<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Windows container i\u00e7erisinde, Linux container&#8217;larda oldu\u011fu gibi &#8220;<em>kubectl logs<\/em>&#8221; komutu ile istedi\u011fimiz uygulama log&#8217;lar\u0131n\u0131 elde edebilmek \u00e7ok da kolay olmuyor. Bu sebeple bazen uygulaman\u0131n neden \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 anlayabilmek i\u00e7in \u00e7ok fazla vakit harcayabiliyoruz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Neyseki Microsoft taraf\u0131ndan Windows container&#8217;lar i\u00e7in geli\u015ftirilmi\u015f olan <strong>Log Monitor <\/strong>tool&#8217;unu kullanabiliriz. Log Monitor tool&#8217;u custom uygulama log&#8217;lar\u0131n\u0131, ETW ve Event logs gibi source&#8217;lar\u0131 monitor ederek, STDOUT i\u00e7in loglar\u0131 eri\u015filebilir bir hale getirmektedir.<\/p>\r\n<p><!-- \/wp:post-content --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>B\u00f6ylece &#8220;<em>kubectl logs<\/em>&#8221; komutu ile log detaylar\u0131na ula\u015fabilir hale gelebiliriz.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Log Monitor tool&#8217;unun kullan\u0131m\u0131 hakk\u0131ndaki bilgiye ise, <a href=\"https:\/\/github.com\/microsoft\/windows-container-tools\/tree\/master\/LogMonitor\" target=\"_blank\" rel=\"noreferrer noopener\"><em>buradan<\/em><\/a> eri\u015febilirsiniz.<\/p>\r\n<h2>Event Logs<\/h2>\r\n<p>Baz\u0131 durumlarda da sorunun nereden kaynakland\u0131\u011f\u0131n\u0131 anlayabilmemiz i\u00e7in, Windows Event Log&#8217;lar\u0131na bakmam\u0131z gerekmektedir.<\/p>\r\n<p>Bunun i\u00e7in ise a\u015fa\u011f\u0131daki komut sat\u0131rlar\u0131n\u0131 kullanabiliriz.<\/p>\r\n<pre>Get-EventLog -list<br \/>Get-EventLog application -newest 1<\/pre>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:heading --><\/p>\r\n<h2>File Storage<\/h2>\r\n<p><!-- \/wp:heading --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>E\u011fer mevcut uygulamalar\u0131m\u0131z bir shared file storage&#8217;a ihtiya\u00e7 duyuyorsa, bu konuda <strong>Azure File Share<\/strong> service&#8217;inden de yararlanabiliriz.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Azure file share, fully managed bir cloud file share service&#8217;idir. En g\u00fczel taraf\u0131 ise <strong>SMB <\/strong>deste\u011fi. Yani mevcut uygulamalar\u0131m\u0131z \u00fczerinde refactoring i\u015flemlerine gerek duymadan, azure file share&#8217;i istedi\u011fimiz bir container&#8217;a mount edebilmekteyiz.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Azure file share&#8217;i ise <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/storage\/files\/storage-how-to-create-file-share?tabs=azure-portalAs we can imagine, trying to migrate existing applications to the cloud environment with the lift &amp; shift approach due to time and cost reasons, sometimes not as easy as we think. Especially if we want to host and manage the existing applications, that we have developed with .NET Framework, as containerized in environments such as kubernetes. In addition, we may also need to handle different challenges that we often cannot foresee.  https:\/\/www.ais.com\/wp-content\/uploads\/2019\/07\/Lift-n-Shift-Approach-App-Modernization-768x279.jpg  I have been working on Windows Container for about 1 year. During this period, we faced many different challenges and experienced different solutions. In this article context, I will try to share some of the useful information and my notes related to windows containers.  Choosing Base Windows Container Image  Maybe one of the most important topics is the choice of the base windows container image. If you are just starting to work with Windows containers, this process can be a bit confusing due to different types of base windows container images (Windows Server Core, Nano Server, Windows IoT Core, Windows) and versions.  If our existing applications require full .NET Framework, we need to use a Windows Server Core-based base image.  Another point is the support lifecycle of the image we will choose. For example, if you take a look at the tags for windows server core from here, you can see that there are two different release channels as\" target=\"_blank\" rel=\"noreferrer noopener\" name=\"\"><em>buradaki <\/em><\/a>ad\u0131mlar\u0131 takip ederek olu\u015fturabilirsiniz.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Azure file share&#8217;i mount etmenin en basit yolu ise, helm chart&#8217;\u0131n &#8220;<em>deployment.yaml<\/em>&#8221; file&#8217;\u0131na a\u015fa\u011f\u0131daki gibi implemente etmek.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:code --><\/p>\r\n<pre class=\"wp-block-code\"><code>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n...\r\nspec:\r\n  ...\r\n  template:\r\n    ...\r\n    spec:\r\n      containers:\r\n        - name: {{ .Chart.Name }}\r\n          image: ...\r\n          volumeMounts:\r\n          - name: azurefileshare\r\n            mountPath: \/path\r\n      volumes:\r\n      - name: azurefileshare\r\n        azureFile:\r\n          secretName: storage-secret\r\n          shareName: path\r\n          readOnly: false\r\n      ...<\/code><\/pre>\r\n<p><!-- \/wp:code --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Ard\u0131ndan Azure file share&#8217;e eri\u015fim sa\u011flayabilmek i\u00e7in ise, a\u015fa\u011f\u0131daki gibi bir &#8220;storage-secret&#8221; file&#8217;\u0131 olu\u015fturmam\u0131z gerekmektedir.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:code --><\/p>\r\n<pre class=\"wp-block-code\"><code>apiVersion: v1\r\nkind: Secret\r\nmetadata:\r\n  name: storage-secret\r\n  namespace: default\r\ntype: Opaque\r\ndata:\r\n  azurestorageaccountname: Base64_Encoded_Value_Here\r\n  azurestorageaccountkey: Base64_Encoded_Value_Here<\/code><\/pre>\r\n<p><!-- \/wp:code --><\/p>\r\n<p><!-- wp:heading --><\/p>\r\n<h2>Resource Request Limits<\/h2>\r\n<p><!-- \/wp:heading --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>\u00d6zellikle i\u00e7erisinde IIS bar\u0131nd\u0131ran bir Windows container kullanacaksak, IIS&#8217;i de g\u00f6z \u00f6n\u00fcne alarak container&#8217;\u0131n allocate edece\u011fi resource&#8217;u iyi hesaplamam\u0131z gerekmektedir.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Bununla ilgili bilgilere ise, <em><a href=\"https:\/\/gokhan-gokalp.com\/kubernetes-for-production-some-useful-information\/\" target=\"_blank\" rel=\"noreferrer noopener\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:heading --><\/p>\r\n<h2>Node Selector&#8217;u Ayarlamak<\/h2>\r\n<p><!-- \/wp:heading --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Windows container i\u00e7in bir helm chart haz\u0131rlarken, &#8220;nodeSelector&#8221; de\u011ferini &#8220;windows&#8221; olarak ayarlamam\u0131z gerekmektedir. E\u011fer bu parametreyi ayarlamazsak, pod, herhangi bir node \u00fczerinde schedule edilebilir.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:code --><\/p>\r\n<pre class=\"wp-block-code\"><code>nodeSelector:\r\n  kubernetes.io\/os: windows<\/code><\/pre>\r\n<p><!-- \/wp:code --><\/p>\r\n<p><!-- wp:heading --><\/p>\r\n<h2>Health Checks&#8217;i Ayarlamak<\/h2>\r\n<p><!-- \/wp:heading --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>Uygulamalar\u0131m\u0131z\u0131n kubernetes ortam\u0131nda sa\u011fl\u0131kl\u0131 bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in bir di\u011fer \u00f6nemli konu da, &#8220;liveness&#8221; ve &#8220;readiness&#8221; probe&#8217;lerinin ayarlanmas\u0131.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p>\u00d6zellikle Windows container&#8217;lar i\u00e7in &#8220;readiness&#8221; probe&#8217;unu daha dikkatli ayarlamam\u0131z gerekmektedir. \u00c7\u00fcnk\u00fc Windows container&#8217;\u0131n trafi\u011fi kabul edebillir bir hale gelmesi, biraz daha fazla bir zaman gerektirebiliyor.<\/p>\r\n<p><!-- \/wp:paragraph --><\/p>\r\n<p><!-- wp:heading --><\/p>\r\n<h2>Referanslar<\/h2>\r\n<p><!-- \/wp:heading --><\/p>\r\n<p><!-- wp:paragraph --><\/p>\r\n<p><em><a href=\"https:\/\/docs.microsoft.com\/en-us\/virtualization\/windowscontainers\/manage-containers\/container-base-images?WT.mc_id=DT-MVP-5003382\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.microsoft.com\/en-us\/virtualization\/windowscontainers\/manage-containers\/container-base-images?WT.mc_id=DT-MVP-5003382<\/a><br \/><a href=\"https:\/\/gokhan-gokalp.com\/kubernetes-for-production-some-useful-information\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/gokhan-gokalp.com\/kubernetes-for-production-some-useful-information\/<\/a><br \/><a href=\"https:\/\/docs.microsoft.com\/en-us\/virtualization\/windowscontainers\/deploy-containers\/version-compatibility?tabs=windows-server-1909%2Cwindows-10-1909&amp;WT.mc_id=DT-MVP-5003382\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.microsoft.com\/en-us\/virtualization\/windowscontainers\/deploy-containers\/version-compatibility?tabs=windows-server-1909%2Cwindows-10-1909&amp;WT.mc_id=DT-MVP-5003382<\/a><\/em><\/p>\r\n<p><!-- \/wp:paragraph --><\/p>","protected":false},"excerpt":{"rendered":"<p>Tahmin edebilece\u011fimiz gibi genellikle zaman ve maliyet sebeplerinden dolay\u0131 mevcut uygulamalar\u0131 lift &amp; shift yakla\u015f\u0131m\u0131yla cloud ortam\u0131na migrate etmeye \u00e7al\u0131\u015fmak, bazen sand\u0131\u011f\u0131m\u0131z kadar kolay bir \u015fekilde ger\u00e7ekle\u015fmeyebiliyor. \u00d6zellikle .NET Framework ile geli\u015ftirmi\u015f oldu\u011fumuz mevcut uygulamalar\u0131m\u0131z\u0131 containerize edilmi\u015f olarak kubernetes gibi ortamlarda host etmek istiyorsak. Ayr\u0131ca&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/useful-information-for-windows-containers\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Windows Container&#8217;lar i\u00e7in Yararl\u0131 Bilgiler<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":3650,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,48,418,434,433,368],"tags":[593,537,592,322,440,590,591],"class_list":["post-3594","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-asp-net-web-api","category-azure","category-containerizing","category-logging","category-microservices","tag-net-framework-container","tag-azure-kubernetes-service","tag-container","tag-docker","tag-kubernetes","tag-windows-container","tag-windows-image","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Windows Container&#039;lar i\u00e7in Yararl\u0131 Bilgiler - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Windows Container&#039;lar i\u00e7in Yararl\u0131 Bilgiler - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-09T08:40:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-09T17:14:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/11\/useful-information-for-windows-containers.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Windows Container&#8217;lar i\u00e7in Yararl\u0131 Bilgiler\",\"datePublished\":\"2020-11-09T08:40:10+00:00\",\"dateModified\":\"2020-11-09T17:14:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/\"},\"wordCount\":2505,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/useful-information-for-windows-containers.jpg\",\"keywords\":[\".net framework container\",\"azure kubernetes service\",\"container\",\"docker\",\"kubernetes\",\"windows container\",\"windows image\"],\"articleSection\":[\".NET\",\"Asp.Net Web API\",\"Azure\",\"Containerizing\",\"Logging\",\"Microservices\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/\",\"name\":\"Windows Container'lar i\u00e7in Yararl\u0131 Bilgiler - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/useful-information-for-windows-containers.jpg\",\"datePublished\":\"2020-11-09T08:40:10+00:00\",\"dateModified\":\"2020-11-09T17:14:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/useful-information-for-windows-containers.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/useful-information-for-windows-containers.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/useful-information-for-windows-containers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Useful Information for Windows Containers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Windows Container'lar i\u00e7in Yararl\u0131 Bilgiler - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/","og_locale":"tr_TR","og_type":"article","og_title":"Windows Container'lar i\u00e7in Yararl\u0131 Bilgiler - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2020-11-09T08:40:10+00:00","article_modified_time":"2020-11-09T17:14:31+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/11\/useful-information-for-windows-containers.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Windows Container&#8217;lar i\u00e7in Yararl\u0131 Bilgiler","datePublished":"2020-11-09T08:40:10+00:00","dateModified":"2020-11-09T17:14:31+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/"},"wordCount":2505,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/11\/useful-information-for-windows-containers.jpg","keywords":[".net framework container","azure kubernetes service","container","docker","kubernetes","windows container","windows image"],"articleSection":[".NET","Asp.Net Web API","Azure","Containerizing","Logging","Microservices"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/","url":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/","name":"Windows Container'lar i\u00e7in Yararl\u0131 Bilgiler - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/11\/useful-information-for-windows-containers.jpg","datePublished":"2020-11-09T08:40:10+00:00","dateModified":"2020-11-09T17:14:31+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/11\/useful-information-for-windows-containers.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2020\/11\/useful-information-for-windows-containers.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/useful-information-for-windows-containers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Useful Information for Windows Containers"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=3594"}],"version-history":[{"count":5,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3594\/revisions"}],"predecessor-version":[{"id":3657,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3594\/revisions\/3657"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/3650"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=3594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=3594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=3594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}