Windows sunucu kapsayıcıları. Konteynerlerle ilgilenelim. Windows'ta kapsayıcılar

Bitti! Ya dualar yardımcı oldu ya da fedakarlıklar yapıldı, ancak artık Docker konteynerlerini içinde Windows varken çalıştırabilirsiniz. Windows Server 2016'nın piyasaya sürülmesiyle birlikte harika haberler de geldi. Akıllıca gizlenmiş bir sanal makineden veya Linux çekirdeğindeki Windows emülasyonundan bahsetmiyoruz - gerçek Windows, çalışan bir Dockerfile, docker-compose ve diğer Docker ile gerçek Docker'da çalışır. şey .

Kısıtlamalar

Ancak bu artık herhangi bir konteyneri her yerde çalıştırabileceğiniz anlamına gelmiyor. Docker kapsayıcılarının işletim sistemi çekirdeğini ana bilgisayarlarından "ödünç alması" nedeniyle (aksi takdirde kendi işletim sistemlerine sahip olmaları ve bir sanal makineye dönüşmeleri gerekirdi), Windows kapsayıcıları yalnızca en son Windows 10 Pro Yıldönümü Güncellemesinde çalıştırılabilir ve Windows Sunucusu 2016.

İkinci nokta, Windows'ta yerel bir Linux konteyneri çalıştırmanın hala imkansız olmasıdır. Yıldönümü Güncellemesinin kendi Linux alt sistemi vardır (örneğin, gerçek Bash'i çalıştırabilirsiniz), ancak tam teşekküllü bir Linux çekirdeğini desteklemez, bu nedenle Windows'ta Ubuntu ile aynı kapsayıcının hala gizli bir sanal makineye ihtiyacı vardır.

Son olarak, her iki kapsayıcıyı da bir Windows makinesinde aynı anda çalıştırabilirsiniz, ancak biraz zorlukla. Bu komutu Windows Server 2016'da Docker yüklü olarak çalıştırırsanız (bir yıl önce bu büyücülük derdim), işe yarayacaktır:

Ancak bu komuttan sonra bir Ubuntu konteyneri başlatmaya çalışırsanız Docker üzülecektir:

Sorun, Windows ve Linux konteynerlerinin farklı Docker servis programları tarafından sunulması, ancak bunların komut satırıyla iletişim kurmak için aynı kanalı kullanmasıdır. Yani herhangi bir zamanda yalnızca bir iblis aktif olabilir. Resmi Docker web sitesinde sorunu çözmeye çalışan bir beta "Windows için Docker" bulunmaktadır (şimdilik yalnızca Windows 10 Pro ve Enterprise'da). Ancak bununla bile Windows'tan Linux kapsayıcılarına geçmek için ayarlar menüsüne gitmeniz veya komut satırıyla iletişim kurmanız gerekir:

Güç kalkanı

& "C:\Program Files\Docker\Docker\DockerCli.exe" -SwitchDaemon

& "C:\Program Dosyaları\Docker\Docker\DockerCli.exe"-SwitchDaemon

Windows görüntüleri

Şu ana kadar konteynerleştirilmiş Windows'a sahip yalnızca iki temel görüntü var:

Kendi temel görüntünüzü (karalama görüntüsü) oluşturamazsınız.

Windows Server Core görüntüsü 10 gig kadar ağırlığa sahiptir ve genellikle tam teşekküllü bir Windows Server 2016 gibi davranır. Örneğin, MS SQL ve tam teşekküllü bir .NET Framework oraya sorunsuz bir şekilde kurulur. Uygulamanız büyük ölçüde kullanıcı arayüzüne bağlı değilse yüklenecektir.

Nano Sunucu biraz daha ilginç. Bir konserden daha hafif, son derece optimize edilmiş ve sadeleştirilmiş bir Windows Sunucusudur. Ancak yeterli kısıtlama da var: 32 bit uygulama yok, kullanıcı arayüzü, RDP, doğranmış PowerShell vb. Ancak bu, aynı IIS'yi, .NET Core'u ve hatta bazı MySQL'leri Nano Sunucuya kurmanızı engellemez.

Ve birkaç yıl önce bir Docker dosyasında "Microsoft", "Windows" ve "PowerShell"i aynı anda bulabileceğinizi kim hayal edebilirdi?

Microsoft/windowsservercore'DAN powershell'i ÇALIŞTIRIN -Komut....

Microsoft/windowsservercore'DAN

Powershell'i ÇALIŞTIRIN - Komut . . . .

Docker'da Windows var! Hala saçma geliyor.

Yalıtım dereceleri

Windows kapsayıcıları iki yalıtım modunda çalıştırılabilir:

  • Windows Sunucu Kapsayıcıları
  • Hyper-V Konteynerleri

İlk Windows modunda, kapsayıcılar Docker'daki diğer tüm kapsayıcılarla aynı şekilde davranır: işletim sistemiyle ortak bir çekirdeği paylaşırlar, kapsayıcı işlemleri yalıtılmıştır ancak ana makine işlem ağacında hala görünür durumdadır vb. Bu, varsayılan ve en hızlı yöntemdir. Windows'ta kapsayıcıyı başlatın.

İkinci durumda konteynerler özel bir Hyper-V sanal makinesine düşer. Bunun elbette başlatma hızı üzerinde kötü bir etkisi var, ancak izolasyon tamamlandı.

Çözüm

Docker'da Windows harika bir haber. Ürünlerinizi kaplarda paketlemek için acele etmeseniz bile bu, birim testlerinizi, üretim makinelerinizi, demo sunucularınızı, sanal alanlarınızı (daha önce sanal makine oluşturmak zorunda kaldığınız her şeyi) izole etmek için harika bir araçtır. Microsoft hala Linux'ta nanoserver başlatmayı başarırsa, iki ay önce akılsızca satın aldığım Microsoft Band 2'nin yakın zamanda durdurulması nedeniyle onları affedeceğim.

Bir uygulama Docker kapsayıcısında nasıl paketlenir?

NodeJS ile yazılmış bir uygulamam var. Konteyner olarak çalışacak şekilde onu Docker görüntüsüne nasıl paketleyebilirim?

Docker, POSIX uyumlu işletim sistemlerine (şu anda Linux tarafından desteklenmektedir) yönelik bir konteyner yönetim sistemidir. Docker'ın özel bir özelliği, bir uygulamayı gerekli tüm ortamla, bağımlılıkları kurmaya veya kaynaklardan oluşturmaya yönelik uzun ve karmaşık prosedürler olmadan başka bir sistemde çalıştırılabilecek şekilde paketleme yeteneğidir. Dağıtıma hazır paket uygulamaya "görüntü" adı verilir. Docker görüntüleri, önceden yapılandırılmış çalışma ortamları olan "şablonlara" dayanmaktadır. Tamamen doğru olmasa da bunları işletim sistemi dağıtımları olarak düşünebilirsiniz. Ayrıca Docker belgelerini inceleyerek kendi şablonunuzu da oluşturabilirsiniz. Bu yaklaşımın avantajı, uygulamanızın görselinin yalnızca uygulamanın kendisini içermesi ve bunun için gerekli ortamın şablon deposundan otomatik olarak indirilmesidir. Docker biraz chroot veya bsd hapishanesini andırıyor ancak farklı çalışıyor.

“Kapsayıcı” ve “görüntü” kavramlarını birbirinden ayırmak önemlidir. Kap, uygulamanızın çalışan bir kopyasıdır ve görüntü, uygulamanın depolandığı ve kabın oluşturulduğu dosyadır.

Diyelim ki kapsayıcıya almak istediğiniz bir NodeJS uygulamanız var. Uygulamanızı çalıştıran dosyanın adının server.js olduğunu ve uygulamanın çalışmak için 8000 numaralı bağlantı noktasını dinlediğini varsayalım. Şablon olarak "node:karbon" kullanacağız. Uygulamanızı kapsayıcı hale getirmek için uygulama dosyalarınızın bulunduğu dizinde görüntü hazırlama parametrelerini açıklayacak bir “Dockerfile” dosyası oluşturmanız gerekir:

$ Dockerfile'a dokunun

Dosyanın içeriği şuna benzer olabilir:

# FROM düğüm:karbon kullanılacak şablonu belirtin # WORKDIR /usr/src/app kapsayıcısının içinde uygulamanın çalışma dizinini oluşturun # Uygulama bağımlılıklarını npm kullanarak yükleyin # Hem package.json hem de package-lock.json dosyaları, varsa kopyalanır KOPYALA package*.json ./ RUN npm install # Uygulama dosyalarınızı COPY görüntüsüne kopyalayın. . # EXPOSE 8000 konteynerinin dışından erişilebilmesi için 8000 numaralı bağlantı noktasını açın # Uygulamayı konteyner CMD'sinde çalıştırmak için komutu yürütün [ "npm", "start" ]

Gereksiz dosyaları görüntüden hariç tutmak için adlarını bir ".dockerignore" dosyasında listeleyebilirsiniz. Bir maske (*.log) kullanabilirsiniz.

Görüntü aşağıdaki komutla oluşturulur:

$ docker build -t kullanıcı adı/düğüm-web-app .

$ docker görüntüleri # Örnek DEPO ETİKETİ KİMLİĞİ OLUŞTURULDU düğüm karbon 1934b0b038d1 5 gün önce kullanıcı adı/node-web-app en son d64d3505b0d2 1 dakika önce

Kapsayıcı, aşağıdaki komut kullanılarak görüntüden başlatılır:

$ docker run -p 49160:8000 -d kullanıcı adı/düğüm-web-app

Bu örnek, "kullanıcı adı/düğüm-web-app" görüntüsünden bir kapsayıcı oluşturur ve onu hemen çalıştırır. Uygulama portu 8000, yerel makinede (localhost) mevcuttur ve “dışarıdan” erişilebilmesi için 49160 portuna “yönlendirilir”. Herhangi bir boş portu seçebilirsiniz, ayrıca uygulamayı iletmek de mümkündür. " -p 8000:8000" seçeneğini belirterek bağlantı noktasını "olduğu gibi" değiştirin.

Aşağıdaki komutu girerek konteynerinizin çalıştığını görebilirsiniz:

$ docker ps # Örnek ID IMAGE COMMAND ... PORTS ecce33b30ebf kullanıcı adı/node-web-app:en son npm start ... 49160->8000

Bir kapsayıcı, bu kapsayıcının kimliği belirtilerek çeşitli komutlar kullanılarak yönetilebilir:

$ liman işçisi duraklat ecce33b30ebf - kapsayıcıyı ecce33b30ebf kimliğiyle duraklatın
$ docker ecce33b30ebf özgeçmişi - kapsayıcıyı ecce33b30ebf kimliğiyle sürdürür
$ docker stop ecce33b30ebf - ecce33b30ebf kimliğine sahip konteyneri durdur
$ docker rm ecce33b30ebf - kapsayıcıyı sil (bu, uygulama tarafından kapsayıcı içinde oluşturulan tüm verileri siler)

*nix sistemleri başlangıçta çoklu görevi uygular ve süreçleri izole etmenize ve kontrol etmenize olanak tanıyan araçlar sunar. Dosya sistemi düzeyinde izolasyon sağlayan chroot(), çekirdek yapılarına erişimi kısıtlayan FreeBSD Jail, LXC ve OpenVZ gibi teknolojiler uzun zamandır bilinmekte ve yaygın olarak kullanılmaktadır. Ancak teknolojinin gelişmesinin itici gücü, uygulamaların rahatça dağıtılmasını mümkün kılan Docker'dı. Şimdi aynı şey Windows'a da geldi.

Windows'ta kapsayıcılar

Modern sunucular aşırı kapasiteye sahiptir ve uygulamalar bazen bunların bir kısmını bile kullanmamaktadır. Sonuç olarak, sistemler bir süre "boşta" durarak havayı ısıtır. Çözüm, birden fazla işletim sistemini tek bir sunucuda çalıştırmanıza olanak tanıyan, bunları kendi aralarında ayırmayı garantileyen ve her birine gerekli miktarda kaynak tahsis eden sanallaştırmaydı. Ancak ilerleme hala geçerli değil. Bir sonraki aşama, uygulamanın her bir parçasının, gerekli yüke göre kolayca ölçeklendirilebilen ve güncellenebilen, kendi kendine yeten bir bileşen olarak ayrı ayrı dağıtıldığı mikro hizmetlerdir. Yalıtım, diğer uygulamaların mikro hizmete müdahale etmesini önler. Uygulamaların çevreyle birlikte paketlenmesi ve teslim edilmesi sürecini basitleştiren Docker projesinin ortaya çıkışıyla birlikte, mikro hizmet mimarisi geliştirmede ek bir ivme kazandı.

Konteynerler, işletim sistemi sanallaştırma adı verilen, uygulamaları çalıştırmak için ayrı bir ortam sağlayan başka bir sanallaştırma türüdür. Konteynerler, etkileşimde bulunabileceğiniz (dosyalar, ağ bağlantı noktaları, işlemler vb.) ve ayrılamayacağınız işlem için gerekli tüm kaynakları (sanallaştırılmış adlar) içeren yalıtılmış bir ad alanı kullanılarak uygulanır. Yani işletim sistemi konteynere yalnızca tahsis edileni gösterir. Kabın içindeki uygulama, kendisinin tek olduğuna inanıyor ve tam teşekküllü bir işletim sisteminde herhangi bir kısıtlama olmaksızın çalışıyor. Mevcut bir dosyayı değiştirmek veya yeni bir dosya oluşturmak gerekirse, kapsayıcı ana ana bilgisayar işletim sisteminden kopyalar alır ve yalnızca değiştirilen bölümleri kaydeder. Bu nedenle birden fazla konteynerin tek bir ana bilgisayara dağıtılması çok verimlidir.

Konteynerler ve sanal makineler arasındaki fark, konteynerlerin kendi işletim sistemi, kütüphaneler, sistem dosyaları vb. kopyalarını yüklememesidir. İşletim sistemi konteynerle paylaşılıyormuş gibi. Gerekli olan tek ek şey, uygulamayı konteynerde çalıştırmak için gereken kaynaklardır. Sonuç olarak, konteyner birkaç saniye içinde başlar ve sistemi sanal makinelere göre daha az yükler. Docker şu anda depoda 180 bin uygulama sunuyor ve format, Open Container Initiative (OCI) tarafından birleştirildi. Ancak çekirdeğe bağımlılık, konteynerlerin başka bir işletim sistemi üzerinde çalışmayacağı anlamına gelir. Linux kapsayıcıları Linux API'sini gerektirir, dolayısıyla Windows Linux'ta çalışmaz.

Yakın zamana kadar Windows geliştiricileri iki sanallaştırma teknolojisi sunuyordu: sanal makineler ve Server App-V sanal uygulamaları. Her birinin kendi uygulama alanı, artıları ve eksileri vardır. Artık aralık daha da genişledi; Windows Server 2016'da kapsayıcılar duyuruldu. Her ne kadar TP4 zamanında geliştirme henüz tamamlanmamış olsa da, yeni teknolojiyi çalışırken görmek ve sonuçlar çıkarmak zaten oldukça mümkün. MS geliştiricilerinin, hazır teknolojileri yakalayıp ellerinde bulundurarak bazı konularda biraz daha ileri giderek konteynerlerin kullanımının daha kolay ve evrensel hale geldiğini belirtmek gerekir. Temel fark, iki tür konteynerin sunulmasıdır: Windows konteynerleri ve Hyper-V konteynerleri. TP3'te yalnızca ilk olanlar mevcuttu.

Windows kapsayıcıları, işletim sistemiyle birlikte kendi aralarında dinamik olarak paylaşılan bir çekirdek kullanır. Dağıtım süreci (CPU, RAM, ağ) işletim sistemi tarafından üstlenilir. Gerekirse kapsayıcıya tahsis edilen maksimum kullanılabilir kaynakları sınırlayabilirsiniz. İşletim sistemi dosyaları ve çalışan hizmetler, her bir kapsayıcının ad alanıyla eşlenir. Bu tür konteynerler kaynakları verimli bir şekilde kullanarak ek yükü azaltır ve dolayısıyla uygulamaların daha yoğun yerleştirilmesine olanak tanır. Bu mod biraz FreeBSD Jail veya Linux OpenVZ'yi anımsatıyor.

Hyper-V kapsayıcıları, Hyper-V kullanılarak ek bir yalıtım düzeyi sağlar. Her konteynere kendi çekirdeği tahsis edilir ve bellek izolasyonu işletim sistemi çekirdeği tarafından değil, Hyper-V hipervizörü tarafından gerçekleştirilir. Sonuç, sanal makinelerle aynı düzeyde izolasyondur; VM'lerden daha az ek yüke sahiptir, ancak Windows kapsayıcılarından daha fazla ek yüke sahiptir. Bu tür kapsayıcıyı kullanmak için ana makineye Hyper-V rolünü yüklemeniz gerekir. Windows kapsayıcıları, aynı kuruluştaki uygulamaların bir sunucuda çalıştırılması gibi güvenilir bir ortamda kullanıma daha uygundur. Bir sunucu birden fazla şirket tarafından kullanıldığında ve daha yüksek düzeyde izolasyona ihtiyaç duyulduğunda Hyper-V konteynerleri muhtemelen daha anlamlı olacaktır.

Win 2016'daki konteynerlerin önemli bir özelliği, türün oluşturma sırasında değil dağıtım sırasında seçilmesidir. Yani herhangi bir konteyner hem Windows hem de Hyper-V olarak başlatılabilir.

Win 2016'da, gerekli tüm işlevleri uygulayan Konteyner Yönetimi yığın soyutlama katmanı konteynerlerden sorumludur. Depolama için VHDX sabit disk görüntü formatı kullanılır. Kapsayıcılar, Docker'da olduğu gibi depodaki görüntülere kaydedilir. Dahası, her biri tam bir veri kümesini kaydetmez, yalnızca oluşturulan görüntü ile temel görüntü arasındaki farkları kaydeder ve başlatma sırasında gerekli tüm veriler belleğe yansıtılır. Konteyner ile fiziksel ağ arasındaki ağ trafiğini yönetmek için Sanal Anahtar kullanılır.

Container içerisinde işletim sistemi olarak Server Core veya Nano Server kullanılabilir. Birincisi genel olarak uzun süredir yeni değil ve mevcut uygulamalarla yüksek düzeyde uyumluluk sağlıyor. İkincisi, monitör olmadan çalışmaya yönelik daha da basitleştirilmiş bir versiyondur ve sunucuyu Hyper-V, dosya sunucusu (SOFS) ve bulut hizmetleriyle kullanım için mümkün olan minimum yapılandırmada çalıştırmanıza olanak tanır. Elbette grafiksel bir arayüz yok. Yalnızca en gerekli bileşenleri içerir (CoreCLR ile .NET, Hyper-V, Kümeleme vb.). Ancak sonuçta %93 daha az yer kaplıyor ve daha az kritik düzeltme gerektiriyor.

Bir başka ilginç nokta. Konteynerleri yönetmek için geleneksel PowerShell'e ek olarak Docker'ı da kullanabilirsiniz. Yerel olmayan yardımcı programları Win'de çalıştırma olanağı sağlamak için MS, Docker API'sini ve araç setini genişletmek üzere ortaklık kurdu. Tüm gelişmeler Docker projesinin resmi GitHub'unda açık ve mevcuttur. Docker yönetimi komutları hem Win hem de Linux olmak üzere tüm kapsayıcılar için geçerlidir. Tabii ki, Linux'ta oluşturulan bir konteyneri Windows'ta çalıştırmak imkansızdır (ve bunun tersi de geçerlidir). Şu anda PowerShell'in işlevselliği sınırlıdır ve yalnızca yerel bir depoyla çalışmanıza izin verir.

Kurulum Konteynerleri

Azure, kapsayıcıları keşfetmek için dağıtabileceğiniz ve kullanabileceğiniz gerekli Windows Server 2016 Core with Containers Tech Preview 4 görüntüsüne sahiptir. Aksi takdirde her şeyi kendiniz yapılandırmanız gerekir. Yerel kurulum için Win 2016'ya ihtiyacınız vardır ve Win 2016'daki Hyper-V, iç içe sanallaştırmayı desteklediğinden, fiziksel veya sanal bir sunucu olabilir. Bileşen kurulum sürecinin kendisi standarttır. Rol ve Özellik Ekleme Sihirbazı'nda uygun öğeyi seçin veya PowerShell'i kullanarak komutu verin

PS> Kurulum-WindowsÖzellik Kapsayıcıları

İşlem sırasında Sanal Anahtar ağ denetleyicisi de kurulacaktır; hemen yapılandırılması gerekir, aksi takdirde sonraki eylemler bir hata oluşturacaktır. Ağ bağdaştırıcılarının adlarına bakalım:

PS>NetAdapter'ı Al

Çalışmak için Harici tipte bir denetleyiciye ihtiyacımız var. New-VMSwitch cmdlet'inin birçok parametresi vardır, ancak bu örnek uğruna minimum ayarlarla yetineceğiz:

PS> Yeni-VMSwitch -Name Harici -NetAdapterName Ethernet0

Kontrol ediyoruz:

PS> Get-VMSwitch | nerede ($_.SwitchType –eq "Harici")

Windows güvenlik duvarı kapsayıcıya olan bağlantıları engelleyecektir. Bu nedenle, en azından PowerShell uzaktan iletişimini kullanarak uzaktan bağlanabilmek için bir izin verme kuralı oluşturmak gerekir, bunun için TCP/80'e izin vereceğiz ve bir NAT kuralı oluşturacağız:

PS> Yeni-NetFirewallRule -Name "TCP80" -DisplayName "TCP/80 üzerinde HTTP" -Protokol tcp -LocalPort 80 -Eylem İzin Ver -Etkin Gerçek PS> Ekle-NetNatStaticMapping -NatName "ContainerNat" -Protokol TCP -HariciIPAdresi 0.0.0.0 - DahiliIPAdresi 192.168.1.2 -DahiliPort 80 -HariciPort 80

Basit dağıtım için başka bir seçenek daha var. Geliştiriciler, tüm bağımlılıkları otomatik olarak kurmanıza ve ana bilgisayarı yapılandırmanıza olanak tanıyan bir komut dosyası hazırladı. Dilerseniz kullanabilirsiniz. Betiğin içindeki parametreler tüm mekanizmaları anlamanıza yardımcı olacaktır:

PS> https://aka.ms/tp4/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1 PS> C:\Install-ContainerHost.ps1

Başka bir seçenek daha var - hazır bir sanal makineyi konteyner desteğiyle dağıtmak. Bunu yapmak için aynı kaynakta gerekli tüm işlemleri otomatik olarak gerçekleştiren bir komut dosyası vardır. Ayrıntılı talimatlar MSDN'de verilmiştir. Komut dosyasını indirin ve çalıştırın:

PS> wget -uri https://aka.ms/tp4/New-ContainerHost -OutFile c:\New-ContainerHost.ps1 PS> C:\New-ContainerHost.ps1 –VmName WinContainer -WindowsImage ServerDatacenterCore

Adı keyfi olarak belirleriz ve -WindowsImage, toplanan görüntünün türünü belirtir. Seçenekler NanoServer, ServerDatacenter olabilir. Docker da hemen kurulur; yokluğundan veya varlığından SkipDocker ve IncludeDocker parametreleri sorumludur. Başlattıktan sonra görüntünün indirilmesi ve dönüştürülmesi başlayacak, işlem sırasında VM'de oturum açmak için bir şifre belirtmeniz gerekecek. ISO dosyasının kendisi oldukça büyük, neredeyse 5 GB. Kanal yavaşsa, dosya başka bir bilgisayara indirilebilir, ardından WindowsServerTP4 olarak yeniden adlandırılabilir ve C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks konumuna kopyalanabilir. Montaj sırasında belirlenen şifreyi belirterek kurulu sanal makineye giriş yapabilir ve çalışabiliriz.

Artık doğrudan kapsayıcıları kullanmaya geçebilirsiniz.

PowerShell ile kapsayıcıları kullanma

Kapsayıcılar modülü 32 PowerShell cmdlet'i içerir; bunlardan bazıları hala tamamlanmamış olsa da genel olarak her şeyin çalışmasını sağlamak için yeterlidir. Listelemek kolaydır:

PS> Get-Command -modül Konteynerleri

Get-ContainerImage cmdlet'ini, konteynerler - Get-Container'ı kullanarak mevcut görsellerin bir listesini alabilirsiniz. Bir konteyner söz konusu olduğunda, Durum sütunu konteynerin mevcut durumunu gösterecektir: durduruldu veya çalışıyor. Ancak teknoloji geliştirilme aşamasındayken MS bir depo sağlamamıştır ve daha önce de belirtildiği gibi PowerShell şu anda yerel bir depoyla çalışmaktadır, dolayısıyla deneyler için bunu kendiniz oluşturmanız gerekecektir.

Yani desteği olan bir sunucumuz var, şimdi konteynerlerin kendilerine ihtiyacımız var. Bunu yapmak için ContainerProvider paket sağlayıcısını yükleyin.

Devamı yalnızca üyelere açıktır

Seçenek 1. Sitedeki tüm materyalleri okumak için "site" topluluğuna katılın

Belirtilen süre içinde topluluğa üye olmak, TÜM Hacker materyallerine erişmenizi sağlayacak, kişisel kümülatif indiriminizi artıracak ve profesyonel bir Xakep Skoru puanı biriktirmenize olanak tanıyacak!

Mart 2013'te Soloman Hikes, daha sonra Docker olarak anılacak olan açık kaynaklı bir projenin başladığını duyurdu. Sonraki aylarda Linux topluluğundan güçlü bir destek aldı ve 2014 sonbaharında Microsoft, Windows Server 2016'da konteynerleri uygulamaya koyma planlarını duyurdu. Kurucu ortağı olduğum bir şirket olan WinDocks, açık kaynak Docker'ın bağımsız bir sürümünü yayınladı. SQL Server'da birinci sınıf konteyner desteğine odaklanılarak 2016'nın başlarında Windows için. Konteynerler hızla sektörde ilgi odağı haline geliyor. Bu makalede konteynerlere ve bunların SQL Server geliştiricileri ve DBA'lar tarafından kullanımına bakacağız.

Konteyner organizasyonunun ilkeleri

Konteynerler, çok kiracılı uygulamalar için kullanıcı ve süreç izolasyonuyla birleştirilmiş yeni bir paketleme uygulamaları yöntemini tanımlar. Linux ve Windows için çeşitli konteyner uygulamaları uzun yıllardan beri mevcuttur, ancak Windows Server 2016'nın piyasaya sürülmesiyle birlikte fiili bir Docker standardına sahip olduk. Bugün Docker API'si ve kapsayıcı biçimi, herkese açık AWS, Azure, Google Cloud, tüm Linux ve Windows dağıtımlarında desteklenmektedir. Docker'ın zarif yapısı önemli avantajlara sahiptir.

  • Taşınabilirlik. Konteynerler uygulama yazılımı bağımlılıklarını içerir ve geliştiricinin dizüstü bilgisayarında, paylaşılan test sunucusunda ve herhangi bir kamu hizmetinde değişmeden çalışır.
  • Konteyner ekosistemi. Docker API, izleme, günlük kaydı, veri depolama, küme düzenleme ve yönetim çözümleriyle sektördeki yeniliklere ev sahipliği yapar.
  • Kamu hizmetleriyle uyumludur. Konteynerler mikro hizmet mimarileri, ölçeği genişletme ve geçici iş yükleri için tasarlanmıştır. Konteynerler, yama veya yükseltme yerine istenirse çıkarılıp değiştirilebilecek şekilde tasarlanmıştır.
  • Hız ve tasarruf. Kapsayıcıların oluşturulması birkaç saniye sürer; Çoklu abonelik konusunda etkin destek sağlanmaktadır. Çoğu kullanıcı için sanal makinelerin sayısı üç ila beş kat azalır (Şekil 1).

SQL Server Konteynerleri

SQL Server, adlandırılmış örnek çoklu kiralamayı on yıldır desteklemektedir, peki SQL Server kapsayıcılarının değeri nedir?

Gerçek şu ki, SQL Server konteynerleri hızları ve otomasyonları nedeniyle daha pratiktir. SQL Server kapsayıcıları, verilerin ve ayarların saniyeler içinde sağlandığı adlandırılmış örneklerdir. SQL Server kapsayıcılarını saniyeler içinde oluşturma, silme ve değiştirme yeteneği, bunları geliştirme, kalite güvencesi ve aşağıda tartışılan diğer kullanım durumları açısından daha pratik hale getirir.

SQL Server konteynerlerinin hızı ve otomasyonu, onları üretim geliştirme ve QA ortamları için ideal kılar. Her ekip üyesi, yalıtılmış konteynerleri paylaşılan bir sanal makinede çalıştırarak sanal makinelerin sayısını üç ila beş kat azaltır. Sonuç olarak, sanal makinelerin bakımında ve Microsoft lisanslarının maliyetinde önemli tasarruflar elde ediyoruz. Konteynerler, depolama kopyaları ve veritabanı klonları kullanılarak depolama alanı ağı (SAN) dizilerine kolayca entegre edilebilir (Şekil 2).

Bir konteyner örneğinde 1 TB'lık bağlantılı bir veritabanı bir dakikadan kısa sürede oluşturulur. Bu, özel adlandırılmış örneklere sahip sunuculara veya her geliştirici için sanal makinelerin provizyonunu yapmaya kıyasla önemli bir gelişmedir. Bir şirket, 20 adet 400 GB'a kadar SQL Server konteynerine hizmet vermek için sekiz çekirdekli bir sunucu kullanıyor. Geçmişte, her sanal makinenin provizyonu bir saatten fazla sürüyordu ve konteyner örneklerinin provizyonu iki dakika içinde yapılıyordu. Böylece sanal makine sayısını 20 kat azaltmak, işlemci çekirdeği sayısını 5 kat azaltmak ve Microsoft lisansları için ödeme maliyetini keskin bir şekilde azaltmak mümkün oldu. Ayrıca iş esnekliği ve yanıt verme yeteneği de arttı.

SQL Server Kapsayıcılarını Kullanma

Kapsayıcılar, bir kapsayıcı oluşturmak için belirli adımlar sağlayan Dockerfile komut dosyaları kullanılarak tanımlanır. Şekil 1'de gösterilen Docker dosyası, konteynere kopyalanan veritabanları ve seçilen tabloları maskelemek için bir SQL Server betiği ile SQL Server 2012'yi belirtir.

Her konteyner, destek ve günlük dosyalarını içeren düzinelerce veritabanı içerebilir. Veritabanları bir konteynere kopyalanıp çalıştırılabilir veya MOUNTDB komutu kullanılarak monte edilebilir.

Her kapsayıcı, ana bilgisayar kaynaklarından yalıtılmış özel bir dosya sistemi içerir. Şekil 2'de gösterilen örnekte, konteyner MSSQL-2014 ve Venture.mdf kullanılarak oluşturulmuştur. Benzersiz bir ContainerID ve konteyner bağlantı noktası oluşturulur.


Ekran 2. SQL Server 2014 ve Venture.mdf tabanlı kapsayıcı

SQL Server kapsayıcıları yeni bir performans ve otomasyon düzeyi sağlar, ancak davranışları normal adlandırılmış alanlarla tamamen aynıdır. Kaynak yönetimi, SQL Server araçları kullanılarak veya kapsayıcı kaynak sınırları aracılığıyla uygulanabilir (Şekil 3).

Diğer uygulamalar

Konteynerler, geliştirme ve QA ortamlarını organize etmenin en yaygın yoludur, ancak başka kullanımlar da ortaya çıkmaktadır. Felaket kurtarma testi basit ama umut verici bir kullanım durumudur. Diğerleri, SAP veya Microsoft Dynamics gibi eski uygulamalar için dahili SQL Server ortamının kapsayıcıya alınmasını içerir. Destek ve sürekli bakım için bir çalışma ortamı sağlamak amacıyla konteynerli bir arka uç kullanılır. Değerlendirme kapsayıcıları aynı zamanda kalıcı veri depolarına sahip üretim ortamlarını desteklemek için de kullanılır. Gelecek bir yazımda kalıcı verilerden detaylı olarak bahsedeceğim.

WinDocks, bir web arayüzü aracılığıyla konteynerlerin kullanımını daha da kolaylaştırmayı amaçlamaktadır. Başka bir proje, Jenkins veya Team City'yi temel alan CI/CD ardışık düzenleri ile DevOps veya Sürekli Entegrasyon sürecinde SQL Server konteynerlerinin taşınmasına odaklanıyor. Bugün WinDocks Community Edition kopyanızı (https://www.windocks.com) kullanarak Windows 8 ve Windows 10'un tüm sürümlerinde, Windows Server 2012 veya Windows Server 2016'da SQL Server 2008'den başlayarak tüm sürümlere yönelik destekle kapsayıcıları kullanma deneyimini yaşayabilirsiniz. /topluluk-docker-windows).

Konteyner teknolojisinin incelenmesi
Windows Sunucusu 2016

Windows Server 2016'da sunulan dikkat çekici yeni özelliklerden biri de konteyner desteğidir. Onu daha iyi tanıyalım

Modern sistemler uzun zamandır tek işletim sistemi - tek sunucu ilkesinden uzaklaştı. Sanallaştırma teknolojileri, sunucu kaynaklarının daha verimli kullanılmasını mümkün kılar, birden fazla işletim sistemini çalıştırmanıza, bunları kendi aralarında bölmenize ve yönetimi basitleştirmenize olanak tanır. Daha sonra, yalıtılmış uygulamaların ayrı, kolay yönetilen ve ölçeklenebilir bir bileşen olarak konuşlandırılmasına olanak tanıyan mikro hizmetler ortaya çıktı. Docker her şeyi değiştirdi. Bir uygulamayı çevreyle birlikte teslim etme süreci o kadar basitleşti ki, son kullanıcının ilgisini çekmekten başka çaresi kalmadı. Konteynerin içindeki uygulama sanki tam teşekküllü bir işletim sistemi kullanıyormuş gibi çalışıyor. Ancak sanal makinelerin aksine, işletim sisteminin, kitaplıkların, sistem dosyalarının vb. kendi kopyalarını yüklemezler. Kapsayıcılar, uygulamanın gerekli tüm kaynaklara erişebildiği ancak bunların ötesine geçemediği yalıtılmış bir ad alanı alır. Ayarları değiştirmeniz gerekiyorsa yalnızca ana işletim sistemiyle olan farklılıklar kaydedilir. Bu nedenle konteyner, sanal makinelerin aksine çok hızlı bir şekilde başlatılır ve sisteme daha az yük getirir. Konteynerler sunucu kaynaklarını daha verimli kullanır.

Windows'ta kapsayıcılar

Windows Server 2016'da, mevcut sanallaştırma teknolojilerine (Hyper-V ve Server App-V sanal uygulamaları) ek olarak, gerekli tüm işlevleri uygulayan Konteyner Yönetimi yığın soyutlama katmanı aracılığıyla uygulanan Windows Server Containers konteynerleri için destek eklenmiştir. Teknoloji, Teknik Önizleme 4'te duyuruldu, ancak o zamandan beri basitleştirme yönünde çok şey değişti ve daha önce yazılan talimatları okumanıza bile gerek yok. Aynı zamanda, iki tür "onların" konteyneri önerildi - Windows konteynerleri ve Hyper-V konteynerleri. Muhtemelen başka bir ana fırsat da konteynerleri yönetmek için PowerShell cmdlet'lerine ek olarak Docker araçlarını kullanmaktır.

Windows kapları prensip olarak FreeBSD Hapishanesi veya Linux OpenVZ'ye benzer; işletim sistemiyle birlikte diğer kaynaklarla (RAM, ağ) kendi aralarında paylaşılan bir çekirdek kullanırlar. İşletim sistemi ve hizmet dosyaları her bir kapsayıcının ad alanına yansıtılır. Bu tür konteynerler kaynakları verimli bir şekilde kullanarak ek yükü azaltır ve dolayısıyla uygulamaların daha yoğun yerleştirilmesine olanak tanır. Temel kapsayıcı görüntüleri düğümle aynı çekirdeğe "sahip olduğundan" sürümlerinin eşleşmesi gerekir, aksi takdirde çalışma garanti edilmez.

Hyper-V konteynerleri ek bir izolasyon düzeyi kullanır ve her konteynere kendi çekirdeği ve belleği tahsis edilir. Yalıtım, önceki türden farklı olarak, işletim sistemi çekirdeği tarafından değil, Hyper-V hipervizörü tarafından gerçekleştirilir (Hyper-V rolü gereklidir). Sonuç, sanal makinelerden daha düşük ek yük, ancak Windows kapsayıcılarından daha fazla yalıtımdır. Bu durumda, konteyneri çalıştırmak için aynı işletim sistemi çekirdeğine sahip olun. Bu kapsayıcılar Windows 10 Pro/Enterprise'da da dağıtılabilir. Konteyner türünün oluşturma sırasında değil, dağıtım sırasında seçildiğini özellikle belirtmekte fayda var. Yani herhangi bir kapsayıcı hem Windows hem de Hyper-V sürümü olarak başlatılabilir.

Kap, işletim sistemi olarak kesilmiş Sunucu Çekirdeği veya Nano Sunucuyu kullanır. İlki Windows Sever 2008'de ortaya çıktı ve mevcut uygulamalarla daha fazla uyumluluk sağlıyor. İkincisi, Sunucu Çekirdeği ile karşılaştırıldığında çok daha sadedir ve monitör olmadan çalışacak şekilde tasarlanmıştır; bu, sunucuyu %93 gerektiren Hyper-V, dosya sunucusu (SOFS) ve bulut hizmetleriyle kullanım için mümkün olan minimum yapılandırmada çalıştırmanıza olanak tanır. daha az alan. Yalnızca en gerekli bileşenleri içerir (CoreCLR ile .Net, Hyper-V, Kümeleme vb.).

Depolama için VHDX sabit disk görüntü formatı kullanılır. Kapsayıcılar, Docker'da olduğu gibi depodaki görüntülere kaydedilir. Üstelik her biri veri kümesinin tamamını kaydetmez, yalnızca oluşturulan görüntü ile temel görüntü arasındaki farkları kaydeder. Ve başlatma anında gerekli tüm veriler belleğe yansıtılır. Sanal Anahtar, konteyner ile fiziksel ağ arasındaki ağ trafiğini yönetmek için kullanılır.