SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
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 in der Regel unterschiedlich konfiguriert
Aufsetzen einer neuen gleichartigen Umgebung schwierig
=> Schlecht für Continous Integration und Delivery
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
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
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
Docker
Docker Host
Docker Daemon
Client
Befehle
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
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)
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
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
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 Stoppen von Containern
Entfernen
$ docker run -d --name=mysql_server -t mysql
$ docker stop mysql_server
$ docker start mysql_server
$ docker rm mysql_server
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
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 ausgeführt
Angeben eines anderen Startpunkes in run-Befehl möglich
Container kann interaktiv oder im Hintergrund gestartet werden
Weitere Konfigurationsparameter
Umgebungsvariablen
Networking
Volumes
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"]
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/
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ö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.
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
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
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
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
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
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
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
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
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
Orchestrierung
Ausführen von Containern im Cluster
Einfaches Skalieren
Deployment-Strategien (Rolling-Update, …)
Service-Discovery
Networking
. . .
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.

Weitere ähnliche Inhalte

Was ist angesagt?

Docker Einführung @GPN15
Docker Einführung @GPN15Docker Einführung @GPN15
Docker Einführung @GPN15m1no
 
Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...
Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...
Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...B1 Systems GmbH
 
Docker for Windows / Windows Container
Docker for Windows / Windows ContainerDocker for Windows / Windows Container
Docker for Windows / Windows ContainerThomas Wilhelm Wiefel
 
Tipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerTipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerNicholas Dille
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17remigius-stalder
 
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Tobias Schneck
 
Was gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-UniversumWas gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-UniversumNicholas Dille
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayTobias Schneck
 
MongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerMongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerGregor Biswanger
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Gregor Biswanger
 
Docker and Raspberry Pi. A dream team?
Docker and Raspberry Pi. A dream team?Docker and Raspberry Pi. A dream team?
Docker and Raspberry Pi. A dream team?Govinda Fichtner
 
digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...
digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...
digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...digitalSTROM.org
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker ContainerAndreas Koop
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 

Was ist angesagt? (20)

systemd & Docker
systemd & Dockersystemd & Docker
systemd & Docker
 
Docker Einführung @GPN15
Docker Einführung @GPN15Docker Einführung @GPN15
Docker Einführung @GPN15
 
Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...
Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...
Docker und Virtualisierung - Container Use Cases für eine isolierte, performa...
 
Docker for Windows / Windows Container
Docker for Windows / Windows ContainerDocker for Windows / Windows Container
Docker for Windows / Windows Container
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
Tipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerTipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit Docker
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17
 
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
 
Was gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-UniversumWas gibt es Neues im Docker-Universum
Was gibt es Neues im Docker-Universum
 
Dockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloudDockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloud
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony Day
 
Was ist Docker ?
Was ist Docker ?Was ist Docker ?
Was ist Docker ?
 
MongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerMongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen Hacker
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
 
Docker and Raspberry Pi. A dream team?
Docker and Raspberry Pi. A dream team?Docker and Raspberry Pi. A dream team?
Docker and Raspberry Pi. A dream team?
 
digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...
digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...
digitalSTROM Developer Day 2011: digitalSTROM bindet auch externe Komponenten...
 
Jenkins Acceleration
Jenkins AccelerationJenkins Acceleration
Jenkins Acceleration
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 

Ähnlich wie Hendrik Jungnitsch: Software verpacken mit Docker

Ausrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerAusrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerB1 Systems GmbH
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsJosef Adersberger
 
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfSyahri Ramadhan
 
DOAG Webinar Oracle und Docker
DOAG Webinar Oracle und DockerDOAG Webinar Oracle und Docker
DOAG Webinar Oracle und DockerStefan Oehrli
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerSteven Grzbielok
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DBDocker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DBPeter Ramm
 
DDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungDDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungFrank Schmittlein
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrants0enke
 
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...inovex GmbH
 
Docker und IBM Bluemix
Docker und IBM BluemixDocker und IBM Bluemix
Docker und IBM BluemixStephan Max
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungTilo Baller
 
Windows Server 8 - eine Vorschau
Windows Server 8 - eine VorschauWindows Server 8 - eine Vorschau
Windows Server 8 - eine VorschauDigicomp Academy AG
 
Docker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugDocker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugAlexander Bohndorf
 

Ähnlich wie Hendrik Jungnitsch: Software verpacken mit Docker (18)

Ausrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerAusrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit Docker
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
 
DOAG Webinar Oracle und Docker
DOAG Webinar Oracle und DockerDOAG Webinar Oracle und Docker
DOAG Webinar Oracle und Docker
 
Was ist Docker?
Was ist Docker?Was ist Docker?
Was ist Docker?
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with Docker
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DBDocker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
 
DDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungDDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale Entwicklungsumgebung
 
FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
Node.js
Node.jsNode.js
Node.js
 
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
 
Docker und IBM Bluemix
Docker und IBM BluemixDocker und IBM Bluemix
Docker und IBM Bluemix
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & Verwendung
 
Windows Server 8 - eine Vorschau
Windows Server 8 - eine VorschauWindows Server 8 - eine Vorschau
Windows Server 8 - eine Vorschau
 
Docker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugDocker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebug
 

Hendrik Jungnitsch: Software verpacken mit Docker

  • 1. Software verpacken mit Docker Expertenkreis Java, 18.05.2017, GEDOPLAN Hendrik Jungnitsch, GEDOPLAN GmbH
  • 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. 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. 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. 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
  • 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. 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. 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. 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
  • 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. 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
  • 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. 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. 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/
  • 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. 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. 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. 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
  • 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. 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. 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. 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. 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. Orchestrierung Ausführen von Containern im Cluster Einfaches Skalieren Deployment-Strategien (Rolling-Update, …) Service-Discovery Networking . . .
  • 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.