Docker Grundlagen für
Windows & Linux Container



Virtualization with Docker -
University Students meet IT Professionals

Softwerkskammer Jena

Docker im Überblick

Was ist Docker?

Anwendungsvirtualisierung: Anwendungen werden unter Verwendung von Betriebssystemvirtualisierung in Containern isoliert ausgeführt.

Buzzword-Bingo:
  • Microservices
  • DevOps
  • CI / CD (Continuous Integration / Continuous Deployment)
  • XaaS (Anything as a Service)
  • Portablität

Virtualisierung vs. Container

schema virtual maschine schema docker

Images

docker layers
  • Template für Container
  • Snapshot / Archiv
  • Readonly und versioniert
  • Ebenenprinzip (Speicherung nur Differenzen)

Container

  • Laufende Instanz eines Image
  • nur zur Laufzeit existent
  • Schreibbare Schicht wird
    oberhalb des Image bereitgestellt
schema docker

Docker-Ökosystem

Docker umfasst mehr als die Ausführungsumgebung für Container:
Compose Verwalten von Anwendungsstacks
Hub (öffentliche) Docker-Registry
Swarm / Swarm Mode Verwaltung von Container in Clustern
Cloud Hostinganbieter
Maschine Bereitstellung von Docker-Hosts
Store Bereitstellung zertifizierter Images
Kinematic Grafisches Verwaltungswerkzeug

Docker unter Linux

Start im März 2013
Alles neu - NEIN
Verwendung von erprobten Technologien des Linux-Kernel
  • LXC (BSD Jails / Solaris Zonen / OpenVZ)
  • Cgroups
    • Ressourcenlimits
    • CPU-Zeit, Speicher, IO ...
  • Namespaces
    • Simulation geschlossener Umgebungen
    • Hostnamen, Netzwerk, Prozesse ...
  • chroot (Verbindung des Mountpunkt)
Heute Bestandteil vieler Standard-Distributionen
  • Arch Linux
  • CentOS
  • Red Hat Enterprise Linux
  • openSUSE / SUSE Linux Enterprise
  • Ubuntu
  • ...


Spezielle Docker-Host Distributionen
  • Core-OS
  • Rancher-OS
  • Docker unter Windows

    • Partnerschaft zwischen Microsoft und Docker seit 2014
    • Container-Technik enthalten in
      • Windows Server 2016
      • Windows 10 Professional / Enterprise (ab Anniversary Update)
    • Unterstützung des kompletten Ökosystems (Hub / Compose / Swarm)
    • Docker-Integration Visual Studio 2017
    • Azure Container Services
    • SQL-Server als Linux-Container

    Isolation

    Windows Container vs. Hyper-V Container
    schema virtual maschine schema docker

    Basisimages

    • Bereitstellung über Dockerhub
    • microsoft/windowsservercore
      • Unterstützt Großteil der Windows Server Anwendung
      • IIS
      • SQL-Server
      • .net Framework 1.0 bis 4.7 (full)
      • 5 GB (komprimiert)
    • microsoft/nanoserver
      • Minimale Windows Version
      • IIS 10
      • .net Core
      • 333 MB (komprimiert)

    Docker - Grundlagen

    Informationen

    Docker-Host 

    docker info [OPTIONS]
    Zeigt Informationen über die Docker-Installation und
    den Host (OS / CPU / RAM ...).

    Container 

    docker ps [OPTIONS] 
    Zeigt Informationen für die Container z.B. Name, Image, Port ... an.
    -a / --all zeigt Informationen zu allen, auch inaktiven, Containern
    -l / --latest zeigt Informationen zum letzten erstellten Container

    Container-Operationen

    Erstellung 

    docker run [OPTIONS] IMAGE[:Tag] [COMMAND]
    Name --name [Name] (muss eindeutig im Host sein)
    Startverhalten -it (interaktives Terminal) /-d (Hintergrunddienst)
    Volumen-Mapping -v Quellpfad:Zielpfad
    Port-Mapping -p Container-Port:Host-Port
    Endverhalten -rm Container direkt entfernen
    Die Angabe des Containers erfolgt per Name oder Hash.

    Starten

    docker start [OPTIONS] CONTAINER
    -a / --attach Verbindung mit der Standardausgabe herstellen.
    -i / --interactive Verbindung mit der Standardeingabe herstellen.

    Stoppen

    docker stop [OPTIONS] CONTAINER
    -t / --time Zeit, in Sekunden, bis Container gekillt wird.

    Verbindung herstellen

    docker attach [OPTIONS] CONTAINER
    Stellt eine Verbindung mit der Standardausgabe des laufenden Containers her.

    Löschen

    docker rm [OPTIONS] CONTAINER
    -f / --force Bricht den noch laufenden Container ab
    -v / --volumes Löscht die mit dem Container verbundenen Volumes

    Log-Meldung anzeigen

    docker logs [OPTIONS] CONTAINER

    Image-Operationen

    Anzeige

    docker images [OPTIONS]
    -a / --all Zeigt alle, auch Zwischencontainer, an
    -f / --filter Filtert die Liste

    Herunterladen / Aktualisieren

    docker pull [OPTIONS] [Registry]IMAGENAME
    Ist keine Registry angegeben, wird der Default i.d.R. Docker-Hub verwendet. Beim Aktualisieren bleibt das vorhandene Image erhalten.
    docker pull  myregistry.local:5000/myuser/myimage

    Löschen

    docker rmi [OPTIONS] 
    -f / --force Erzwingt das Löschen

    Erstellung aus Container

    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    -a / --author Ersteller
    -m / --message Commit message

    Übertragung zur Registry

    docker push [OPTIONS] [Registry]IMAGENAME[:TAG] 
    Vor der Übertragung in den Dockerhub ist eine Authentifizierung erforderlich.

    Docker-File

    Ist eine Auszeichnungssprache (ML) für den Aufbau eines Docker-Images.
    Die Speicherung erfolgt als Textdatei.

    FROM Basisimage[:TAG]
       Imagename ggf. mit Tag auf welchem das eigene Image basieren soll

    FROM ubuntu:16.10

    LABEL maintainer Email
       E-Mail-Adresse des Autors

    LABEL maintainer "max@mustermann.de"

       Veraltet: MAINTAINER

    MAINTAINER Max Mustermann "max@mustermann.de"

    RUN COMMAND
       Befehl zur Ausführung im Container z.B. Installieren von Software.

    RUN apt-get update

    ENV VARIABLENNAME Wert
       Definiert Variablen z.B. die Version oder das Datum der Aktualisierung, die auch innerhalb der Befehle verwendet werden können.

    ENV REFRESHED_AT 2017-01-25

    EXPOSE Portnummer
       Definiert Ports, welche durch das Image bereitgestellt werden.

    EXPOSE 8080

    VOLUME Pfad
       Definiert Volume (Verzeichnis), welche durch das Image bereitgestellt wird.

    VOLUME ["/mydata"]

    COPY Quellpfad Zielpfad
       Kopiert Ordner / Dateien in das Image

    COPY /Publish /MyApp

    ADD Quellpfad / URL Zielpfad
       Kopiert Ordner / Dateien in das Image.
       Kann auch eine URL oder eine tar-Datei sein.

    ADD /Publish /MyApp

    WORKDIR Pfad
       Definiert den Einstiegspfad für die Ausführung innerhalb des Containers.

    WORKDIR /MyApp

    ENTRYPOINT [COMMAND, ARGS]
       Definiert den Startbefehl des Images inkl. Parameter.

    ENTRYPOINT ["npm", "rum", "testapp"]

    CMD COMMAND
       Definiert den Startbefehl des Images inkl. Parameter.
       Ein Überschreiben ist möglich.

    CMD ["npm", "rum", "testapp"]

    Beispiel

    FROM fpommerening/spartakiade2017-rabbitmq:core-base
    LABEL maintainer "frank@pommerening-online.de"
    ENV REFRESHED_AT 2017-01-31
    ENV Picflow_VERSION 0.0.1
    
    COPY /app /home/
    
    RUN set -x \
    	&& p7zip -d /home/picflow-webapp.7z \
    	&& mv /picflow-webapp/ /app/ \
    	&& apt-get purge -y --auto-remove ca-certificates wget p7zip
    
    WORKDIR /app/
    EXPOSE 5000
    ENTRYPOINT ["dotnet", "WebApp.dll"]
    						

    Empfehlungen

    • Installiere nur notwendige Pakete
    • Jeder Container hat nur einen Zweck
    • Minimiere die Anzahl der Ebenen
    • Sortiere Argumente
    • Nutze .dockerignore - File
    • apt-get update / apt-get install immer in einem Befehl
    • Verwende Pipes


    Hauptziele: Übersicht erhöhen / Imagegröße reduzieren


    Vielen Dank für die Aufmerksamkeit

    Teil 2 (ab 20 Uhr)
    Docker Training Tasks
    Benjamin Nothdurft

    Show Cases of Complex Docker Usage Scenarios
    Frank Pommerening

    Quellen:

    https://commons.wikimedia.org/wiki/File:Windows_logo_-_2012.png
    https://commons.wikimedia.org/wiki/File:Tux.svg
    https://blog.docker.com/media/Rancher-Logo-Final-1.png
    http://design.ubuntu.com/wp-content/uploads/ubuntu-logo14.png
    https://www.archlinux.org/static/logos/archlinux-logo-dark-1200dpi.b42bd35d5916.png
    http://blog.d2-si.fr/2016/06/29/start-up-docker-swarm/
    http://www.willhoeft-it.com/2016/06/03/docker-compose.html