.net in the box

.NET User Group Leipzig

25.04.2017

Frank Pommerening

  • Senior - Softwareentwickler
  • Consultant
  • Softwarearchitekt


frank@pommerening-online.de
AXP Consulting GmbH & Co. KG in Leipzig
Gründung: Mai 2012
Anzahl Mitarbeiter: 8 feste
Branchenfokus: Energiebranche


  • Consulting (fachlich & IT)
    • Requirements Engineering / Projektmanagement
    • IT-Fachprozess-Analyse / Dokumentation
  • Software-Entwicklung
    • Microservices, SOA, REST, OOA und OOD
    • Microsoft Technologien z.B. .NET (C#), WPF, WCF
    • Datenbanken (MS SQL Server / Oracle / MongoDB)

Build .Net Core App

Logo .net and docker

Build inside

Die Anwendung wird im Container während der Imageerstellung gebaut.

Vorteile Nachteile
  • Buildserver nicht erforderlich
  • Weniger komplex
  • Quellcode und Buildabhängigkeiten ggf. im Image enthalten
  • Basisimage größer (SDK erforderlich)
  • i.d.R. entstehen größere Images
  • Buildfehler schwerer zu debuggen

Build outside

Die Anwendung wird unabhängig vom Container erstellt. Die entstandenen Artefakte werden bei der Imageerstellung kopiert.

Vorteile Nachteile
  • i.d.R. kleinere Images und Basisimages
  • Build unabhängig von der Imageestellung
  • Quellcode und Buildabhängigkeiten nicht enthalten
  • Infrastruktur für Build erforderlich
  • Trennung erzeugt Komplexität

Containerfertige .Net (Core) App

Logo .net and docker

Konfiguration / Einstellungen

  • Einfache Implementierung in .NET Anwendung
  • Gute Integration in Docker-Ökosystem
  • Plattformabhängigkeit
  • Support von verschiedenen Umgebungen: Entwicklung, Test und Produktion

    • Ungeeignet Alternativen
      Registry Zentrale Service-Discovery
      Config-Dateien Environment Variables

Logging JA


Datei NEIN
Console JA
aber formatiert

Vorteile
  • Kein Problem mit verteilte Umgebung
  • Gute Integration ins Ökosystem
  • Einfach zu implementieren

Microservice mit .net

  • Verwendung eines gemeinsamen Basisimage
    • Gleiche Version von .net und Abhängigkeiten für alle Serviceimages
    • Geringere Build-Zeiten
  • Infrastruktur-Container ggf. trotz Abhängigkeit noch nicht verfügbar (Reliability / Retry)
  • Build outside bevorzugen
  • Linux-Container besser auf Linux statt Windows-Host erstellen

Image-Workflow

Beispiel PicFlow

Docker auf Raspberry PI 3

Build .net App

Die Unterstützung der ARM-Plattform für .net core ist noch in Entwicklung. Deshalb sollte man aktuell auf Mono von Xamarin / Microsoft zurückgreifen.

Images die auf x86/x64 erstellt wurden, sind auf dem Raspberry nicht lauffähig!
Verwendung spezieller Basisimages erforderlich
  • resin/rpi-raspbian
  • resin/raspberrypi3-debian
  • yyolk/rpi-archlinuxarm
  • ioft/armhf-ubuntu

GitHub + Docker Hub

Die Verknüpfung von GitHub und Docker Hub gestattet eine automatische Erstellung der Container mit jeder Codeänderung. schema flow github and dockerhub Voraussetzungen:
  • Accounts bei GitHub und Docker Hub existieren
  • Quellcode inkl. Dockerfile ist in einem Repository auf GitHub vorhanden

Verbindung GitHub und Docker Hub

  1. Login bei Docker Hub
  2. Profil -> Setting -> Linked Accounts & Services
  1. Auswahl des Zugriffs

  1. Autorisierung des Zugriffs
  2. Bestätigung mit GitHub-Kennwort

Automatischer Build

  1. Login bei Docker Hub
  2. Create -> Create Automated Build
  3. Auswahl Herkunft Quellcode (GitHub oder Bitbucket)

  1. Auswahl des Quell-Repository
  1. Konfiguration Docker Hub-Repository
    • Namespace (Fix: Benutzer)
    • Name (Default: Name des GitHub-Repository)
    • Sichtbarkeit (Default: Öffentlich)
    • Kurzbeschreibung (Pflichtfeld)

  1. Anpassung Build-Einstellungen (Build-Settings)
    • Pfad zum Dockerfile
    • Definition Tags
    • Verwendete Git-Branches
  1. Prüfung Build (Build Details)

.Net Client API

Eine .NET Client API wird offiziell von Microsoft gepflegt.
Quellcode: GitHub
Package: Nuget
Hinweis: Die Pakete werden nicht synchron mit den Änderungen am Quellcode veröffentlicht. Bestimmte Funktionen z.B. die Unterstützung für Swarm steht nur als Quellcode bereit.

Verbindungsaufbau

Für den Aufbau der Verbindung können verschiedene Protokolle z.B. Http oder Linux-Sockets verwendet. Letztes erlaubt auch die Verwendung in einem Container.

Windows (Docker for Windows)
var client = new DockerClientConfiguration(new Uri(http://localhost:2375)).CreateClient();

Linux (innerhalb eines Container)
var client = new DockerClientConfiguration(new Uri(unix://var/run/docker.sock)).CreateClient();
Bei Start benötigt der Container zusätzliche Rechte
docker run -d --privileged user/myimage

Abfrage Images

var imageParams = new ImagesListParameters{ MatchName = "ubuntu" };
var images = await client.Images.ListImagesAsync(imageParams);


Abfrage Container

var listParam = new ContainersListParameters
            {
                Filters = new Dictionary<string, IDictionary<string, bool>>
                {
                    {"name", new Dictionary<string, bool> {{"pingtest", true}}}
                }
            };
var result = await client.Containers.ListContainersAsync(listParam)

Container erstellen

Das Ergebnis der Erstellung enthält u.a. die vergebene Container-ID.
Wichtig: Erstellte Container sind nicht gestartet.
var createParam = new CreateContainerParameters
            {   Image = "ubuntu:latest",
                Cmd = new List<string> {"echo", "hallo world"},
                Name = "halloworldtest"     };
var result =  await client.Containers.CreateContainerAsync(createParam);

Container starten

await client.Containers.StartContainerAsync(containerId, null);

Container stoppen

await client.Containers.StopContainerAsync(containerId, 
	new ContainerStopParameters(), CancellationToken.None);
Beispiel: Webhook für automatische Bereitstellung

Konfiguration des Webhook

  1. Login beim Docker Hub
  2. Auswahl des Repository
  3. Webhooks -> Create a Webhook
  4. Name und Ziel-URL festlegen
  5. Speichern

Quellen:

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 https://blogs.msdn.microsoft.com/cesardelatorre/2016/11/16/free-ebook-on-containerized-docker-application-lifecycle-with-microsoft-tools-and-platform/ https://www.docker.com/sites/default/files/oyster-registry-3.png http://blog.terranillius.com/post/composev3_swarm/