In diesem Lab lernen Sie die Tool-Chain kennen, um Applikationen als standardisierte Deployment Units (Container-Images) bereitstellen zu können. Dies funktioniert sowohl lokal auf einem Entwicklungsrechner (z.B. Ihrem Laptop) als auch im Rahmen von Deployment Pipelines (d.h. in Remote Building Environments wie bspw. Gitlab CI/CD).
Die Standardisierung von Deployment Units in Form von Containern ist ein zentrales Merkmal der Entwicklung Cloud-nativer Anwendungen.
Die hier vorgestellten Prinzipien können Sie daher problemlos auf weitere Cloud-native Projekte übertragen.
## Inhalt
Die Standardisierung von Deployment Units in Form von Containern ist ein zentrales Merkmal der Entwicklung Cloud-nativer Anwendungen. Die hier vorgestellten Prinzipien können Sie daher problemlos auf weitere Cloud-native Projekte übertragen.
Sie werden in diesem Teil sehen, wie man Images baut. Häufig benötigt man Images für spezfische Dienste, wie bspw. Datenbanken, Webserver, usw. Hierfür bieten die Hersteller meist vorkonfigurierte Images an, die man nur noch mit einer kleinen Konfiguration (z.B. Access Credentials, Dateipfade, etc.) auf die spezifischen Bedürfnisse anpassen muss. Es lohnt sich hierzu öffentliche Image Repositories wie [Dockerhub](https://hub.docker.com) zu durchsuchen. Man kann aber auch Images auf Basis einer Standard Linux-Distribution aufsetzen. Sie werden beides am Beispiel eines kleinen Webservers sehen.
Klonen Sie sich bitte hierzu als Vorbereitung dieses Repository mittels:
### Aufgabe 02.1 HTTP-Service mittels eines NGINX-Basisimages
### Aufgabe 01.1 HTTP-Service mittels eines NGINX-Basisimages
1. Öffnen Sie nun bitte die Datei `Dockerfile.nginx` (diese ist recht übersichtlich, versuchen Sie diese zu verstehen und nachzuvollziehen)
2. Erzeugen Sie aus dieser nun das für Docker erforderliche Dockerfile mittels `cp Dockerfile.nginx Dockerfile`.
...
...
@@ -64,7 +61,7 @@ cd lab-containerization
Das war ja erstaunlich einfach.
### Aufgabe 03.2: HTTP-Service mittels eines generellen Basis-Images bauen
### Aufgabe 01.2: HTTP-Service mittels eines generellen Basis-Images bauen
In Fällen von weit verbreiteten Diensten und Produkten wie NGINX, Apache, Redis, Memcached, CouchDB, MySQL, usw. finden sich häufig solche Basisimages der entsprechenden Projekte. Diese kann man meist sehr schnell und unkompliziert aufsetzen und nutzen. Sie verlieren aber häufig auch etwas Kontrolle und Konfigurationsmöglichkeiten.
...
...
@@ -84,7 +81,7 @@ Wir wollen nun denselben Service mit einem anderen Image bauen, um diesen genere
5. Starten Sie dieses Image nun bitte mittels `docker run -p 8080:80 web:ubuntu`.
6. Prüfen Sie, ob Ihre Website ausgeliefert wird, in dem Sie [http://localhost:8080](http://localhost:8080) aufrufen. Sie sollten wieder dieselbe Webpage sehen, wie bereits im vorherigen Teil.
## Übung 03: Vergleich von Imagegrößen
## Übung 02: Image-Shrinking
Sie haben in Übung 02 einen einfachen Webserver samt Inhalt als Docker-Image erzeugt.
...
...
@@ -115,7 +112,7 @@ Sie sehen, Ihr selbst gebautes Ubuntu Image ist etwas größer. Das ist nicht wi
Die folgenden Aufgaben dienen dazu, Ihnen zu zeigen, was für Effekte diese drei Möglichkeiten auf die resultierenden Imagegrößen haben.
### Aufgabe 03.1: Unnötige Dateien löschen
### Aufgabe 02.1: Unnötige Dateien löschen
Wir gehen von unserem `web:ubuntu` Image aus.
...
...
@@ -126,7 +123,7 @@ Wir gehen von unserem `web:ubuntu` Image aus.
Sie sehen, dass dadurch Ihr Image bereits etwas kleiner geworden ist, aber noch größer als das NGINX-Image ist.
### Aufgabe 03.2: ImageLayer einsparen
### Aufgabe 02.2: Image-Layer einsparen
In Linux/UNIX Shells kann man, um zwei Kommandos nacheinander auszuführen, entweder dies
...
...
@@ -162,7 +159,7 @@ web ubuntu 8032bb56c82d 57 minutes ago
web nginx ca0547d1d208 14 hours ago 133MB
```
### Aufgabe 03.3: Kleinere BasisImages nutzen
### Aufgabe 02.3: Kleinere Basis-Images nutzen
Alle Images haben bislang Größen, die deutlich die 100 MB sprengen. Das ist zwar kleiner als viele VM-Images, aber immer noch recht groß, um ein paar HTML-Seiten von wenigen KBs auszuliefern.
...
...
@@ -210,7 +207,7 @@ docker run -p 8080:80 web:alpine-shrinked
und danach [http://localhost:8080](http://localhost:8080) aufrufen. Der erbrachte Dienst ist in allen Fällen derselbe.
## Übung 04: Push von einem Image in eine Registry
## Übung 03: Images in Registries bereitstellen
Bislang haben Sie Images lokal auf Ihrem Host erzeugt. Das ist für lokale Entwicklungszwecke meist vollkommen ausreichend. Aber Sie haben auch bereits gesehen, dass Images in Public oder Private Registries bereitgestellt werden können. Die bereits in diesem Lab von Ihnen genutzten NGINX, Ubuntu und Alpine Images sind bspw. aus dem öffentlichen [Dockerhub](https://hub.docker.com) bezogen worden (ohne das Sie dies vermutlich recht zur Kenntnis genommen haben).
...
...
@@ -245,7 +242,7 @@ __Hinweis:__ Dieser Teil kann auch mit dem Public [Gitlab.com](https://gitlab.co
Mittels dieser Tool-Chain lassen sich also Images in Registries zentral bereitstellen und für Deployments nutzen.
## Übung 05: Deployment-Pipeline zum Bau und Test eines Images
## Übung 04: Deployment-Pipeline zum Bau und Test eines Images
Dieser Teil soll Ihnen zeigen, wie Sie mittels einer Deployment Pipeline Images automatisiert bauen können. Gitlab Deployment Pipelines haben Sie ja bereits in einem vorherigen Lab kennengelernt.
...
...
@@ -265,7 +262,7 @@ Dieser Teil soll Ihnen zeigen, wie Sie mittels einer Deployment Pipeline Images
Auf diese Art und Weise können Sie nun auch automatisiert im Rahmen von Deployment Pipelines Images bauen und bereitstellen.
-[Docker Get Started](https://docs.docker.com/get-started/)
...
...
@@ -273,7 +270,7 @@ Auf diese Art und Weise können Sie nun auch automatisiert im Rahmen von Deploym
-[Best Practices for Writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
-[Building Docker images with GitLab CI/CD](https://docs.gitlab.com/ee/ci/docker/using_docker_build.html)
## Was sollten Sie mitnehmen ...
## Was sollten Sie mitnehmen
1. Mittels der den meisten Distributionen beiliegenden Package Managern ist es über `RUN`-Commands möglich in Basis-Images beliebige Software komfortabel und "non-interactive" zu installieren.
1. Eigener Code, Content oder Konfigurationen können mittels `ADD`-Commands dem Container-Image hinzugefügt werden (und danach mittels `RUN`-Commands auch kompiliert und installiert werden).