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 server
Hier 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