Windows Server 2016 Containers Bölüm 3 – Adım Adım Örnek Uygulamalarla Windows Server Containers
· Windows Server 2016 Containers – Bölüm 1 – Giriş, Kavramlar ve Mimari
· Windows Server 2016 Containers – Bölüm 2 – Windows Server Containers
Bu bölümde de Windows Server Container kullanımını adım adım örnek uygulamalarla ele alıyoruz.
Bundan önceki bölümlerde yapılandırdığımız Container Host sunucumuzla ilgili bilgileri aşağıdaki resimde de görüldüğü gibi Get-ContainerHost komutu ile görüntülüyoruz.
Container Host sunucumuzda oluşturacağımız container imajlarında kullanmak için baz işletim sistemi imajı (base OS image) olarak hazırladığımız imajları Get-ContainerImage komutu ile listeliyoruz:
Container imajı container oluşturmak için kullanılan bir şablon(template) ya da snapshot gibi tekrar tekrar kullanılabilen bileşenlerdir. Bu imajlar container host sunucusu üzerinde C:\ProgramData\Microsoft\Windows\Images konumunda aşağıda görüldüğü gibi dosya biçiminde depolanmaktadır.
Container Host sunucumuz üzerinde New-Container komutu kullanılarak Container1 adında aşağıdaki resimde de görüldüğü gibi yeni bir container oluşturuyoruz:
Oluşturulan container’a ait hangi özellikleri (property) ya da metodları kullanabileceğimizi de aşağıdaki resimde de görüldüğü gibi get-member komutunu kullanarak listeleyebilirsiniz.
Oluşturulan bir container’a ait sık kullanılan özellikleri listelemek gerekirse:
· ContainerId : Container’a atanan benzersiz kimlik numarası.
· ContainerName : Container’a atanan isim.
· ComputerName : Container Host sunucu adı.
· CreationTime : Container oluşturulma tarih ve saati.
· ParentImage : Container’ın bağlı olduğu ana imaj ya da bir başka deyişle container şablon imajı.
· State : Container’ın o anki durumunu gösterir. Kapalı (Off), çalışır durumda (Running) vb.
· Uptime : Container’ın son açılışından itibaren erişilebilir olduğu toplam zaman.
Container Host sunucusu üzerinde oluşturulan container’ı başlatmak için Start-Container komutunu kullanıyoruz.
Oluşturulan bir container’ın başlama ya da erişilebilir duruma gelme süresini sanal bir sunucunun başlama süresi ile karşılaştırdığımızda container’ın farkı ve sanal sunuculara olan üstünlüğünü net olarak görmekteyiz.
Container Host sunucusu üzerinde oluşturulan container’a bağlanmak için Enter-PSSession komutunu kullanıyoruz. Bağlantı gerçekleştirirken sunucu adı yerine Container adı (ContainerName) ya da ContainerID’sini aşağıdaki resimde de görüldüğü şekilde kullanıyoruz.
Container sistemine bağlandıktan sonra hostname komutunu kullanarak container’a atanan host adını görüntüleyebilirsiniz. Container içerisinde aşağıda görüldüğü gibi ufak bir değişiklik yaparak sistem bilgilerini bir metin dosyasına yazdıralım.
Bu küçük değişiklik sonrasında Exit-PSSession komutu ile container oturumumuzu aşağıda görüldüğü gibi kapatıyoruz.
Çalışır durumda olan container’ı da Stop-Container komutunu kullanarak durduruyoruz.
Bu container’ı repository içerisinde yeni bir container imajı olarak saklamak için de New-ContainerImage komutunu aşağıdaki şekilde kullanılıyoruz:
ContainerImage1 adıyla repository içerisine yeni bir container imajı olarak kaydetmiş olduk. Böylece bu imaj tekrar tekrar kullanılarak yeni container’lar oluşturulabilecek. Oluşturduğumuz ContainerImage1 baz imajı olan “WindowsServerCore” isimli imaja bağlantılı olarak yeni bir imaj olarak oluşturuldu. Bu oluşan yeni imaj içerisinde sadece farklar bulunmaktadır. Yeni oluşturduğumuz container imajına ait içerik aşağıdaki şekilde de görülen C:\ProgramData\Microsoft\Windows\Hyper-V\Container Image Store\ altına kaydedilecektir.
Bu yeni oluşturduğumuz ContainerImage1 adlı container imajdan yeni container’lar oluşturmak için de aşağıdaki resimde de görüldüğü gibi New-Container komutunu kullanıyoruz:
NewContainer1 isimli yeni bir container oluşturduktan sonra Start-Container komutunu kullanarak container’ı başlatıyoruz.
Şimdi de Enter-PSSession komutunu kullanarak yeni oluşturduğumuz container’a aşağıdaki resimde görüldüğü gibi bağlandığımızda imaj içerisinde önceden oluşturduğumuz C:\systeminfo.txt dosyasının da geldiğini göreceksiniz. Bu bağlantımızı da ContainerID yerine ContainerName bilgisini kullandık.
Exit-PSSession komutunu kullanarak container oturumundan çıkıyoruz.
Çalışır durumda bulunan tüm container’ları kapatmak için de aşağıdaki resimde görüldüğü gibi Get-Container | Stop-Container komutunu kullanıyoruz:
Container Host sunucusu üzerinde oluşturulan containerları silmek için Remove-Container komutunu aşağıdaki resimde görüldüğü gibi kullanabilirsiniz:
NOT: Container’ı silmeden önce Stop-Container komutu ile kapatmanız gerekir. Tüm açık containerları kapatmak için de Get-Container | Stop-Container komutunu kullanabilirsiniz.
Container Host sunucusu üzerinde repository içerisine kaydedilen imajların silinmesi için de Remove-ContainerImage komutunu aşağıdaki resimde görüldüğü gibi kullanabilirsiniz:
CONTAINER İÇERİSİNDE WEB SUNUCULARIN HOST EDİLMESİ
Bu uygulamamızda da container içerisinden web site host edilmesini gerçekleştiriyoruz.
Öncelikle mevcut WindowsServerCore baz imajını kullanarak aşağıdaki şekilde de görüldüğü gibi WebContainer isimli yeni bir container oluşturuyoruz:
Oluşturduğumuz container’ı Start-Container komutunu kullanarak başlatıyoruz. Ve container’a PowerShell Remoting ile uzaktan aşağıdaki resimde de görüldüğü gibi oturumu başlatıyoruz:
Görüldüğü gibi yeni oluşturduğumuz container’ı NetworkName parametresi ile bir ağa da bağlayarak IP adresi atanmasını sağlamış olduk. Böylece container ortamına ContainerName, ContainerId ve IP Adresi bigilerini kullanarak oturum açabilirsiniz.
Container’ı bağladığımız ağ arabirimi NAT modunda çalıştığı için Container Host sunucusu üzerinde aşağıdaki resimde de görüldüğü gibi internet ağı ile haberleştiğini kontrol ediyoruz:
Container içerisinden web site host edeceğimiz için aşağıdaki resimde de görüldüğü gibi Install-WindowsFeature Web-Server komutunu kullanarak web sunucu rolünü yüklüyoruz.
Aynen bir sanal sunucuda olduğu gibi InetPub dizininin geldiğini göreceksiniz.
Dışardan container içerisindeki web sitelerine erişim için container host sunucusundan container’ın IP adresine giden web trafiği için aşağıdaki şekilde statik port yönlendirme tanımını yapılandırıyoruz:
Not : Container yapılarının dış dünya ile iletişimi için Network Address Translation (NAT) modunu kullanan bir sanal switch ile ilişkilendiriyoruz. Böylece container sunucumuza IP ataması yaparak, dış dünya ile de iletişimini sağlamış oluyoruz.
Bu adımdan sonra da container host sunucumuz üzerinde 80 portu için gelen trafiğe izin veren firewall kuralını aşağıdaki şekilde tanımlıyoruz:
Windows Firewall devre dışı bırakılmışsa bu kuralı oluşturmadan da ilerleyebilirsiniz. Artık tanımlarımızı yaptık. Şimdi container ortamına Microsoft Edge, IE vb. tarayıcılar üzerinde bağlandığımızda otomatik olarak bizi container üzerinde host edilen web sayfasına yönlendirdiğini göreceksiniz.
Windows Server üzerinde gelen Web Server rolü yerine Nginx gibi üçüncü parti web sunucu yazılımlarını da kullanarak container içerisinde web hosting yapabilirsiniz. Bunun için öncelikle aşağıdaki resimde görüldüğü gibi nginx paketini container içerisinde C sürücüsüne indiriyoruz.
Expand-Archive komutunu ile aşağıdaki resimde de görüldüğü gibi sıkıştırılmış ZIP içeriğini açıyoruz:
Container oturumunu ve container’ı tamamen kapatıyoruz.
Bu container’ı aşağıdaki resimde de görüldüğü gibi New-ContainerImage komutu kullanılarak bir container imajına dönüştürüyoruz.
Yukarıdaki resimde görüldüğü gibi nginxweb adında yeni bir container imaj olarak yerel repository içerisine kaydettik.
Şimdi de bu imajı kullanarak yeni bir container oluşturacağız.
Oluşturulan websrv1 isimli container’ı başlatıp, uzak oturum açıyoruz.
Öncelikle container içerisinde web sunucu hizmetini verecek Nginx web sunucu servisini aşağıdaki komutla başlatıyoruz.
Container’a atanan ip bilgisini öğrendikten sonra Exit-PSSession ile powershell oturumunu kapatıyoruz.
Container host sunucumuza dışardan gelen HTTP (TCP 80 port) isteklerini websrv1 isimli container ip adresine yönlendirecek şekilde host üzerinde port yönlendirmesi tanımlıyoruz.
Windows Firewall etkin durumda ise yine aşağıdaki komutu çalıştırarak TCP 80 portundan gelen trafik için izin veren kuralımızı etkinleştiriyoruz:
Bu yapılandırmalardan sonra Container Host sunucumuzun IP adresine web tarayıcı üzerinden bağlandığımızda nginx üzerinde host edilen sayfaya yönlendirildiğinizi ve içeriğin geldiğini göreceksiniz.
Tekrar container’a oturum açıp sayfanın içeriğinde değişiklik yaptıktan sonra, sayfayı Refresh ile yeniden yüklediğinizde güncellemelerin geldiğini göreceksiniz.
Şu an itibariyle elimizde bir tane nginx web sunucu servisini içeren container imajına sahibiz ve bu imajdan bir adet container oluşturarak bunu test ettik. Herhangi bir anda bu container’dan çok sayıda ihtiyacınız olduğunda da aşağıdaki PowerShell kodunu kullanarak aynı anda istediğiniz sayıda farklı isim ve ip adreslerinden yayın yapan container açabilirsiniz.
ÜÇÜNCÜ BÖLÜMÜN SONU;
Evet, Windows Server 2016 ile gelen ve sanallaştırmada yeni bir dönemi başlatacak “Container” mimarisini incelediğimiz makale serimizin üçüncü bölümüni de burada noktalıyoruz. Bu bölümde Windows Server Container yönetimini adım adım örnek uygulamalarla inceledik. Makale serimizin bir sonraki bölümünde Hyper-V Container kullanımını detaylarıyla inceliyor olacağız. Görüşmek üzere, sağlıcakla kalın.
Mesut ALADAĞ
Microsoft MVP, MCT, P-TSP
www.mesutaladag.com | @mesutaladag