Commit d3c2b5a3 authored by Nane Kratzke's avatar Nane Kratzke
Browse files

Gliederung

parent ae97f391
# Lab 05: Containerization # Lab 05: Containerization
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). 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.
## Inhalt
- [Lab 05: Containerization](#lab-05-containerization) - [Lab 05: Containerization](#lab-05-containerization)
- [Inhalt](#inhalt) - [Inhalt](#inhalt)
- [Übung 01: Installation von Docker](#übung-01-installation-von-docker) - [Vorbereitung](#vorbereitung)
- [Übung 02: Erstellung von einem Image](#übung-02-erstellung-von-einem-image) - [Übung 01: Erstellung von einem Image](#übung-01-erstellung-von-einem-image)
- [Aufgabe 02.1 HTTP-Service mittels eines NGINX-Basisimages](#aufgabe-021-http-service-mittels-eines-nginx-basisimages) - [Aufgabe 01.1 HTTP-Service mittels eines NGINX-Basisimages](#aufgabe-011-http-service-mittels-eines-nginx-basisimages)
- [Aufgabe 03.2: HTTP-Service mittels eines generellen Basis-Images bauen](#aufgabe-032-http-service-mittels-eines-generellen-basis-images-bauen) - [Aufgabe 01.2: HTTP-Service mittels eines generellen Basis-Images bauen](#aufgabe-012-http-service-mittels-eines-generellen-basis-images-bauen)
- [Übung 03: Vergleich von Imagegrößen](#übung-03-vergleich-von-imagegrößen) - [Übung 02: Image-Shrinking](#übung-02-image-shrinking)
- [Aufgabe 03.1: Unnötige Dateien löschen](#aufgabe-031-unnötige-dateien-löschen) - [Aufgabe 02.1: Unnötige Dateien löschen](#aufgabe-021-unnötige-dateien-löschen)
- [Aufgabe 03.2: Image Layer einsparen](#aufgabe-032-image-layer-einsparen) - [Aufgabe 02.2: Image-Layer einsparen](#aufgabe-022-image-layer-einsparen)
- [Aufgabe 03.3: Kleinere Basis Images nutzen](#aufgabe-033-kleinere-basis-images-nutzen) - [Aufgabe 02.3: Kleinere Basis-Images nutzen](#aufgabe-023-kleinere-basis-images-nutzen)
- [Übung 04: Push von einem Image in eine Registry](#übung-04-push-von-einem-image-in-eine-registry) - [Übung 03: Images in Registries bereitstellen](#übung-03-images-in-registries-bereitstellen)
- [Übung 05: Deployment-Pipeline zum Bau und Test eines Images](#übung-05-deployment-pipeline-zum-bau-und-test-eines-images) - [Übung 04: Deployment-Pipeline zum Bau und Test eines Images](#übung-04-deployment-pipeline-zum-bau-und-test-eines-images)
- [Quellen und Referenzen](#quellen-und-referenzen) - [Links](#links)
- [Was sollten Sie mitnehmen ...](#was-sollten-sie-mitnehmen-) - [Was sollten Sie mitnehmen](#was-sollten-sie-mitnehmen)
## Übung 01: Installation von Docker ## Vorbereitung
- [Installieren](https://docs.docker.com/engine/install/) Sie gem. den verlinkten Anweisungen Docker für Ihr System: - [Installieren](https://docs.docker.com/engine/install/) Sie gem. den verlinkten Anweisungen Docker für Ihr System:
- [Mac](https://www.docker.com/products/docker-desktop) - [Mac](https://www.docker.com/products/docker-desktop)
...@@ -35,19 +34,17 @@ Die hier vorgestellten Prinzipien können Sie daher problemlos auf weitere Cloud ...@@ -35,19 +34,17 @@ Die hier vorgestellten Prinzipien können Sie daher problemlos auf weitere Cloud
``` ```
Docker version 19.03.8, build afacb8b Docker version 19.03.8, build afacb8b
``` ```
- Klonen Sie sich bitte ferner als Vorbereitung dieses Repository mittels:
```
git clone https://git.mylab.th-luebeck.de/cloud-native/lab-containerization.git
cd lab-containerization
```
## Übung 02: Erstellung von einem Image ## Übung 01: Erstellung von einem Image
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. 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 01.1 HTTP-Service mittels eines NGINX-Basisimages
```
git clone https://git.mylab.th-luebeck.de/cloud-native/lab-containerization.git
cd lab-containerization
```
### Aufgabe 02.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) 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`. 2. Erzeugen Sie aus dieser nun das für Docker erforderliche Dockerfile mittels `cp Dockerfile.nginx Dockerfile`.
...@@ -64,7 +61,7 @@ cd lab-containerization ...@@ -64,7 +61,7 @@ cd lab-containerization
Das war ja erstaunlich einfach. 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. 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 ...@@ -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`. 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. 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. 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 ...@@ -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. 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. Wir gehen von unserem `web:ubuntu` Image aus.
...@@ -126,7 +123,7 @@ 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. Sie sehen, dass dadurch Ihr Image bereits etwas kleiner geworden ist, aber noch größer als das NGINX-Image ist.
### Aufgabe 03.2: Image Layer einsparen ### Aufgabe 02.2: Image-Layer einsparen
In Linux/UNIX Shells kann man, um zwei Kommandos nacheinander auszuführen, entweder dies In Linux/UNIX Shells kann man, um zwei Kommandos nacheinander auszuführen, entweder dies
...@@ -162,7 +159,7 @@ web ubuntu 8032bb56c82d 57 minutes ago ...@@ -162,7 +159,7 @@ web ubuntu 8032bb56c82d 57 minutes ago
web nginx ca0547d1d208 14 hours ago 133MB web nginx ca0547d1d208 14 hours ago 133MB
``` ```
### Aufgabe 03.3: Kleinere Basis Images 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. 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 ...@@ -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. 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). 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 ...@@ -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. 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. 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 ...@@ -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. Auf diese Art und Weise können Sie nun auch automatisiert im Rahmen von Deployment Pipelines Images bauen und bereitstellen.
## Quellen und Referenzen ## Links
- [Docker Playground](https://labs.play-with-docker.com/) (Online Lab, Registration erforderlich) - [Docker Playground](https://labs.play-with-docker.com/) (Online Lab, Registration erforderlich)
- [Docker Get Started](https://docs.docker.com/get-started/) - [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 ...@@ -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/) - [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) - [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. 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). 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).
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment