Windows Server 2016 Üzerinde Windows Containers. Windows Containers Nedir? Nasıl Kullanılır? makalesinde Windows Container konusunu Windows 10 üzerinde ve Docker for Windows kullanarak incelemiştik. Windows Server 2016 üzerindeki kullanımına geçmeden Windows 10 üzerindeki çalışmasına detaylı olarak bakalım.
Windows 10 PC’mizde PowerShell üzerinden Docker Process’lerine bakmak için get-Process *Docker* komutunu önce Linux Containers aktifken, sonra da Windows Containers‘a geçtikten sonra çalıştıralım.
Resim-1: Windows 10 PowerShell get-Process *Docker* komut çıktısı
Resim-1‘de göreceğiniz gibi ilk komut (Linux Containers) ile 2. Komut (Windows Containers) arasında bir Process’lik fark var. Windows Containers aktifken Dockerd yani Docker Daemon Process’i de çalışıyor. Burada dikkat edeceğimiz Process ise com.Docker.proxy.
Resim-2′de görebileceğiniz gibi, Command Promt üzerinden çalıştırdığımız Docker run komutu ilk önce com.Docker.proxy’ye gider. Buradan eğer Linux Container ile çalışıyorsak Hyper-V üzerinde çalışan MobyLinux VM‘e ve içerisindeki L inux Container’ı, Windows Container ile çalışıyorsak da Docker Deamon (Dockerd.exe) üzerinden giderek Windows Container’ı çalıştırır.
Resim-2: Windows 10 Linux ve Windows Containers
Windows 10’un sunucudan çok son kullanıcıya yönelik bir işletim sistemi olduğundan üzerinde Docker ve Container kullanımı aslında geliştirme amaçlı olarak görülebilir. Peki sunucu tarafında Windows Container nasıl çalışıyor?
Windows Server’a Docker for Windows kurmuyoruz, böylece Resim-2‘deki com.Docker.proxy yerine komutları direkt olarak Docker daemon üzerinden ileterek Container’I çalıştırıyoruz.
Windows Server 2016 üzerinde yapmamız gereken kurulumlarla başlayalım:
1.PowerShell gallery’den Docker-Microsoft PackageManagement Provider‘ı kurmamız gerekiyor. PowerShell üzerinde aşağıdaki komutu çalıştıralım:
Install-Module
-Name DockerMsftProvider -Repository PSGallery -Force
2.PackageManagement PowerShell module kullanarak Docker’ın güncel versiyonunu aşağıdaki komut ile kuralım:
Install-Package
-Name Docker -ProviderName DockerMsftProvider
3.Restart
Restart-Computer
-Force
Sunucu üzerinde Docker komutunu çalıştırmadan önce Resim-3‘te göreceğiniz Disk Management ekranına bakalım. Disk 0 olarak bir adet diskimiz görünüyor.
Resim-3: Windows Server 2016 Disk Management
Docker run -it microsoft/dotnet:nanoserver PowerShell komutu ile microsoft/dotnet:nanoserver, interactive terminal (-it) parametresi ile Container içerisinde PowerShell’i açarak başlatalım.
NOT: Image önceden indirilmediği için önce image indirecektir.
Container içerisinde açtığımız PowerShell’de ls komutu ile disk içeriklerine bakalım (Resim-4). Aynı komutu Windows Server’da PowerShell’de de çalıştırdığımızda beklediğimiz gibi farklı içerikler yani farklı bir disk olduğunu görebiliyoruz (Resim-5).
Resim-4: Container PowerShell ls komutu
Resim-5: Windows Server 2016 PowerShell ls komutu
Resim-6‘te göreceğiniz gibi Disk 1 olarak yeni bir disk eklendi. Eğer Container’ı durdurursanız bu diskin sistemden kalkacağını görebilirsiniz. Özetle Container’ı çalıştırdığımız zaman sisteme yeni bir disk eklenmiş gibi farklı bir disk içerisinde çalışıyor.
Resim-6: Windows Server 2016 Disk Management (Docker run sonrası)
Disk içeriklerine baktıktan sonra Processlere de bakalım. Container içerisinde PowerShell üzerinden get-Process komutu ile aktif Process’lere bakalım. Resim-7‘te göreceğiniz gibi PowerShell Process id 4392 olarak görünüyor.
Resim-7: Container içerisinde get-Process komut çıktısı
Aynı komutu şimdi de Windows Server 2016 PowerShell’de çalıştıralım (bkz Resim-8). 3 farklı PowerShell Process görünüyor ve bunlardan birinin Process id’si de 4392.
Resim-8: Windows Server 2016 get-Process komut çıktısı
Container içerisindeki Process’i Windows Server 2016 üzerinde de görebildik. Bu nasıl oluyor diyerek Task Manager’ı açalım (Resim-9). Task Manager’a bir kolon olarak Job Object ID ekleyelim ve 4392 Process ID’li PowerShell’e baktığımızda 76 Job Object ID içerisindeki Process’lerin Resim-7‘te de göreceğiniz Container içerisindeki Processler olduğunu görebilirsiniz.
Resim-9: Windows Server 2016 Task Manager
Container’ı izole bir sistem olarak tanımlıyoruz ancak yukarıdaki örneklerden de göreceğiniz üzere disk ve Process’lere direkt erişebiliyoruz. Peki ben tümüyle izole bir Container çalıştırmak için ne yapmalıyım?
Windows Container tiplerine baktığımızda buraya kadar anlattığımız kısmına Windows Server Containers deniliyor. Process ve Namespace izolasyon teknolojisi kullanarak uygulama izolasyonu sağlıyor. Container Host ve Host üzerinde çalışan bütün Container’lar ile Kernel’ı paylaştığı için bu Container’lar aynı Kernel versiyonu ve konfigurasyonu gerektiriyor.
Diğer Windows Container tipi ise Hyper-V Isolation; her Container’ı optimize edilmiş bir sanal makina içerisinde çalıştırıyor. Böylece Container Host da Kernel’ı diğer Containerlar ile paylaşmamış oluyor ve yukarıda paylaştığım örnekteki gibi disk ve Processleri de Host üzerinden göremiyorsunuz.
Container’ı Hyper-V Isolation tipinde çalıştırmak için öncelikle Hyper-V özelliğini aktif hale getirmemiz gerekiyor. Bunun için PowerShell üzerinden Install-WindowsFeature Hyper-V komutunu çalıştırmamız yeterli.
NOT: Eğer örneği Hyper-V içerisine kurduğunuz bir Windows Server 2016 ile yapıyorsanız Nested Virtualization’ı aktif hale getirmek için Host üzerinden aşağıdaki komutu çalıştırmanız gerekiyor.
Set-VMProcessor
-VMName <VM adı> -ExposeVirtualizationExtensions $true
Hyper-V aktif hale geldikten sonra –isolation=hyperv parametresini ekleyerek Container’ı Hyper-V Isolation ile çalıştırabilirsiniz.
Docker run -it –isolation=hyperv microsoft/dotnet:nanoserver PowerShell
Artık Disk Manager üzerinde yeni bir disk ya da Task Manager’da Container’a ait Processler göremeyeceksiniz.
Container tipine karar Runtime sırasında verileceği için Container’I ihtiyaçlarınıza göre her 2 tipte de kullanabilirsiniz.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
https://docs.microsoft.com/en-us/virtualization/WindowsContainers/about/index
Getting Started with Docker on Windows, Wes Higbee
TAGs: Windows Containers, Container, Hyper-V, nanoserver, Docker, Windows Server 2016, PowerShell, Windows Server 2016 Üzerinde Windows Containers, server 2016 da containers,