Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Software verpacken mit Docker
Expertenkreis Java, 18.05.2017, GEDOPLAN
Hendrik Jungnitsch, GEDOPLAN GmbH
Problemstellung
Anwendung läuft in unterschiedlichen Umgebungen
Produktion
Test / Integration
Entwicklerrechner
Umgebungen...
Docker
Offene Container-Plattform
Leichtgewichtige Alternative zu VMs
Funktioniert mit Prozessisolierung
Anwendungen werde...
Docker
Virtuelle Maschinen Docker
Physikalische Maschine Physikalische Maschine
Host-Betriebssystem Host-Betriebssystem
Do...
Installation
Docker Community Edition (CE)
Auf Linux Installation einfach per Package-Manager
Installer für Windows 10 und...
Docker
Docker Host
Docker Daemon
Client
Befehle
Images
Definieren einer Anwendung mit allen Abhängigkeiten
Bibliotheken, Binaries etc.
Identifiziert über Tagname: (regist...
Image Layer
Images können auf anderen Images aufbauen
Erzeugt jeweils einen neuen Layer
Immer ein Basisimage benötigt
Linu...
Registries
Docker Registries verwalten Images
Docker Hub - zentrale öffentliche Registry
Viele offizielle Basis- oder Anwe...
Registries
Übermitteln von Images per Push
Beziehen von Images per Pull
Layer werden einzeln übertragen
Nur Layer mit Ände...
Docker
Docker Host
Docker Daemon
Registry
Client
Push
Pull
Image
Befehle
Container
Lauffähige Komponente in Docker
Erzeugt auf Basis eines Images
Erstellen und Starten über Run-Befehl
Starten und...
Container
Erzeugen einen weiteren Layer über Image
Schreiben nur in eigenem Layer
Immutable Infrastructure
Erzeugen eines ...
Docker
Docker Host
Docker Daemon
Registry
Client
Push
Pull
Container
Image
Run
Commit
Stop/Start
Befehle
Docker Run Befehl
Erzeugt Container zu einem Image und startet diesen
Image kann Einstiegspunkt definieren, wird bei run a...
Dockerfiles
Definieren ein Docker Image
Beziehen sich auf ein Basisimage
Hinzufügen von Dateien möglich
Ausführen von Befe...
Build Command
Erzeugen eines Images aus einem Dockerfile
Vergeben eines Tagnamens möglich
Definieren eines Build-Kontextes...
Docker
Docker Host
Docker Daemon
Registry
Client
Push
Pull
Docker
File
Build
Container
Image
Run
Commit
Stop/Start
Befehle
Volumes
Persistente Daten sollten nicht in Containern gespeichert werden
Kein Neuerstellen des Containers möglich
Daten kö...
Volumes
Einhängepunkte können in Dockerfile definiert werden
Volume erstellen und zuweisen bei Run (Hostpath)
Volume erste...
Networking
Historisch bedingt drei Netzwerktypen direkt verfügbar
Bridge (Default) – Alle Container, die nichts spezifizie...
Networking
Eigenes Bridge-Netzwerk definieren
Container innerhalb des Netzwerkes können kommunizieren
Über Containername b...
Docker
Docker Host
Docker Daemon
Registry
Client
Push
Pull
Docker
File
Build
Container
Image
Run
Commit
Stop/Start
Storage...
Eigene Registries
Es besteht die Möglichkeit, eine eigene Registry zu betreiben
Für interne Images oder als Cache von Dock...
Docker-Compose
Definieren komplexerer
Anwendungen
Java-Anwendung
+ Datenbank
+ . . .
Definiert in einem YAML-File
Deklarat...
Docker-Compose
Installieren z. B. über pip:
Starten der kompletten Anwendung mit einem Befehl
Erzeugt nur veränderte oder ...
Docker Host
Anwendung
Überblick Demo Projekt
Registry
MySQL
Wildfly
Poject-Folder
Dockerfile
compose.yml
App
Build
Compose...
Best-Practices
Images bauen mit Source-to-Image z. B. über Dockerfiles
Verwalten der Sourcen in Git
Passende Basisimages a...
Orchestrierung
Ausführen von Containern im Cluster
Einfaches Skalieren
Deployment-Strategien (Rolling-Update, …)
Service-D...
Fazit
Sehr interessant für Paketieren von Software
Anwendungen unabhängig von Programmiersprache verpackt
Einfacher Austau...
Upcoming SlideShare
Loading in …5
×

Hendrik Jungnitsch: Software verpacken mit Docker

172 views

Published on

Vortrag auf dem Expertenkreis Jav am 18.05.2017, GEDOPLAN GmbH, Bielefeld

Published in: Software
  • Be the first to comment

  • Be the first to like this

Hendrik Jungnitsch: Software verpacken mit Docker

  1. 1. Software verpacken mit Docker Expertenkreis Java, 18.05.2017, GEDOPLAN Hendrik Jungnitsch, GEDOPLAN GmbH
  2. 2. Problemstellung Anwendung läuft in unterschiedlichen Umgebungen Produktion Test / Integration Entwicklerrechner Umgebungen in der Regel unterschiedlich konfiguriert Aufsetzen einer neuen gleichartigen Umgebung schwierig => Schlecht für Continous Integration und Delivery
  3. 3. Docker Offene Container-Plattform Leichtgewichtige Alternative zu VMs Funktioniert mit Prozessisolierung Anwendungen werden in Images verpackt Inklusive aller Abhängigkeiten Immutable, wiederverwendbar Community und Enterprise Edition verfügbar
  4. 4. Docker Virtuelle Maschinen Docker Physikalische Maschine Physikalische Maschine Host-Betriebssystem Host-Betriebssystem Docker Hypervisor Gast-System 1 Gast-System 2 Anwendung 1 Anwendung 2 Dateien Dateien Dateien Dateien Anwendung Anwendun g
  5. 5. Installation Docker Community Edition (CE) Auf Linux Installation einfach per Package-Manager Installer für Windows 10 und Mac Benötigt Virtualisierung (Hyper-V, Apple Hypervisor) apt-get install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $ (lsb_release -cs) stable" apt-get update apt-get install -y docker-ce service docker start
  6. 6. Docker Docker Host Docker Daemon Client Befehle
  7. 7. Images Definieren einer Anwendung mit allen Abhängigkeiten Bibliotheken, Binaries etc. Identifiziert über Tagname: (registry/)repo/image:version Beispiele für Befehle: Auflisten der Images auf Dockerhost Entfernen eines Images $ docker images $ docker rmi image_name
  8. 8. Image Layer Images können auf anderen Images aufbauen Erzeugt jeweils einen neuen Layer Immer ein Basisimage benötigt Linux-Distribution Storage-Driver Union Filesystem Images sind immutable Basisimage (Debian) Layer 1 (JRE) Layer 2 (Wildfly) Layer 3 (Anwendung)
  9. 9. Registries Docker Registries verwalten Images Docker Hub - zentrale öffentliche Registry Viele offizielle Basis- oder Anwendungsimages Eigene Images können bereitgestellt werden Betreiben einer eigenen Registry möglich Für Images, die nicht öffentlich sein sollen Zum Cashen von Images
  10. 10. Registries Übermitteln von Images per Push Beziehen von Images per Pull Layer werden einzeln übertragen Nur Layer mit Änderungen werden ausgetauscht $ docker push jboss/wildfly $ docker pull jboss/wildfly Registry
  11. 11. Docker Docker Host Docker Daemon Registry Client Push Pull Image Befehle
  12. 12. Container Lauffähige Komponente in Docker Erzeugt auf Basis eines Images Erstellen und Starten über Run-Befehl Starten und Stoppen von Containern Entfernen $ docker run -d --name=mysql_server -t mysql $ docker stop mysql_server $ docker start mysql_server $ docker rm mysql_server
  13. 13. Container Erzeugen einen weiteren Layer über Image Schreiben nur in eigenem Layer Immutable Infrastructure Erzeugen eines neuen Images Commit Basisimage (Debian) Layer 1 (JRE) Layer 2 (Wildfly) Layer 3 (Anwendung) Container
  14. 14. Docker Docker Host Docker Daemon Registry Client Push Pull Container Image Run Commit Stop/Start Befehle
  15. 15. Docker Run Befehl Erzeugt Container zu einem Image und startet diesen Image kann Einstiegspunkt definieren, wird bei run ausgeführt Angeben eines anderen Startpunkes in run-Befehl möglich Container kann interaktiv oder im Hintergrund gestartet werden Weitere Konfigurationsparameter Umgebungsvariablen Networking Volumes
  16. 16. Dockerfiles Definieren ein Docker Image Beziehen sich auf ein Basisimage Hinzufügen von Dateien möglich Ausführen von Befehlen Aufbau der Layer Können Einstiegspunkt festlegen FROM alpine ADD startmysql.sh /var/startmysql.sh RUN apk add --update mysql && mkdir -p /etc/mysql/conf.d && mkdir /run/mysqld && rm -rf /var/cache/apk/* && chmod 644 /etc/mysql/my.cnf CMD ["/var/startmysql.sh"]
  17. 17. Build Command Erzeugen eines Images aus einem Dockerfile Vergeben eines Tagnamens möglich Definieren eines Build-Kontextes Ressourcen stehen in Build zur Verfügung (z. B. für ADD) Kann übergeben werden als Verzeichnis URL z. B. Git-Repository, Remote Tar-Archiv Einzelnes Dockerfile $ docker build –t mytagname /pathtodockerfile/
  18. 18. Docker Docker Host Docker Daemon Registry Client Push Pull Docker File Build Container Image Run Commit Stop/Start Befehle
  19. 19. Volumes Persistente Daten sollten nicht in Containern gespeichert werden Kein Neuerstellen des Containers möglich Daten können in Volumes abgelegt werden Daten bleiben erhalten auch nach Entfernen des Containers Daten können von Containern geteilt werden Beeinflusst nicht das Image Verschiedene Datenspeicher möglich über Driver Plugins Hostpath, NFS, verschiedene Cloudspeicher etc.
  20. 20. Volumes Einhängepunkte können in Dockerfile definiert werden Volume erstellen und zuweisen bei Run (Hostpath) Volume erstellen (NFS) $ docker run -d --name=mysql_server -v /data/mysql:/var/data/mysql VOLUME ["/var/data/mysql"] $ docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.1,rw --opt device=:/data/volumes/mydatabase mydatabase
  21. 21. Networking Historisch bedingt drei Netzwerktypen direkt verfügbar Bridge (Default) – Alle Container, die nichts spezifizieren None – Eigenes Netzwerk für den Container Host – Netzwerk-Stack des Hosts Benutzerdefinierte Netzwerke möglich Bridge – Isoliertes Netzwerk auf einem Host Overlay – Netzwerk, das mehrere Hosts überspannt Custom-Plugin
  22. 22. Networking Eigenes Bridge-Netzwerk definieren Container innerhalb des Netzwerkes können kommunizieren Über Containername bzw. Alias Container in Netzwerk starten Host-Port-Mapping $ docker network create --driver bridge my_network $ docker run -d -p=3306:3306 --name=my_network mysql $ docker run --network=my_network --name=mysql_server mysql
  23. 23. Docker Docker Host Docker Daemon Registry Client Push Pull Docker File Build Container Image Run Commit Stop/Start Storage Volume Mount Befehle Dienst auf Port
  24. 24. Eigene Registries Es besteht die Möglichkeit, eine eigene Registry zu betreiben Für interne Images oder als Cache von Docker-Hub Verschiedene Implementierungen vorhanden Docker-Registry, Nexus, … Registry URL als Prefix in Tagnamen $ docker run -d -p 5000:5000 --name registry registry:2 $ docker push localhost:5000/mysql
  25. 25. Docker-Compose Definieren komplexerer Anwendungen Java-Anwendung + Datenbank + . . . Definiert in einem YAML-File Deklarative Beschreibung Konfiguration wie bei Run version: '2‚ services: mysqldb: image: localhost:5000/mysql volumes: - "/data/mysql:/var/data/mysql„ restart: always demoapp: depends_on: - mysqldb build: . image: localhost:5000/demo restart: always environment: DB_CONNECTION_URL: mysqldb:3306 DB_SCHEMA: demo
  26. 26. Docker-Compose Installieren z. B. über pip: Starten der kompletten Anwendung mit einem Befehl Erzeugt nur veränderte oder nicht laufende Services Definiert eigenes Netzwerk für alle enthaltenen Container Kann auch umkonfiguriert werden Weitere Features Healthchecks, mehrere Replikas etc. $ docker-compose up -d $ apt-get install python-pip -y $ pip install docker-compose
  27. 27. Docker Host Anwendung Überblick Demo Projekt Registry MySQL Wildfly Poject-Folder Dockerfile compose.yml App Build Compose Volume Port 8080 Sourcen Java EE Anwendung MySQL Wildfly App Push Datenbank Java App Pull
  28. 28. Best-Practices Images bauen mit Source-to-Image z. B. über Dockerfiles Verwalten der Sourcen in Git Passende Basisimages auswählen (Größe, benötigte Werkzeuge etc.) Ein Container pro Anwendung (Datenbank, Java-Anwendung, …) Persistente Daten in Volumes ablegen Alle Umgebungen verwenden die gleichen Images Sowohl für eigene Anwendungen als auch für Infrastruktur sinnvoll
  29. 29. Orchestrierung Ausführen von Containern im Cluster Einfaches Skalieren Deployment-Strategien (Rolling-Update, …) Service-Discovery Networking . . .
  30. 30. Fazit Sehr interessant für Paketieren von Software Anwendungen unabhängig von Programmiersprache verpackt Einfacher Austausch zwischen den Umgebungen Ermöglicht Continuous-Delivery Fördert Wiederverwendung Dokumentation der Konfiguration durch Dockerfiles etc.

×