Windows Containers Nedir? Nasıl Kullanılır? İlk olarak Linux ile başlayan Container teknolojisini; uygulamaları diğer uygulamalardan izole bir şekilde, tam bir sanal makina kullanma gerekliliği olmadan ve Development’tan Production’a kadar aynı özelliklerde çalışmasını sağlayan bir sanallaştırma teknolojisi olarak tanımlayabiliriz.
Container denildiğinde ilk akla gelen Docker sayesinde bu teknolojiyi kolaylıkla kullanabilmekteyiz. Docker’ın Linux Container’ları gibi Windows Container’ları da kullanabiliyoruz. Windows Container olarak kullanabileceğimiz 2 çeşit Container Image bulunuyor: Windows Server Core ve Nano Server.
Nano Server sadece x64 uygulamaları destekleyen daha hafif bir Image iken, Windows Server Core ise
full .NET framework uygulamalarını çalıştırabiliyor ve bize daha çok oyun alanı sağlıyor. .NET Core ve ASP.NET Core uygulamaları her 2 Image üzerinde de çalışabiliyor ancak Core uygulamaları için Nano Server kullanmak daha az yer kapladığı için daha mantıklı görünüyor.
Sistem Gereksinimleri ve Ortamın Hazırlanması
Şimdi Windows Container’ları nasıl kullanacağımıza gelelim, yapacağımız örnek için için bazı ön koşulları sağlamamız gerekiyor:
- Windows 10 Pro / Enterprise Anniversary Update ve ya daha üst versiyon
- Hyper-V and Containers özelliklerinin yüklü olması (Windows Features üzerinden kontrol edebilirsiniz)
Resim-1 : Windows Features ekranı
PC üzerinde Virtualization ayarının Enabled olması (Resim- 2‘de görünen Task Manager Performance tab üzerinden kontrol edebilirsiniz).
Resim-2 : Task Manager performance tab
NOT: Eğer Virtualization disabled olarak görünüyorsa BIOS üzerinden bunu aktif hale getirebilirsiniz. Bunun için bilgisayar üreticisiniz web sitesinden BIOS ayarlarınızla ilgili destek bölümüne bakabilirsiniz.
Docker for Windows nested virtualization desteklemediği için bunu bir VM üzerinde yapamazsınız, bu nedenle fiziksel bir PC üzerinden yapmanız gerekiyor.
Öncelikle bilgisayarınıza eğer daha önce kurmadıysanız Docker for Windows kurmanız gerekiyor. Windows üzerine Docker kurulumunu tamamladıktan sonra (logout – login gerektiriyor) Docker otomatik olarak başlayacaktır.
Docker varsayılan ayarlarında Linux Container ile başlar. Bunu Command Prompt üzerinden Docker version komutu ile kontrol edebilirsiniz.
Resim-3 : Docker version (Linux Containers)
Bunu değiştirmek için tray’de yer alan Docker ikonuna sağ tıklayarak “Switch to Windows Containers” seçeneğini seçelim.
Resim-4 : Docker “Switch to Windows Containers” seçeneği
Bu seçeneği aktif hale getirdikten sonra Docker Version komutunu tekrar çalıştıralım. Server altındaki OS/Arch seçeneğinin Windows/amd64 olarak değiştiğini görebilirsiniz.
Resim-5 : Docker version (Windows Containers)
Container İçerisinde Çalışacak ASP.NET (Core) Uygulamasının Hazırlanması
ASP.NET ve ASP.NET Core uygulamaları Container içerisinde çalışabilir. Aralarındaki tek fark çalıştıracağınız uygulamaya uygun olan bir Container Image seçmeniz gerekmesi: Windows Server Core ya da Nano Server. Yapacağımız örnekte bir ASP.NET Core uygulaması ve Windows Server Core Image kullanacağız.
NOT: Örneği daha açıklayıcı olması açısından Visual Studio 2017 15.3 ile birlikte gelen Windows Container Docker Support özelliği ile yapmayacağız.
Projeyi oluşturmak istediğiniz klasörde Command Prompt üzerinden Dotnet new mvc komutu ile yeni bir ASP.NET Core MVC projesi oluşturalım.
Resim-6 : dotnet new mvc
Projeyi oluşturduktan sonra Dotnet run komutu ile uygulamanızı çalıştırabilirsiniz. Uygulama varsayılan ayar olarak 5000 portu üzerinden çalışacaktır. Browser üzerinden http://localhost:5000 yazarak Resim-7‘deki gibi web uygulamamızı görebiliriz.
Resim-7 : localhost:5000 üzerinden çalışan web uygulaması
Aynı klasörde yine Command Prompt üzerinden dotnet Publish -c Release -o PublishOutput komutu ile uygulamamızı Release konfigurasyonunda PublishOutput klasörüne Publish edelim.
Resim-8 : dotnet Publish
Docker Dosyası
Container Image oluşturmak için proje klasörü içerisinde bir Dockerfile dosyası oluşturulması gerekiyor.
Resim-9 : Dockerfile
Dosyanın içeriğini de aşağıdaki gibi düzenleyelim:
FROM microsoft/aspnetcore:2.0
COPY ./PublishOutput/ ./
ENTRYPOINT [“dotnet”, “mshowto.dll”]
Burada;
FROM microsoft/aspnetcore Image 2.0 versiyonunu alacağını,
COPY PublishOutput klasörünü Container içerisinde kopyalacağını,
ENTRYPOINT ise Container’ın giriş noktası olarak dotnet komutunu “mshowto.dll” parametresi ile çalıştıracağını belirtiyor.
Docker Image Hazırlanması
Uygulamamızı ve Dockerfile dosyasını hazırladıktan sonra sırada Docker Image oluşturmaya geldi. Bunun için de Docker build -t mshowto . komutunu çalıştıralım. Burada -t ile Image adını, . ile de Dockerfile Path belirtiyoruz.
Resim-10 : Docker build
Build işlemi tamamlandıktan sonra Docker Images komutu ile mevcut Image listesine ulaşabiliriz.
Resim-11 : Docker Images
ASP.NET Core Uygulamasının Container İçerisinde Çalıştırılması
Image hazırlanmasından sonra Docker run -d -p 80:80 mshowto komutu ile uygulamamızı Container içerisinde çalıştırıyoruz.
-d parametresi Container’ı Detached Mode ile yani mevcut Shell’den bağımsız olarak çalıştırmak,
-p parametresi de Container portunu host portuna yönlendirmek için kullanıyoruz.
Resim-12 : Docker run
Docker ps komutu ile çalışan Container’ları görebiliriz.
Resim-13 : Docker ps
Resim-13‘te NAMES kısmında uygulamamıza rastgele bir isim üretildiğini görebilirsiniz. Daha anlaşılır bir isim vermek için –name parametresini kullanarak;
Docker run -d –name mshowtowebapp -p 80:80 mshowto
komutu ile “mshowtowebapp”
ismini verebiliriz.
Container’ların Windows ile NAT aracılığı ile konuşmasındaki bir bug nedeniyle localhost üzerinden uygulamamıza erişemiyoruz. Bu nedenle Container’a ait iç IP adresini kullanmamız gerekiyor.
Docker inspect komutu ile Container’a ait IP adresini öğrenebiliriz.
Docker inspect -f “{{ .NetworkSettings.Networks.nat.IPAddress }}” mshowtowebapp
Resim-14 : Docker inspect
Artık browser üzerinden Docker içerisinde çalışan uygulamamıza erişebiliriz.
Resim-15 : Docker içerisinden çalışan web uygulaması
Bonus
Kitematic kullanarak da mevcuttaki Container’lar hakkında bilgi edinebilir ve çeşitli işlemleri gerçekleştirebilirsiniz.
Resim-16 : Kitematic arayüzü
Docker ile ilgili örneklere aşağıdaki linklerden erişebilirsiniz.
https://github.com/dotnet/dotnet-Docker-samples/tree/master/aspnetapp
https://github.com/Microsoft/dotnet-framework-Docker-samples/tree/master/aspnetapp
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
https://blogs.msdn.microsoft.com/webdev/2017/09/07/getting-started-with-Windows-Containers/
TAGs: Windows 10, Containers, Docker, Nano Server, ASP.NET Core, Kitematic, Windows Containers Nedir, Windows container, Windows Containers uygulamalari, windows server container nedir,