On Github bentolor / docker-talk
oder
$ 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:1.5 $ docker run -d --name balancer \ --link web1:web1 --link web2:web2 --link web3:web3 \ -p 8080:80 \ -v (pwd)/etc:/usr/local/etc/haproxy:ro \ haproxy:1.5 $ sensible-browser "http://localhost:8080/hello-world"
Image: Paketierte Zusammenstellung von Dateien. Damit eine schreibgeschützte Blaupause für eine Systemumgebung.
Container: Eine unabhängige Systemumgebung basierend auf einem Image
Repository: Ein Sammlung von Images auf dem lokalen Docker oder zentralen Registry Server
1. **Manuell:** *Commit* eines Containers 2. **Automatisiert:** via `Dockerfile`
In der Regel: Automatisiert, aufbauend auf einem via `docker pull` bezogenem Base-Image
FROM java:8 MAINTAINER Inspector Gadget # Kommando im Container ausführen RUN apt-get update && apt-get dist-upgrade -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 serverHier unser Eingangs präsentiertes Beispiel: - Zuerst mal starten wir von einem Base-Image - Mit `RUN` könenn wir Kommando _innerhalb_ des Containers ausführen - Dann fügen wir Dateien von ausserhalb in den Container hinzu: Hier unsere App-JAR und Konfigurationsdatei - `EXPOSE` und `ENTRYPOINT` sind Meta-Informationen die Beschreiben, wie der Container verwendet werden soll. Konkret: Welche Ports aus dem Container später zugänglich sein sollen und Was beim Container-Start ausführen. In der Regel 1 Prozess. - `VOLUME`: Betrachten wir später
Datenhaltung unabhängig vom Container-Lebenszyklus. Überlebt: Löschen & Updates. Erlaubt: Sharing.
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 8080:80 \ -v (pwd)/etc:/usr/local/etc/haproxy:ro \ haproxy:1.5...und damit haben wir alle Elemente aus der Eingangs-Demo kennen gelernt.
haproxy: image: haproxy:1.5 ports: - 8080:80 volumes: - ./etc/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg links: - web1 - web2 - web3 web1: image: exxcellent/docker_talk
Automatisierung Provisioning, Config, Delivery
ImmutabilityUmgebung = Code. Disposable
ServerkonsolidierungSystem-agnostisch
DeploymentEinfach; Container als Einheit