Archive

Archive for the ‘Docker’ Category

Using Docker on Windows 10 or Server 2016

July 2, 2017 Leave a comment

Docker support comes in two different flavors on Windows:

  • Windows Container
  • Hyper-V Container

Both flavors can use the same images, but Hyper-V Container deliver more isolation between the containers

Hyper-V Container need Hyper-V support and therefore are currently not usable in Azure, unless the coming feature of “nested virtualization” is broadly available

Both flavors differentiate in this environment requirement and in the added startup switch –isolation=hyperv, when starting an image using a cmdline like this:

docker run –d –name <myIISContainerName> –h <MyIISHostname> –p80:80 microsoft/iis –isolation=hyperv

More about the differences here:
https://docs.microsoft.com/en-us/virtualization/windowscontainers/quick-start/

Docker Installation


Installing Hyper-V Container on Windows 10:

https://docs.microsoft.com/en-us/virtualization/windowscontainers/quick-start/quick-start-windows-10


Install Docker (Windows Container) on Server 2016

    Installing Container feature using ServerManager is not enough! The following Powershell scripts must be executed!

    • Install-Module -Name DockerMsftProvider -Repository PSGallery –Force
    • Install-Package -Name docker -ProviderName DockerMsftProvider
    • Restart-Computer –Force
    • SConfig ==> Option 5 to install Updates

    Install Windows Server 2016 on Azure

    Add a VM based on “Windows Server 2016 Datacenter – with Containers”

    Docker is already included and also a few base images are there

    Define terms like image and container

    The term image is used for a prepared environment, which can be started multiple times.

    Each instance on start will create a container, which runs with its own IP and completely sepearated as unique machine with its own machinename

    Note: image names must be all lowercase!


    Docker commands

    List locally availble images:

    docker images

    List public available images from Microsoft:

    https://hub.docker.com/u/microsoft/

    Some of the images with a short description:

    • https://hub.docker.com/r/microsoft/nanoserver/ 
      Can run IIS and dotNetCore, but not Full .NET!
      Small download size of about 800 MB
    • https://hub.docker.com/r/microsoft/windowsservercore/
      can run all kind of roles, but without GUI support
      Able to run IIS, SQL,…
      Downloadsize about 8 GB
    • https://hub.docker.com/r/microsoft/iis/
      Based on Windows Server Core including IIS
      RUN powershell -Command Add-WindowsFeature Web-Server

      To use .NET Framework inside IIS, the following features must be added:
      RUN powershell -Command Add-WindowsFeature NET-Framework-45-ASPNET
      RUN powershell -Command Add-WindowsFeature Web-Asp-Net45
      ==> add to dockerfile, see scetion “Create new images using dockerfile”

    The following images contain full .NET Framwork, but NO IIS

    • microsoft/dotnet-framework:3.5
    • microsoft/dotnet-framework:4.6.2
    • microsoft/dotnet-framework:4.7

    Run a docker image interactive

    docker run –it <nameOfImage> <cmdToExecute>

    Example:
    docker run –it microsoft/iis cmd

    Run a docker image in the background

    docker run –d –name <nameOfContainer> –h <HostName> –p<PostPort>:<ContainerPort> <nameOfImage>

    Example:
    docker run –d –name MyIIS1 –h MyIIS1 –p80:80 microsoft/iis

    Run a docker image in the background using Hyper-V

    docker run –d –name <nameOfContainer> –h <HostName> –p<PostPort>:<ContainerPort> –isolation=hyperv <nameOfImage>

    All processes are listed in the hosts taskmanager with a job Task Id, which is unique for a container


    Port handling

    -p lets define a port, which will listen on the host and will be forwarded to the container

    Local firewall and Azure Network Security group rules must be adjusted!

    List local docker container with status

    docker ps –a

    image

    Run a cmd inside a running container

    docker exec –i <NameOfContainer> <CmdName>

    Example:
    docker exec –i MyIIS1 cmd

    Check IP address of running container from Powershell

    docker inspect –format ‘{{ .NetworkSettings.Networks.nat.IPAddress }}’ myIIS

    More inspect commands:
    https://docs.docker.com/engine/reference/commandline/inspect/#extended-description

    Stop a running container

    docker stop <nameOfContainer>

    Example:
    docker stop MyIIS1


    Remove stopped container


    docker rm <NameOfContainer>

    Example:
    docker rm MyIIS1

    Remove local image


    docker rmi <imagename>

    Example:
    docker rmi microsoft/iis

    Create a new docker image from existing container

    Make sure, that container ist stopped

    docker commit <ContainerName> <newimagename>

    Save a docker without docker repository

    docker save –o c:\temp\myimage.tar <imagename>


    Display image history

    docker history <imagename>


    Create your own Docker Registry

    https://github.com/docker/docker.github.io/blob/master/registry/deploying.md

    Create new images using dockerfile

    New base image which includes ASP.NET 4.5 Framework and WebDeploy

    Lets define a new image, which should be based on microsoft/iis and also run .NET and should be able to allow remote installation using WebDeploy.

    The name of our new image should be webdeployimage (names must be all lowercase!)

    To include WebDeploy functionalilty, we need to download the WebDeploy-MSI from here:
    https://www.iis.net/downloads/microsoft/web-deploy

    The resulting downloaded file is named WebDeploy_amd64_en-US.msi

    Lets copy this file to c:\temp\WebDeployImage

    Create a textfile named dockerfile in the same directory with content below

    A dockerfile is a list of docker commands which will be executed on every startup of the container image.

    FROM microsoft/iis

    RUN powershell -Command Add-WindowsFeature NET-Framework-45-ASPNET
    RUN powershell -Command Add-WindowsFeature Web-Asp-Net45

    ADD WebDeploy_amd64_en-US.msi /temp/

    RUN msiexec /i c:\temp\WebDeploy_amd64_en-US.msi /qn

    Note, that destinationpath fo ADD cmd uses unix style / and not \

    Now build the new image using this cmd, where the path points to the location, where the dockerfile is located

    docker build -t webdeployimage C:\temp\WebDeployImage

    after this a new image named webdeployimage should be listed using docker images

    Another new image which is based on webdeployimage and includes MyDockerampleWebApp

    Create a WebDeployPackage from any existing .NET app on your IIS using Export from Inet Manager. This will result in a zip file named MyDockerSampleWebApp.zip in this example.

    Create a new directory c:\temp\MyDockerSampleWebApp and there create this dockerfile:

    FROM webdeployimage

    ADD MyDockerSampleWebApp.zip /

    RUN Powershell -Command "Add-PSSnapin WDeploySnapin3.0; Restore-WDPackage -Package c:\MyDockerSampleWebApp.zip

    Now build the new image using this cmd, where the path points to the location, where the dockerfile is located

    docker build -t mydockersamplewebappimage C:\temp\MyDockerSampleWebApp

    after this a new image named mydockersamplewebappimage should be listed using docker images

    Now run a new container using this image

    docker run –d –name sampleapp1 –h sampleapp1 –p80:80 mydockersamplewebappimage

    Access your hostmachine now using the given port (in this example 80)
    http://YourServername/MyDockerSampleWebApp

    Note: You have to make sure, that the host port is available and not used from another instance or local IIS

    Add Remote Management to a Docker image based on microsoft/iis

    docker run -d –name iis1 -h iis1 -v c:/shared:c:/shared microsoft/iis
    docker exec -i iis1 powershell

    Install-WindowsFeature -name Web-Server -IncludeManagementTools
    Dism /online /enable-feature /featurename:IIS-ManagementService /all

    – Enable remote access
    New-ItemProperty -Path HKLM:\software\microsoft\WebManagement\Server -Name EnableRemoteManagement -Value 1 -Force

    net user AdminUser P@ssw0rd1 /ADD
    net localgroup administrators AdminUser /add

    net start wmsvc
    ipconfig

    Ipconfig will return the IP of the docker container.

    Now switch back to the Docker host or any other machine in the network, which does have the IIS Management Console installed and connect to this docker image using the IP address and username/password defined above.

    Categories: Docker, IIS, Server 2016, Windows 10