# IIS im Windows Docker Container
# Ersteller: Dr. Holger Schwichtenberg, www.IT-Visions.de

# Image IIS 
# https://hub.docker.com/r/microsoft/iis/ (basiert auf Windows Server Core)
# Alternatives Image ASP.NET Core 2.0
# https://hub.docker.com/r/microsoft/aspnetcore/

#siehe auch "Docker windows mode breaks Hyper-V vEthernet (Default Switch)"
#https://github.com/docker/for-win/issues/1166

# region Aufräumen: Alle IIS-Container löschen
docker stop $(docker ps -a -q -f name=IIS*)
docker rm $(docker ps -a -q -f name=IIS*)
docker ps -a -q -f name=IIS*

# falsch: Get-Container IIS*
# falsch: Get-container | where Names -like "IIS*"
Get-container | where Names -like "/IIS*" 
Get-container | where Names -like "/IIS*" | Stop-Container
Get-container | where Names -like "/IIS*" | Remove-Container 

Get-container 
Get-container | Stop-Container
Get-container | Remove-Container 
#endregion


#region ------------- Vorab ausgeführt
# Vor dem ersten Pull: Ist schon was da?
(Dir C:\ProgramData\docker\windowsfilter -Recurse | Measure-Object -Sum Length).Sum / 1GB

docker pull microsoft/windowsservercore:1709 # Server Core Base Images "v2" ~5.5 GB --> 17.3 GB :-(
docker pull microsoft/iis                    # basiert auf Server Core Base Images "v1" ~5.5 GB
docker pull microsoft/nanoserver:1709        # Nano Server V2 ~235 MB
#docker pull nanoserver/iis --> das ist ein Image für den Nano Server v1, der läuft nicht auf Server 1709 :-(
docker pull microsoft/iis:windowsservercore-1709 #https://github.com/Microsoft/iis-docker/blob/master/windowsservercore-1709/Dockerfile
#endregion

#region ------------- Bestand anzeigen
docker images
Get-ContainerImage
docker ps 
Get-Container
docker ps -a
#endregion

#region ---------------- IIS-Container im Hintergrund mit Portmapping
docker run -d -p 8111:80 --name IIS1 microsoft/iis 
docker run -d  --name IIS2 microsoft/iis 
get-container
explorer http://localhost:8111
docker container top IIS1 # Display the running processes of a container
get-process w3wp* # Host sieht IIS-Prozess, wenn NICHT Hyper-V-Isolation!
get-process *vmwp* # Host sieht diesen Prozess nur bei Hyper-V-Isolation
docker container stats # Display a live stream of container(s) resource usage statistics
docker inspect --format="{{.HostConfig.Isolation}}" IIS1 # hyperv oder process
docker inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' IIS1
docker exec -it IIS1 cmd
#endregion

#region ---------------- Demos auf Windows Server Core 1709
#docker run -d -p 8111:80 --name IIS3  nanoserver/iis --isolation=hyperv # nicht kompatibel :-(
docker run -it microsoft/nanoserver:1709 cmd # da ist kein PowerShell drin!!! 
# dann: echo %computername% und echo %username%
 
# Windows Server Container (unter Windows Server), aber Hyper-V Container (unter Windows 10)
docker run -d -p 8111:80 --name IIS1 microsoft/iis:windowsservercore-1709
# expliziter Hyper-V Container 
docker run -d -p 8111:80 --isolation=hyperv --name IIS1 microsoft/iis:windowsservercore-1709 # No Hypervisor present :-(
#endregion

#region ---------------- Website austauschen 
# Websitedateien Löschen 
#docker exec IIS1 cmd del C:\inetpub\wwwroot\*.* /q
docker exec IIS1 powershell del C:\inetpub\wwwroot\*.*
explorer http://localhost:8111
explorer http://d125:8111/

# Interaktiv in den Container gehen
docker exec -it IIS1 cmd

# docker cp geht nicht bei laufendem Hyper-V-Container: filesystem operations against a running Hyper-V container are not supported
# Docker cp akzeptiert auch keine Wildcards! :-( https://github.com/moby/moby/issues/7710)
docker stop IIS1
#$Quelle = "H:\TFS\Demos\PowerShell\3_Einsatzgebiete\Docker\Website"
if ($env:computername -eq "D125") { $Quelle = "c:\demo\ml\dist-prod" }
else { $Quelle = "h:\ml\dist-prod\" }
$dateien = dir $quelle 
foreach($datei in $dateien)
{
$fullname = $datei.Fullname
docker cp $fullname IIS1:C:\inetpub\wwwroot
}
docker start IIS1
explorer http://localhost:8111

# Lösung mit PowerShell Remoting, geht auch mit Hyper-V-Container
#$containerID = (Get-container IIS1).ID # oder  
$containerID= docker inspect --format="{{.Id}}" IIS1
$session = New-PSSession -ContainerId $containerID -RunAsAdministrator
Copy-Item -ToSession $session "$Quelle\*" -Destination C:\inetpub\wwwroot\ -Recurse -Force -verbose

explorer http://localhost:8111
#endregion