Teile und Herrsche

Verteilte Java-Anwendungen mit Docker

Benjamin Schmid
Technology Advisor
Dr. Ralph Guderlei
Technology Advisor
Docker logo

150 Mio. USD Risikokapital

Red Hat Logo
Google Logo
Amazon Logo
Microsoft Logo
Alle Warenzeichen und Logos sind Eigentum ihrer jeweiligen Rechteinhaber.

Hype?

oder

»Wertvolles Werkzeug«?

Jump into Docker: Live Demo


$ mvn -o package
$ java -jar target/rest-microservice-1.0.0.jar server
$ sensible-browser "http://localhost:8080/hello-world"

$ docker build -t my/microservice .

$ docker run -d --name web1 my/microservice
$ docker run -d --name web2 my/microservice
$ docker run -d --name web3 my/microservice

$ docker pull haproxy:lts
$ docker run -d --name balancer \
	--link web1:web1 --link web2:web2 --link web3:web3 \
	-p 80:80 \
	-v (pwd)/etc:/usr/local/etc/haproxy:ro \
	haproxy:lts
$ sensible-browser "http://localhost:8080/hello-world"
						

Inhaltsverzeichnis

Docker in a nutshell

  • Isolierte Prozessausführung (Sandbox)
    auf Basis von »Linux Containers (LXC)«
  • Wesentlich effizienter als VMs/Hypervisoren
  • Portables Format für Container mit Versionierung
  • Leichtgewichtige Laufzeit- und Packaging-Tools
  • Cloud-Repository für Container-Vorlagen
**Build** Once, **Configure** Once and **Run Anywhere**

Grundlegende Begriffe

Image and Layers

Image: Paketierte Zusammenstellung von Dateien. Damit eine schreibgeschützte Blaupause für eine Systemumgebung.

Container

Container: Eine unabhängige Systemumgebung basierend auf einem Image

Repository

Repository: Ein Sammlung von Images auf dem lokalen Docker oder zentralen Registry Server

Docker Komponenten

ContainerContainer vs. Virtualization

Erstellen von Images

1. **Manuell:** *Commit* eines Containers 2. **Automatisiert:** via `Dockerfile`

In der Regel: Automatisiert, aufbauend auf einem via `docker pull` bezogenem Base-Image

Base Images

- [~100 offizielle Images](https://hub.docker.com/explore/) - 100.000+ Images insgesamt - 200+ Millionen Downloads

Images bauen: Dockerfile

FROM openjdk:slim
MAINTAINER Inspector Gadget

                            # Kommando im Container ausführen
RUN apt-get update && apt-get install unzip -y &&  \
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

                            # JAR und Config-File in Image aufnehmen
WORKDIR /opt
ADD target/rest-microservice-1.0.0.jar app.jar
ADD src/main/resources/example.yml     app.yml

                            # announce exported port 8080 and 8081
EXPOSE 8080 8081
                            # Wichtig: Separate Volumes für Daten
VOLUME ["/srv/"]

                            # JAR ausführen beim Start des Containers
ENTRYPOINT java -jar app.jar server
							

Hands on Docker

#### Neues Image erstellen Auf Basis unseres `Dockerfile` erzeugen wir unser Image: ``` docker images docker build -t my/dockerapp:latest . docker images ``` Dabei sehen wir wie die Schritte einzeln abgearbeitet werden; bei jedem der Schritte entsteht ein neuer Layer. Mehr dazu später.
#### Container erstellen & starten Nun starten einen neuen (anonynmen) Container auf Basis des Images: Einmal interaktiv, einmal als Daemon ``` docker run -it my/dockerapp [ctrl-c] docker run -d my/dockerapp ```
#### Container managen Nun schauen wir mal was so los ist. Wir die eingangs gestarteten Container laufen noch, welche wir erst mal unsanft killen. docker ps docker kill balancer web1 web2 web3 docker ps Regulär stoppt man Container aber höflich mit `docker stop`. Wieder starten über `docker start` … nicht ~~`docker run`~~ . docker stop name docker ps docker ps -as docker start name
#### Diagnostik von Container Unsere Container laufen im Hintergrund. Wie kommen wir an Infos, wenn mal etwas nicht funktioniert? docker inspect name | grep IP sensible-browser "http://ip:8080/hello-world" docker logs name docker exec -it name /bin/bash

Docker advanced

Docker Layers

Layers & Union File System

- Filesystem aus gestapelten **Layern** (Union File System) - **Images** sind schreibgeschützte Layers & Meta - Schreibbarer Layer dazu ➱ **Container**. - Dockerfile: Jeder Schritt = **neuer Layer** ➱ `docker history` - **Versionierung:** Layer-ID = Container/Image ID ➱ `ac408c338`

Data Volumes

Datenhaltung unabhängig vom Container-Lebenszyklus.
Überlebt: Löschen & Updates. Erlaubt: Sharing.

Option 1: _Container Volumes_ docker create -v /mydata --name mydata openjdk:slim /bin/true docker run -d --volumes-from mydata my/dockerapp Option 2: _Lokale Verzeichnisse_ docker run -v $(pwd)/etc:/usr/local/etc:ro haproxy:lts

Container verknüpfen

``` docker run -d --name web1 my/dockerapp docker run -d --link web1:web1 haproxy ```
_web1_ wird damit in _haproxy_ verfügbar via - Umgebungsvariablen: `WEB1_PORT` - IP & Hostnamen: `/etc/hosts`

Einstiegs-Demo revisited

docker build -t my/microservice

docker run -d --name web1 my/microservice
docker run -d --name web2 my/microservice
docker run -d --name web3 my/microservice

docker run -d --name balancer \
    --link web1:web1 --link web2:web2 --link web3:web3 \
    -p 80:80 \
    -v (pwd)/etc:/usr/local/etc/haproxy:ro \
    haproxy:lts

Docker Kommandos

##### Images managen | Kommando | Beschreibung | |-----------------|--------------------------------------------| | `docker images` | Liste der lokal vorhandenen Images | | `docker pull` | Image-Download aus dem Repository | | `docker build` | Docker Image via `Dockerfile` erstellen | | `docker commit` | Containers als neues Image comitten | ##### Container kontrollieren | Kommando | Beschreibung | |-----------------|--------------------------------------------| | `docker run` | Erzeugen eines neuen Containers | | `docker start` | Starten eines bestehenden Containers | | `docker stop` | Stoppen eines Containers | | `docker ps -a` | Liste _aller_ Container | | `docker kill` | Stoppen mit Nachdruck |
##### Diagnose & Tools | Kommando | Beschreibung | |-------------------|----------------------------------------------------------| | `docker inspect` | Low-Level Informationen über Container/Images | | `docker log` | Terminal-Ausgaben des Containers | | `docker exec` | Prozess im Container starten, z.B. interaktive Shell | | **`docker diff`** | Was wurde im Container geändert? | | `docker history` | Image: Welche Schichten & wie entstanden? |

Docker & Java

Anwendungsfälle

- **Entwicklung**: - Lokale, isolierte & portable Umgebung - Infrastruktur analog zu Produktion - fixe Versionen für Tools & Laufzeitumgebungen - **CI-Server:** Tests in _isolierten_ Referenzumgebungen - **Betrieb**: - einfaches Deployment - Resourcenschonender Parallel-Betrieb vieler Instanzen - **Architektur**: Microservice als Uberjar statt Appserver
**Microservice Frameworks** - **Quarkus.io** - **Micronaut.io** - **Helidon** - Spring Fu - Ktor - Spark Framework - Dropwizard - Spring Boot - Vert.x
**Java-nahe Tools** - **`Dockerfile`-Alternativen:** Paketo.io, jib, s2i (source-to-image), … - **Update-Management:** Renovate

Best Practices

für Docker Images

- **Immutable infrastructure** - Konfiguration extern halten - Kein blindes `docker pull` - Ein Prozess pro Image - `docker exec` statt ssh-Server - Logging nach `STDOUT`/`STDERR`

Docker Distributed

Orchestrierung - Docker Compose


haproxy:
  image: haproxy:lts
  ports:
    - 8080:80
  volumes:
    - ./etc/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
  links:
    - web1
    - web2
    - web3

web1:
  image: exxcellent/docker_talk
						

Cluster-Betrieb

  • Verteilung & Scheduling
  • Service Discovery
  • Load Balancing
## Docker out of the box ##### Pures `localhost`: - `--link` und Volumes nur auf lokalem Host - Kein cross-host Netzwerk ##### Add-on Tools - Unübersichtliches, dynamisches Ökosystem. Viele Einzelteile in einer Gesamtlösung, daher breites Verständnis notwendig. - Platzhirsch: **Kubernetes Distributionen** - Nische: _Docker Swarm_

Orchestrierungs-Tools

Rancher Kubernetes
Mesos Docker Swarm
K3s

Beispiel - verteiltes System

Hype vs. Potential

Docker & Windows

boot2docker logo
##### Bis Heute: (Linux container) - Docker Desktop - Docker for Windows WSL - Docker auf Microsoft Azure ##### Ergänzend: (Windows container) - Windows Server Containers - Hyper-V Container

Status

von Docker
  • nur Teil einer Gesamtlösung
  • Aktuelle Suche nach Monetarisierung
  • Cloud-native-Technologie ➱ Folgechallenges
  • Aufstrebende Alternativen
    ➱ OCI, Podman, K8s, LXD, (rkt)

Fragen,

die sich durch Docker ergeben
  • Nachvollziehbarkeit
    & Delivery Model
  • Datenhaltung
  • Zuständigkeiten
  • Security (root, Patches)

Potential Docker

Build Umgebung

Automatisierung Provisioning, Config, Delivery

Kein Setup

Immutability
Umgebung = Code. Disposable

Konsolidierung

Serverkonsolidierung
System-agnostisch

Schnelleres Deployment

Deployment
Einfach; Container als Einheit

#### Brauche ich Docker? - Was sind signifikante Vorteile? - Ressourcen für komplexe, ungelöste Probleme?
_»Let’s Dockerize everything«_ ➱ ziemlich wild & übermütig!

Tools

###### GUIs - Docker [Kitematic](https://kitematic.com/) - [Panamax](http://panamax.io/), ... ##### Spezielle Linux-Distros - [RancherOS](http://rancher.com/rancher-os/) - [CoreOS](https://coreos.com/), ... ###### Private Image Registry - Docker [Distribution](https://github.com/docker/distribution) - [Artifactory](http://www.jfrog.com/open-source/), ... ###### Networking - [Weaveworks](http://weave.works/) - CoreOS [Flannel](https://github.com/coreos/flannel), ...
###### Service discovery - CoreOS [etcd](https://github.com/coreos/etcd) - Apache [Zookeeper](https://zookeeper.apache.org/) - [Consul](https://www.consul.io/) ###### Cluster / Orchestrierung - [Rancher](http://rancher.com/rancher-io/) - [Kubernetes](http://kubernetes.io/) - [Shipyard](http://shipyard-project.com/) - Docker [Compose](https://docs.docker.com/compose/) / [Swarm](http://docs.docker.com/swarm/) - Apache [Mesos](http://mesos.apache.org/) / [Marathon](https://mesosphere.github.io/marathon/) - [MaestroNG](https://github.com/signalfuse/maestro-ng) - CoreOS [fleet](https://github.com/coreos/fleet), ...
###### Config Mgmt. - [Ansible](http://www.ansible.com/) - [Puppet](https://puppetlabs.com/) - [Chef](https://www.chef.io/) - [Capistrano](http://capistranorb.com/) ###### Interessante Java-Tools - [Dropwizard](http://dropwizard.io) - [Spark](http://sparkjava.com) - [Vert.x](http://vertx.io) - [Spring Boot](http://http://projects.spring.io/spring-boot) - [Docker Maven-Plugins](https://github.com/alexec/docker-maven-plugin/blob/master/COMPETITORS.md)
Image Credits: _Southampton Container Port_ [Geni](http://commons.wikimedia.org/wiki/File:Southampton_container_port_2_ships.JPG) / [CC-BY-SA-4.0](https://creativecommons.org/licenses/by-sa/4.0/), _Blades_ [zagrobot](https://www.flickr.com/photos/zagrobot/2731084578) [CC-BY-2.0](https://creativecommons.org/licenses/by/2.0/)