Yeni Baslayanlar Icin Windows Server 2016 Uzerinde Docker

Windows 10 ve Windows 2016 Server ile beraber Docker artik dogal olarak destekleniyor farkli bir sanallastirma yazilimina (virtualbox gibi) ihtiyac duyulmadan. Hatta Microsoft Docker On Windows degil, Docker artik Windows’un dogal bir parcasi olarak adlandiriyor.

Windows 10 development , Windows Server 2016’da production icin oneriliyor. Windows 10 kullanicilarinin Professional veya Enterprise (Anniversary Edition) kullanmalari gerekiyor.

Microsoft 2016 Server ile beraber iki tip Container desteklemeye basladi bunlardan biri Windows Server Container diger ise Hyper-V Container.

Hyper-V Container dedigimiz sey aslinda bir Hyper-V uzerinde yaratilmis sanal bir sunucu ve icersinde calisan Container. Soyle bir gecmise donersek Containerlar ciktiginda hep daha guvenli olsun diye bir sanal makiner icersinde calisirsa iyi olur, tam izolasyon olur durumlari vardi , halen bu yaklasim guncelligini koruyor.  Hyper-V Container kullanabilmek icinde haliyle Hyper-V role’unun kurulu olmasi gerekiyor. Keza Microsoft’da musterilerinin development icin Windows Container , production icin Hyper-V kullandigini soyluyor.

Windows Server Container‘da bizim host uzerinde kosacak, yine izole processler olacak, resimlersek Windows Server Container gordugunuz gibi Container Host uzerindeki Windows Kernal’i kullanirken , Hyper-V Containerlarin her biri tekil Windows Kernel uzerinde kosacaklar.

Microsoft Docker On Windows degil, Docker artik Windows’un dogal bir parcasi olarak adlandiriyor demistim , bunun sebebi su, Docker linux uzerinde halihazirda olan bircok ozelligi kullanaraktan “bunlar –> linux kernal virtualisation , cgroup , namespace , aufs ve digerleri ” bu isi yaparken Windows ile boyle bir yapiyi desteklemek soz konusu degildi fakat iki senelik Docker ile Microsoft’un calismalari sonrasi Windows kernel’i artik Linux kernel’in Docker calistirabilmek icin sahip oldugu neyi varsa kendiside buna sahip oldu. Computer Service diye adlandirilan kisimda linux’daki containerd ile runc

Linux’dan bakinca yapi 

Windows’dan bakinca yapi

Windows uzerinde Docker calistirabilmek icin Windows 2016 Server uzerinde yeni bir servis var, adi Containers diye

PS C:\Users\Administrator> Get-WindowsFeature -Name *Container*
Display Name                                            Name                       Install State
————                                            —-                       ————-
[ ] Containers                                          Containers                     Available
Dilerseniz bu feature’i kurabilirsiniz oncesinde fakat bu Docker calistirmak icin yeterli degil bunu yerine farkli bir yol izleyecegiz.
Once OneGet diye bir module var, kendisi web tabanli bir repo , uygulamalari bu repo uzerinden sorgulayabilir ve kurulumunu yapabilirsiniz. Kendisine ek olarak alt repolarda destekleyebiliyor mesela NuGet gibi . Daha fazlasi icin buraya bakabilirsiniz.
Simdi DockerMsftProvider modulunu kuracagiz, bu powershell module sayesinde docker kurulumunu gerceklestirecegiz  ;
PS C:\Users\Administrator> Find-Module -Name DockerMsftProvider
Version    Name                                Repository           Description
——-    —-                                ———-           ———–

1.0.0.1    DockerMsftProvider                  PSGallery            PowerShell module with commands for discovering, installing, and updating Docker images.

DockerMsftProvider Modulunu Kuralim (Burada -Force kullanmamizin nedeni ilgili reponun trusted olmadigini soyleyen bir uyari ekrani olacak, onu pas gecemek icin kullanacagiz. Bu arada Repo olarakta PSGallery kullandik ama o sart degil cunku ilgili module sadece bu repo altinda, zorunlu degil ama belirtmekte fayda olabilir gelecekte belki cakisan seyler olabilir);

 

PS C:\Users\Administrator> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Simdi son model Docker kuralim Windows 2016 Server uzerine
PS C:\Users\Administrator> Install-Package -Name docker -ProviderName DockerMsftProvider 
Eger detay almak isterseniz konut satirinin arkasina -Verbose ekleyin. Ornek cikti su sekilde olacakti ;

Bu cikti biraz eksik :((( oncesinde bir Ctrl+C yapmisligim var 🙂 Ama sonuc olarak kendisi hem Containers Feature kuruyor , docker download ediyor , bu arada dikkat edin 17.03.0-ee yani community edition degil enterprise edition indiriyor ve servis seklinde calismak icin ilgili konfigrasyonu yapip bitiriyor.

Windows 2016 Server kullanicilari icin guzel olan sey direkt Docker tarafindan destek alabileceksiniz.

Bu arada benim uzerinde oynadigim sunucu uzerinde tum Firewall ayarlari disable durumda, fakat docker ayni zamanda windows firewall yonetebilir durumda, expose edeceginiz portlari firewall uzerine otomatik girebiliyor.

Bu islemden sonra makineyi restart edebilirsiniz, unutmadan Windows Server 2016 acildiktan sonra Windows Update’leri kontrol edip , uygulayin. Artik bildigimiz bir ortamdayiz , ilgili imajlari cekecegiz ve calistiracagiz.
PS C:\Users\Administrator> docker pull microsoft/nanoserver
Using default tag: latest
latest: Pulling from microsoft/nanoserver
bce2fbc256ea: Pull complete
58f68fa0ceda: Pull complete
Digest: sha256:fc60bd5ae0e61b334ce1cf1bcbf20c10c36b4c5482a01da319c9c989f9e6e268
Status: Downloaded newer image for microsoft/nanoserver:latest
Klasik ping testi
PS C:\Users\Administrator> docker run microsoft/nanoserver ping 8.8.8.8
Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=63ms TTL=44
Reply from 8.8.8.8: bytes=32 time=59ms TTL=44
Reply from 8.8.8.8: bytes=32 time=58ms TTL=44
Reply from 8.8.8.8: bytes=32 time=58ms TTL=44
Nanoserver lisanslamasi hakkinda bir bilgi 🙂
  • How do I license Nano Server?
    Nano Server is a deployment option within Windows Server 2016. It is included as part of the licensing of the edition from which it is deployed. There is no unique or separate licensing for Nano Server.
Araya bir not ilistirelim , Windows Server 2016 uzerinde linux kosturamiyoruz , haliyle cross-platform destegi soz konusu degil. Yani ne linux uzerinden bir imaji alip windows uzerinde nede windows uzerinde aldigimiz bir imaji Linux uzerinde calistiramiyoruz. Buna Windows 10 dahil degil , Linux veya Windows Container arasinda gecis yapabiliyorsunuz.
Hemen bir not daha, normalde ilk kez Windows Containers sozunu isittigimde bunu Docker’dan bagimsiz birsey oldugunu dusunurken, tum dokumanlarda genelde direkt Docker kurulumu yapildigindan sanki Windows Containers Docker icin yaratilmis gibi bir hissiyat doguyor fakat boyle degilmis. Gelecekte farkli uygulamalar ciktiginda gorecegiz mesela rkt veya farkli birsey cikar mi gorecegiz.
Simdi farkli testler yapabilmek icin IIS’li imajlari indirelim , burada dikkat etmemiz gereken konu eger .Net Core kullanarak bir gelistirme yapmis veya yapicaksaniz nanoserver/iis , .Net Full gerektiren bir uygulamaniz var ise bukez microsoft/iis imajini indirmelisiniz. Isterseniz farkli tag‘larida kullanabilirsiniz. Bu paketler iclerinde ayni zamanda isletim sistemlerinide iceriyorlar.
Not : Ilgili tum paketleri Microsoft guncelliyor , MongoDB ve golang imajlarini ise Microsoft icin Docker guncelliyor.
Windows uzerinde Docker calistirdik fakat birde bunun network tarafi var, basit olarak dusunursek linux uzerinde varsayili olarak bir bridge yaratiliyordu (istenir ise birden fazla bridge yaratilabilir ve her biri icin farkli ip adres araliklari kullanilabilir), ek internal bir ip adres araligi belirleniyordu ve iptables ile NAT islemine tabi tutularaktan Container’lar internete cikabiliyordu veya internetden erisilebiliyordu. Simdi bunu Windowscasina bakalim.
Yukardaki bilesenlerin Windows versionlarini dusunursek bridge –> Hyper-V Internal Switch olacaktir , fakat iptables NAT islemini tam karsiligi yok(idi). Burada WinNAT devreye giriyor. Microsoft WinNAT’i Docker’in linux uzerinde container’lara sagladigi bridge network , ip adres araligi ve NAT’lama islemleri icin sisteme eklemis gibi duruyor.
Yapilmasi Gereken Islem Su Sirasiyla ;
  • NAT Virtual Network’u yaratmamiz ki bu Hyper-V Internal Switch’e denk geliyor
  • Sonrasinda bir NAT Gateway yaratmak gerekiyorki , yani linux’da yaratilan ve gw olarak calismasi icin bridge interface’e atanan ip adresi
  • Ve en sonunuda bir NAT Objesi yaratmamiz gerecek ki buda iptables nat kurallarina denk geliyor.
Docker burada bu islemi otomatiklestirmis , yani sizin icin gerekli olan tum adimlari kendisi gerceklestiriyor, bakalim.
Get-VMSwitch veya docker network ls dedigimizde nat adinda bir internal switchin otomatik olarak yaratildigini gorecegiz.

PS C:\Users\Administrator> Get-VMSwitch

Name SwitchType NetAdapterInterfaceDescription
—- ———- ——————————
nat Internal

PS C:\Users\Administrator> docker network ls
NETWORK ID NAME DRIVER SCOPE
4ba4a619e882 nat nat local
69662ad07a2f none null local

Yeni bir interface goruyoruz oncelikle , vEthernet (HNS Internal NIC) bunu bridge interface olarak dusunun veya yukarda belirttigimiz gibi containerlar icin network gateway olacak.
ve NAT objesi , buradan anliyoruzki 172.17.0.0/20 blogu container ve sanal makineler icin yaratilmis.

PS C:\Users\Administrator> get-netnat

Name : H333cd626-7d53-43f8-a91d-c6e1f15ff959
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 172.17.0.1/20
IcmpQueryTimeout : 30
TcpEstablishedConnectionTimeout : 1800
TcpTransientConnectionTimeout : 120
TcpFilteringBehavior : AddressDependentFiltering
UdpFilteringBehavior : AddressDependentFiltering
UdpIdleSessionTimeout : 120
UdpInboundRefresh : False
Store : Local
Active : True

Burada farkli bir komutlada bunu dogrulayabiliriz

PS C:\Users\Administrator> Get-ContainerNetwork

Name Id Subnets Mode SourceMac DNSServers DNSSuffix
—- — ——- —- ——— ———- ———
nat 333cd626-7d53-43f8-a91d-c6e1f15ff959 {172.17.0.0/20} NAT

NAT’in calisabilmesi icin tabi birde external ip veya ip adresleri olmasi lazimki bu networkteki containerlar veya sanal sunucular internete cikabilsin

PS C:\Users\Administrator> Get-NetNatExternalAddress

ExternalAddressID : 0
NatName : H333cd626-7d53-43f8-a91d-c6e1f15ff959
IPAddress : 94.102.69.206
PortStart : 16359
PortEnd : 16368
Active : True

ExternalAddressID : 1
NatName : H333cd626-7d53-43f8-a91d-c6e1f15ff959
IPAddress : 94.102.69.206
PortStart : 707
PortEnd : 716
Active : True

ExternalAddressID : 1000000
NatName : H333cd626-7d53-43f8-a91d-c6e1f15ff959
IPAddress : 0.0.0.0
PortStart : 0
PortEnd : 65535
Active : True

Ve son nokta 
Simdi windows server core uzerinde IIS calistiralim 
C:\Users\Administrator> docker run –rm -d -p 80:80 microsoft/iis
75d0dd88b689b3b60eb647896be875304f6e6c8809d066192de85f5f0631a2f
C:\Users\Administrator>
Tum komut satirini gorelim
C:\Users\Administrator> docker ps –no-trunc
ONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
75d0dd88b689b3b60eb647896be875304f6e6c8809d066192de85f5f0631a2f microsoft/iis “C:\\ServiceMonitor.exe w3svc” 13 minutes ago Up 12 minutes
0.0.0.0:80->80/tcp elegant_volhard
Asagida gorebileceginiz gibi , 80 numarali port icin internetden gelecek tum baglantilar 172.17.14.31 adresli container’in 80 numarali portuna iletilmesi icin gerekli DNAT tanimlari yapilmis durumda.

PS C:\Users\Administrator> Get-NetNatStaticMapping

StaticMappingID : 8
NatName : H333cd626-7d53-43f8-a91d-c6e1f15ff959
Protocol : TCP
RemoteExternalIPAddressPrefix : 0.0.0.0/0
ExternalIPAddress : 0.0.0.0
ExternalPort : 80
InternalIPAddress : 172.17.14.31
InternalPort : 80
InternalRoutingDomainId : {00000000-0000-0000-0000-000000000000}
Active : True

WinNAT‘in bir takim limitasyonlari var , bunlardan biri birden fazla NAT Network tanimlayamamak gibi, haliyle eger 300 container calistiracaksaniz private networkunuz /24 olmamali gibi, bunu disinda host uzerinden containerlara erismek icin mutlaka private ip kullanmak gerektigi gibi. Okumak icin buraya tiklayin.
Bu arada Wireless Interface’i olanlarda birtakim problemler oldugu loglanmis , bunlara dikkat etmek lazim.
Windows 2016 Server ve Docker halen tum linux uzeride calisan docker ozelliklerini karsilamiyor , ornegin Docker Swarm Mode destegi yok.
Docker Swarm Mode ozelinde enteresan olan sey Windows 2016 Server desteklememesine ragmen Windows 10’un bunu destekliyor olmasi 🙂 Baslangic noktasi diyelim fakat docker info dediginizde ilginctir overlay network destegim var gibi gozukuyor.
Burada birkac kelimede Docker Tools for Visual Studio icin sarfetmek lazim, lokalinizde host ettiginiz Container uzerinde satir satir debug calistirmaniza imkan sagliyor (F5)  ek olarak docker imajini devamli rebuild etmeye gerek kalmadan direk edit edebiliyorsunuz (CTRL+F5) Nasil mi ?
Birazda disk olaylarina bakalim , Linux’daki varsayili aufs storage driver’inin yerini burada windowsfilter storage driver’i almis durumda.
PS C:\Users\Administrator> docker info | findstr.exe Storage
Storage Driver: windowsfilter
Data nerede diye soracak olur isek kisa cevap hepsi C:\ProgramData\docker\windowsfilter altinda fakat nerede oldugunu bulmak istiyorsak asagidaki komutu calistirabilirsiniz. c2 Container id’nin ilk iki harfi asli c2a19303042d.
PS C:\Users\Administrator> docker inspect c2 -f “{{.GraphDriver.Data}}”
map[dir:C:\ProgramData\docker\windowsfilter\c2a19303042d41733791ea2362b386145e36a6a507697a3fd2fdbd4184955017]
Direkt ilgili dizine gidelim , senlik 🙂
Burada anlatmaya deger olan iki sey var , biri sandbox.vhdx , digeri layerchain.json dosyasi. Eger girdiginiz dizin container degil iis , nanoserver imaji ise bu dizinlerde sandbox.vhdx goremeyeceksiniz fakat ekstra files adi verilen bir dizinle karsilasacaksiniz.
Evet, layerchain.json dosyasini actiginizda o container artik hangi imaj ile acilmis ise ona olan linkleri goreceksiniz.

Diger sandbox.vhdx ise fix 20 GB dan olusmus dinamik bir vhdx dosyasi , kendisi container kapatip acildiginda ucacak olan kisim.

Ek olarak isterseniz bir drive atayip , Windows sunucu (Container Host) uzerindede ulasabilirsiniz container disk alanina.

Simdide task manager ile bir bakalim bu container’lar host uzerinde ne sekilde duruyorlar ;
Task manage’i actigimizda CExecSvc.exe diye iki adet process goreceksiniz , bunlar Container Execution Agent olarak gozukuyorlar , size windows server container yarattikca bunlarin sayisi artacak, bunla beraber dikkat ederseniz bir adet’de Username’i belli olmayan bir process var 🙂 Bu aslinda windows server container uzerinde calistirilan cmd.exe , daha derinden bakalim
Task manager’i acin ve Name-PID-Status barinda sag tus yapip “Job Object ID” kutucugunu secip ok dugmesine tiklayin ve Job Object ID’e gore siralayin
Bendeki ornekte 1000 ve 800 ID li process ler var , bunlar aslinda Windows Server Container uzerindeki calisan process ler.
Container uzerinden bakmak isterseniz asagidaki komutu kullanabilirsiniz.

PS C:\Users\Administrator> docker exec c2 powershell -command get-process

Peki hanigisi hangi windows server container ? Asagidaki komutu kullandiginizda c2 ile baslayan container’in Entrypoint olarak set edilmis process’in PID numarasini ogrenmis olacaksiniz , boylece arada baglanti kurmaniz mumkun olacaktir.

PS C:\Users\Administrator> docker inspect c2 -f “{{.State.Pid}}”
6320
Network kismina tekrardan geri donelim ;
Elimizde 172.17.0.0/20 diye bir network vardi , simdi Docker’i durduralim ve bu network’u silelim.
  • Stop-Service docker (docker’i durduruyoruz)
  • Remove-ContainerNetwork -Name nat -Force (otomatik yaratilan network’u siliyoruz)
  • Dilerseniz cross-check yapalim sirasiyla ilgili komutlari calistirin (get-netnat/Get-NetNatExternalAddress/Get-NetNatStaticMapping) hicbir kayit olmamli hatta
  • Start-Service docker (docker’i baslatalim)
  • Get-ContainerNetwork (yeni bir private ip blogunun yaratildigini goreceksiniz 172.23.80.0/20)
Simdi bir adim ileri gidip bu isi Docker’in bizim icin otomatik olarak yapmasinda, biz elle yapalim 
  • Stop-Service docker
  • Get-ContainerNetwork | Remove-ContainerNetwork -Force
  • C:\ProgramData\Docker\config\ dizin altinda yok ise daemon.json dosyasini yaratin
  • C:\ProgramData\docker\config>type nul > daemon.json
  • icersine {“bridge”:”none”} ekleyin
  • Get-ContainerNetwork dediginizde herhangi birsey gormeyeceksiniz, yaratalim 🙂
  • docker network create -d nat –subnet=10.0.0.0/24 –gateway=10.0.0.1 TestNetwork
    • Burada yapilanlar arka tarafta aslinda (xyz deyimi rastgele bir isim yerini tutuyor) ;
      • New-VMSwitch –SwitchName “xyz” –SwitchType Internal
      • New-NetIPAddress –IPAddress 10.0.0.1 -PrefixLength 24 -InterfaceAlias “xyz”
      • New-NetNat –Name TestNetwork –InternalIPInterfaceAddressPrefix 10.0.0.0/24
  • docker run -it –network=TestNetwork microsoft/nanoserver cmd (dikkat –network parametresini belirtmezseniz ip alamayacaksiniz)
  • docker run -it –network=TestNetwork microsoft/nanoserver cmd
  • ping 8.8.8.8
  • Eger burada herhangi bir port expose etmis olsaydik oda aslinda arkada su sekilde olmus olacakti.
    • Add-NetNatStaticMapping -NatName “TestNetwork” -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 10.0.0.145 -InternalPort 80 -ExternalPort 8080
Evet en sonundada guzel bir komutla  veda edelim 🙂
C:\Users\Administrator>docker system prune
WARNING! This will remove:
– all stopped containers
– all volumes not used by at least one container
– all networks not used by at least one container
– all dangling images
Are you sure you want to continue? [y/N] y
Deleted Containers:
905fa6493e01b25cf60e3297e011f012ecd194598e4a72696dc6ba55818b6623
977ea271d39e2c7bffb28946121eeb537d48c17668cc0760891220c50352c676
94de892d0e04137709975fca04bbfb0524b9c2a62e53d4015e963209eb8b9e7f
de2e29cd6658367ed1c941c38e961b6c7f6ad2c09b85081f43ff164a8a1d9e12
43cb0ee25669a75db48ee7860611ff55a23b772e62978c789a79d85f12dfb37c
c2a19303042d41733791ea2362b386145e36a6a507697a3fd2fdbd4184955017
26657dec962bb23c95777602a0f11130e65a061d32b59b0b65ead5ee26eb7020Deleted Networks:
TestNetwork

Total reclaimed space: 0 B

Guzel Linkler ve Takip Edilmesi Gereken Bloglar
Advertisements

Posted on 14/04/2017, in on windows and tagged , , , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. 1 Comment.

  1. Windows ile Docker için iyi bir başlangıç olmuş
    Teşekkürler

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: