Bu video; kapsayıcıların ne olduğu, Windows Server kutusunda nasıl çalıştırılacağı ve ne için kullanılabileceği üzerine kısa bir özettir. Kapsayıcı, bir uygulamanın çalışabileceği yalıtılmış bir ortamdır.
Kapsayıcı, uygulama ve tüm destek dosyaları; Çekirdek işletim sistemi, CPU ve bellek gibi ana bilgisayar kaynaklarının parçalarıyla oluşturulur. Bunlar mantıksal olarak diğer kapsayıcılardan ve ana bilgisayarın kendisinden ayrılır.
Bu diyagram, bir kırmızı ve bir sarı kapsayıcının aynı ana bilgisayar içinde bir arada bulunurken ve aynı donanım kaynaklarını ve Çekirdek işletim sistemini kullanırken, uygulamaları dışardan bir müdahale olmadan çalıştırabilecek şekilde kendi bağımsız alanlarında nasıl barındırıldıklarını gösterir.
Aynı donanım ve bu donanımda kurulu işletim sistemi, her bir kapsayıcıda olanlardan bağımsız olarak kendi uygulamalarını ve hizmetlerini çalıştırabilir.
Varsayılan olarak, bu kapsayıcı tek kullanımlıktır. Durdurulduğunda, üzerindeki tüm yazılım ve dosyalar silinir. Aynı durum, ana bilgisayar yeniden başlatılıyorsa da gerçekleşir.
Kapsayıcılar ana bilgisayarın güvenlik duvarından da faydalanır. Tüm bunları sanal bir makineyle karşılaştıralım. Öncelikle, sanal makinede bir kapsayıcı çalıştırabilirsiniz ancak bunun tersi mümkün değildir.
Sanal bir makine, bir bilgisayarın tamamını simüle eder. Bu nedenle kendi işletim sistemini çalıştırması gerekir. Bu daha fazla güvenlik sağlar ancak aynı zamanda daha fazla yapılandırma ve bakım işlemi gerektirir ve bu da genellikle kullanılmayan kaynaklara neden olur.
Kapsayıcılarla çalışmanın Visual Studio, Azure, Kubernetes ve Windows dahil olmak üzere birçok yolu vardır. Ancak bu videoda, Docker hakkında konuşacağız.
Docker, bir uygulamayı, tüm bağımlılıklarını ve yapılandırma bilgilerini kapsayıcı adı verilen tek bir pakette birleştirme işini üstlenen bir hizmet olarak platform ürünüdür.
Docker daha sonra bu kapsayıcıyı göndermek, çalıştırmak veya silmek için kullanılabilir. Birazdan bu diyagrama tekrar döneceğiz. Bunların bazılarını uygulamada görelim ve bu sırada daha fazla ayrıntıyı inceleyelim. Burada Windows Server 2022'nin yeni bir kurulumu var.
"Roles" ve "Features" öğelerini eklemek için "Server Manager" sihirbazını başlatacağım. Bu sihirbazı kullanarak "Containers" özelliğini ekleyebildiğime dikkat edin. Ancak bu, Docker'ın kurulmasını sağlamaz.
Bunu ayrı olarak yapmamız gerekiyor. Bu yüzden bu sihirbazı iptal edeceğim ve ilk olarak gerekli bir sağlayıcı kurmak için "PowerShell" uygulamasını açarak aşağıdaki satırı çalıştıracağım.
Install-Module, "DockerMsftProvider" ve kaynak olarak "PSGallery" kullanıyoruz. Enter'a basıyorum. Bu istemde NuGet'i kurmak için "Yes" yazın ve işlemin tamamlanmasını bekleyin.
Şimdi Docker'ı kurmak için ikinci satırı çalıştıracağım. Install-Package, "docker" ve ardından daha önce kurduğumuz "DockerMsftProvider" bilgisini belirtin. Enter'a basın. Birazdan göreceğimiz istemde de "Yes" seçeneğini belirleyerek devam edin.
Bilgisayarı yeniden başlatma istemine dikkat edin. "Restart-Computer" yazarak bunu yapalım. Bilgisayar yedeklendikten sonra "Server Manager"da "Add Roles and Feature Wizard"ı bir kez daha açacağım.
"Containers" özelliğinin zaten kurulu olduğunu göreceksiniz. Bunu, daha önce çalıştırdığımız iki PowerShell satırı ile yaptık. "PowerShell" öğesinde, "docker" gibi bir komut çalıştırdığımızda yapabileceğimiz her şey hakkında fikir edineceğiz.
Örneğin Docker sürümü bize 20.10.9 motor sürümüyle çalıştığımızı söyleyecektir. "docker info" adlı başka bir komut, ilk kapsayıcımızı henüz oluşturmadığımızı belirtir.
Bu kutu ayrıca kapsayıcılar için kullanılabilir olan CPU ve RAM miktarı, "Default Isolation Method" ve oluşturulan "Network" türleri gibi ayrıntıları da verir. Şimdilik bunlar hakkında konuşmayacağız.
Şimdi Docker ı kurduğumuz bu Windows kutusunda ilk kapsayıcıyı oluşturma ve çalıştırma adımlarını uygulayalım. Bu diyagrama geri dönerek Docker'ın birden fazla öğeyi bir kapsayıcıda toplamak için kullanılan bir araç olduğunu hatırlayalım. Yani, örneğin bir web uygulamasını kapsayıcıya yerleştirmek istersek bu kapsayıcının içine birkaç öğe koymamız gerekecek.
Öncelikle bir "Dockerfile" öğesine ihtiyacımız var. Bu dosyada, yeni bir kapsayıcı oluşturmak için gerekli yapılandırma bilgileri ve talimatlar bulunacak. Dockerfile bu şekilde görünür. Çok karmaşık veya çok basit olabilir.
Birazdan bir tane oluşturacağız. Ayrıca bir kapsayıcı görüntüsüne de ihtiyacımız var. Görüntü, salt okunur şablona benzer. Örneğin, "Windows Server Core" şablonu veya "Nano Server" şablonu kullanarak bir kapsayıcı oluşturabilirsiniz.
Bu görüntü veya şablon, "IIS" hizmeti ve geliştirme çerçevesi gibi web uygulaması için gerekecek bazı bağımlılıkları da sağlar. Son olarak, web uygulamasının kendisine de ihtiyacımız var.
Docker, tüm bunları bir araya getirerek bir kapsayıcı oluşturmanızı sağlar. Bunu uygulamada görelim. Bilgisayarda, PowerShell de Docker ı yüklediğimiz yere geri dönelim. C sürücüsünün kök bölümüne geçeceğim ve "containers" adlı yeni bir dizin oluşturacağım.
Bu yeni "containers" dizinine geçiş yapacağım. İlk kapsayıcımızı oluşturmak için daha önce bahsettiğimiz Dockerfile'a ihtiyacımız var. Bunun, kapsayıcı için bir dizi talimat içeren bir metin dosyası olduğunu unutmayın.
Bunu yapmak için "New-Item" yazacağım ve "dockerfile" adını belirteceğim. Bu Dockerfile'ın herhangi bir uzantısı olmadığına dikkat edin. Windows Gezgini'nde bu dosyanın oluşturduğunu görebiliriz. Bunu Not Defteri ile açacağız.
Bu ilk kapsayıcının basit olması için bu Dockerfile'a yalnızca üç satır ekleyeceğiz. Bunları teker teker açıklayacağım. İlk olarak, "From" talimatı, kapsayıcıyı oluşturmak için hangi kapsayıcı görüntüsünün kullanılacağını Docker'a söyler.
Unutmayın, görüntü bir şablona benzer. Bu durumda Docker'a, Microsoft Container kayıt defterinden Windows Server Core tabanlı olan ve ayrıca "IIS" rolünün yüklü olduğu bir görüntü kullanması talimatını veriyoruz.
İkinci satır, yeni kapsayıcı görüntüsü yürütülmeye başladığında hangi komutların çalıştırılacağını belirtir. Yazılım yüklemek veya dosyalar ve dizinler oluşturmak için komutlar ilave edebiliriz.
Ancak bu durumda, Docker'a çalışmaya başladığında kapsayıcıda PowerShell'i çalıştırması talimatı veriyoruz. Son olarak "Copy" talimatı, dosyaları veya dizinleri ana bilgisayardan kapsayıcının dosya sistemine kopyalar.
Bu durumda, Docker a birazdan oluşturulacak olan "index.html" dosya adını kopyalaması talimatını veriyoruz. Bu da, ana bilgisayardan kapsayıcıdaki bu klasöre örnek web uygulaması işlevi görür ve bu, IIS için varsayılan sanal dizin yoludur.
Hepsi bu kadar. Bu Dockerfile'ı kaydedelim. Şimdi, PowerShell e geri dönerek bu kapsayıcıda çalışacak olan web sayfasını oluşturalım. Bunu yapmak için "New-Item" komutunu tekrar kullanacağım ve ardından dosyanın adını "index.html" olarak belirteceğim.
Bu dosyayı Windows Gezgini'nde Not Defteri ile açacağız. Yine basit olması için bu örnek HTML uygulamasına yalnızca üç satır, basit bir "Hello World" web sayfası ekleyeceğiz.
Bunu kaydedeceğim. Artık kapsayıcı oluşturmak için gereken tüm bileşenlere sahibiz. Docker bu Windows Server kutusuna yüklendi.
Daha önce Microsoft kayıt defterindeki IIS'ye sahip sunucu çekirdek görüntüsünü kullanma talimatıyla birlikte oluşturduğumuz Dockerfile'ımız var.
Ayrıca, bu Dockerfile'ın talimatlarına, oluşturduktan sonra HTML web sayfasının bu yeni kapsayıcıya kopyalanması talimatını da ekledik. Ancak elimizde sadece bir dizi talimat var. Henüz hiçbir şey çalışmıyor.
Sonuç olarak tekrar PowerShell'e dönerek bu talimatlara göre bir görüntü oluşturacağız ve "docker", "build" çalıştıracağız. Ardından da web server adını veya etiketini atayacağız.
Sondaki bu sondaki nokta, Dockerfile ve "index.html" web sayfamızın bulunduğu bu kapsayıcılar dizininde çalışacağımızı gösteriyor. Enter'a basıyorum.
Bu satır, ilgili Dockerfile da belirlediğimiz talimatlar kullanılarak kapsayıcılarımızın oluşturulacağı temel görüntüyü sağlar. Bu görüntüyü bu sunucuda ilk kez çalıştırdığımızdan sunucunun görüntüyü Microsoft kapsayıcı kayıt defterinden indirmesi gerekiyor.
Tüm bunlar tamamlandıktan sonra docker images gibi bir komut çalıştırıldığında, yakın zamanda indirilen bir görüntü, buna atanan ad veya etiketle birlikte görüntülenir. Sonuç olarak, daha önce bir şablona benzediğini söylediğimiz bir kapsayıcı görüntümüz var. Ancak henüz çalışan kapsayıcılar yok.
Örnek web uygulamamıza erişmemizin henüz mümkün olmadığını göstermek için bir web tarayıcısı açacağım ve "localhost" yazacağım. Bu başarısız olur ancak ana bilgisayarda IIS olmadığından ve bir web sayfası barındıramadığından bu beklenen bir sonuç.
Son olarak, indirdiğimiz görüntü şablonunu kullanarak kapsayıcıyı çalıştırmak için tekrar PowerShell'e geri dönüp "docker run" yazalım ve ardından bu kapsayıcının adını belirtelim.
"container1" adını kullanacağız. Kapsayıcının arka planda çalışacağını belirtmek için bu anahtarı kullanacağız. Bu diğerini de, kapsayıcı üzerindeki "port 80" öğesinin ana bilgisayardaki "port 80" ile eşleneceğini belirtmek için kullanacağız. Ayrıca bu kapsayıcının, daha önce indirip oluşturduğumuz web sunucusu görüntüsü kullanılarak yürütülmesi gerektiğini de belirtiyoruz.
Enter'a basıyorum. Tüm işlem bu kadar. Bu, az önce hazırladığımız web sunucusu görüntüsüne göre "container1" adlı bir kapsayıcı oluşturur ve yürütür.
Dikkat ederseniz bu kapsayıcıya herhangi bir bellek atamamız gerekmedi. Ayrıca bu kapsayıcıya sanal makinelerdeki gibi CPU'lar veya sanal sabit diskler de atamamız gerekmedi.
Bunun nedeni, bir kapsayıcıya bu kaynakları atamanızın gerekmemesi. Bunlar sadece gerekli olanları kullanır. Tarayıcıya geri dönelim ve tekrar "localhost" yazalım.
Örnek web uygulamamızın hazır olduğunu görüyoruz. Ancak ana bilgisayar üzerinde değil. Bunun yerine, ana bilgisayar 80 numaralı bağlantı noktasını kapsayıcıya aktarıyor. Bu kapsayıcı, web sunucusu görüntüsünde belirttiğimiz ayarlar kullanılarak oluşturuldu ve Dockerfile'da belirtilen şekilde HTML web sayfamız buraya kopyalandı.
Yeni oluşturulan bu kapsayıcıyla, komut satırı aracılığıyla etkileşim kurabiliriz. Örneğin, bu kapsayıcıyla etkileşimli olarak bağlantı kuracağımızı belirtmek için yeni bir PowerShell penceresi açıp "docker exec-ti" komutunu gireceğim.
Kapsayıcının adı, "container1" ve ardından "powershell". Bu Docker komutu, az önce oluşturduğumuz container1'de PowerShell'i açar ve bize bir istem gönderir.
Bu durumda, örneğin "hostname" yazdığımızda, bu kapsayıcıya bir bilgisayar adı atandığını görebiliriz. ipconfig" gibi bir komut yazıldığında, bu kapsayıcıya ana bilgisayarla ve bunun ötesinde iletişim kurması için Network Address Translation kullanan bir IP adresi atandığı da gösterir.
Daha önce oluşturduğumuz HTML web sayfasında küçük bir değişiklik yapacağım. Bunu Not Defteri'nde düzenleyeceğim ve buradaki başlığı "container #1" yerine "container #2" olarak değiştireceğim. Bu dosyayı kaydedelim. PowerShell'e geri dönerek ilk kapsayıcımızı oluşturmak ve çalıştırmak için daha önce kullandığımız iki satırı kullanacağım.
Öncelikle, "docker build" satırı değişmeden kalır. Enter'a bastığımda işlemi hemen gerçekleştirdiğine dikkat edin. Bunun nedeni, Microsoft kapsayıcı kayıt defterinden IIS rolünün yüklendiği sunucu çekirdek görüntüsünü zaten indirmiş olmamız.
İkinci satır olan "docker run" satırını, "container2" adlı yeni bir kapsayıcı oluşturmak için düzenliyoruz. Ayrıca bu kapsayıcının, "port 80" yerine "container1" öğesine atadığımız bağlantı noktası olan "port 8080" öğesinde dinlemesini sağlayacağız.
"Enter"a basıyoruz. İşlem tamamlandığında da tarayıcıya geri gelerek "localhost" konumuna döneceğim ancak bu sefer "port 8080" öğesini belirteceğim. Bağlantı noktası 8080 de dinleyen web sayfasının yeni oluşturduğumuz "container #2" tarafından barındırıldığını görebiliriz. Bağlantı noktası 80 de dinleyen ve HTTP için varsayılan olan web sayfası ise "container #1" tarafından barındırılır.
PowerShell'de "docker ps" komutunu çalıştırarak da aynı durumu görebiliriz. Container #1, bağlantı noktası 80 de dinlerken, "container #2" de bağlantı noktası 8080 de dinler. container #1 ve "container #2" kendi ana bilgisayar adlarına, IP adreslerine sahiptir ve kendi web sitelerini barındırır.
"container #1"de meydana gelen değişiklikler "container #2"yi etkilemez. Tüm bunları, ana bilgisayar sunucuya "IIS" rolünü veya "hyper v" rolünü yüklemeden de yapabilirdik.
Ayrıca RAM, CPU veya sanal sabit diskler gibi kaynaklar atamamız ya da herhangi bir ağ yapılandırması gerçekleştirmemiz de gerekmedi. Temel şablon görüntüsü yerel olduğunda kapsayıcının oluşturulması iki ila üç saniye sürdü.
Son olarak, bir kapsayıcıda neler çalıştırabileceğinizden kısaca bahsetmek istiyorum. Öncelikle, Windows'daki kapsayıcılar ilk olarak Windows Server 2016 ve Windows 10'da destekleniyordu. Bu yüzden ideal olarak, barındırılan uygulama; bu işletim sistemleri ve daha yeni sürümler ile uyumludur.
Bir uygulama için grafik kullanıcı arabirimine veya sürücülere ihtiyaç olduğunda bunun bir kapsayıcıya yerleştirilmesi uygun değildir. Ancak "Asp.net" veya "Apache" gibi Uygulama Çerçevelerini, "Python" gibi programlama dillerini, hatta sqlserver-express, "mongodb" ya da "mysql" gibi hizmet formundaki veritabanlarını barındırmak için bir kapsayıcı kullanabilirsiniz.
Şu anda "etki alanı denetleyicisi", "DNS" veya "DHCP" gibi Windows altyapı rollerinin kapsayıcılarda barındırılması desteklenmemektedir ancak belki gelecekte bu da mümkün olabilir.
Kapsayıcıların ne olduğunu, Windows Server kutusunda nasıl çalıştırılacağını ve ne için kullanılabileceğini hızlıca inceledik. Umarım bu bilgileri faydalı bulmuşsunuzdur. İzlediğiniz için teşekkür ederim.