- Praktický úvod do Docker a kontejnerů (1) – od instalace po první kontejnery
- Praktický úvod do Docker a kontejnerů (2) – propojování
- Praktický úvod do Docker a kontejnerů (3) – víc najednou aneb něco užitečného s Docker Compose
- Praktický úvod do Docker a kontejnerů (4) – jak z nich získat maximum
- Praktický úvod do Docker a kontejnerů (5) – Docker Machine
- Praktický úvod do Docker a kontejnerů (6) – cluster hostitelů s Docker Swarm
- Praktický úvod do Docker a kontejnerů (7) – scheduler v Docker Swarm
- Praktický úvod do Docker a kontejnerů (8) – váš vlastní registr obrazů
- Praktický úvod do Docker a kontejnerů (9) – multi-host networking
- Praktický úvod do Docker a kontejnerů (10) – Windows kontejnery s Docker API
- Praktický úvod do Docker a kontejnerů (11) – Windows kontejnery s PowerShell
- Praktický úvod do Docker a kontejnerů (12) – Windows Hyper-V kontejner
- Praktický úvod do Docker a kontejnerů (13) – Swarm mode, service, balancing, scaling (v1.12)
Minule jsme vyzkoušeli Microsoft kontejnery přes Docker ovládání. Dnes si zkusíme metodu pro Windows zastánce – PowerShell.
Windows kontejnery s PowerShell
V následujícím návodu uděláme přesně to samé jako v minulém díle, ale tentokrát místo Docker CLI použijeme PowerShell. Nejsem expert na toto rozhranní, ale co jsem zatím viděl naznačuje, že se jedná o poměrně mocný skriptovací, možná až programovací, jazyk. Například jsem jednou potřeboval vytvořit dost bohatou strukturu uživatelů, organizačních jednotek a skupin v Active Directory s více jak tisíci členy a několika hierarchickými úrovněmi (šlo o testování 802.1X politik). V PowerShell stačilo pár řádek kódu a několik desítek vteřin a auž byla celá struktura s více i méně náhodnými účty vytvořena. Pokud se chystáte pracovat s kontejnery jen ve Windows prostředí, dává PowerShell asi největší smysl.
Nejprve si spustíme PowerShell.
c:\>powershell
Vypišme si image pro kontejnery.
PS C:\> Get-ContainerImage Name Publisher Version IsOSImage ---- --------- ------- --------- WindowsServerCore CN=Microsoft 10.0.10586.0 True
Vytvořme si teď nový kontejner s názvem kontik.
PS C:\> New-Container -Name kontik -ContainerImageName WindowsServerCore Name State Uptime ParentImageName ---- ----- ------ --------------- kontik Off 00:00:00 WindowsServerCore
Kontejner je vytvořen, ale neběží. Spustíme ho.
PS C:\> Start-Container -Name kontik
Ověřte to.
PS C:\> Get-Container Name State Uptime ParentImageName ---- ----- ------ --------------- kontik Running 00:00:22.3220000 WindowsServerCore
Kontejner je vytvořen a běží. Pojďme teď do něj skočit a to přímo do PowerShell session jako Administrator.
PS C:\> Enter-PSSession -ContainerName kontik -RunAsAdministrator
Všimněte si, že hranaté závorky indikují název kontejneru, ve kterém se nacházíme. Pojďme tedy nainstalovat v tomto kontejneru IIS web server.
[kontik]: PS C:\Windows\system32> Install-WindowsFeature web-server Success Restart Needed Exit Code Feature Result ------- -------------- --------- -------------- True No Success {Common HTTP Features, Default Document, D...
Přidejte novou stránku.
[kontik]: PS C:\Windows\system32> cd C:\inetpub\wwwroot\ [kontik]: PS C:\inetpub\wwwroot> echo "Muj super server" > index.html [kontik]: PS C:\inetpub\wwwroot> exit
Zastavíme kontejner.
PS C:\> Stop-Container -Name kontik
Provedeme teď ekvivalent příkazu docker commit, tedy aktuální stav kontejneru chceme transformovat na image.
PS C:\> New-ContainerImage -ContainerName kontik -Name mujwebimage -Publisher tomas -Version 1.0 Name Publisher Version IsOSImage ---- --------- ------- --------- mujwebimage CN=tomas 1.0.0.0 False
Budeme používat webovou aplikaci a na hostiteli nám běží firewall. Stejně jako v předchozím díle musíme vytvořit příslušné firewall pravidlo, abychom se na dobouchali dovnitř na portu 80.
PS C:\> if(!(Get-NetFirewallRule | where {$_.Name -eq 'TCP80'})) { New-NetFirewallRule -Name 'TCP80' -DisplayName 'HTTP on TC P/80' -Protocol tcp -LocalPort 80 -Action Allow -Enabled True } Name : TCP80 DisplayName : HTTP on TCP/80 Description : DisplayGroup : Group : Enabled : True Profile : Any Platform : {} Direction : Inbound Action : Allow EdgeTraversalPolicy : Block LooseSourceMapping : False LocalOnlyMapping : False Owner : PrimaryStatus : OK Status : The rule was parsed successfully from the store. (65536) EnforcementStatus : NotApplicable PolicyStoreSource : PersistentStore PolicyStoreSourceType : Local
Zkontrolujme, že je náš image k dispozici.
PS C:\> Get-ContainerImage Name Publisher Version IsOSImage ---- --------- ------- --------- WindowsServerCore CN=Microsoft 10.0.10586.0 True mujwebimage CN=tomas 1.0.0.0 False
Nastartujte teď nový kontejner, ale tentokrát už mu chceme dopřád síťovou konektivitu (v předchozím kontejneru nebyla síťovka).
PS C:\> New-Container -Name web -ContainerImageName mujwebimage -SwitchName "Virtual Switch" Name State Uptime ParentImageName ---- ----- ------ --------------- web Off 00:00:00 mujwebimage
Nastartujte ho.
PS C:\> Start-Container -Name web
Pojďme teď v kontejneru spustit příkaz ipconfig, abychom zjistili, jakou má IP adresu.
PS C:\> Invoke-Command -ContainerName web {ipconfig} Windows IP Configuration Ethernet adapter vEthernet (Virtual Switch-DECBF9C2-6322-4C45-A244-91D31A3DBE7F-0): Connection-specific DNS Suffix . : jwzvciyr4n3ehffeswngadvyme.ax.internal.cloudapp.net Link-local IPv6 Address . . . . . : fe80::2897:dce3:16ba:7709%18 IPv4 Address. . . . . . . . . . . : 172.16.0.2 Subnet Mask . . . . . . . . . . . : 255.240.0.0 Default Gateway . . . . . . . . . : 172.16.0.1
Teď potřebujeme vytvořit NAT s port forwardingem tak, že port 80 v kontejneru bude dostupný zvenku na IP adrese hostitele
PS C:\> if (!(Get-NetNatStaticMapping | where {$_.ExternalPort -eq 80})) {Add-NetNatStaticMapping -NatName "ContainerNat" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.16.0.2 -InternalPort 80 -ExternalPort 80} StaticMappingID : 0 NatName : ContainerNat Protocol : TCP RemoteExternalIPAddressPrefix : 0.0.0.0/0 ExternalIPAddress : 0.0.0.0 ExternalPort : 80 InternalIPAddress : 172.16.0.2 InternalPort : 80 InternalRoutingDomainId : {00000000-0000-0000-0000-000000000000} Active : True
Máme hotovo – když si teď otevřete prohlížeč a zadáte IP adresu vašeho hostitele, uvidíte web server běžící v kontejneru.